1: 函数,解释不会检查参数的个数,只需用argument[0],argument[1]...来引用就行。
function first(){
alert("hello" + argument[0] + argument[1]);
}
first("world","me");
因为上面的原因,所以Javascript就没有重载现象。
2:只支持值传递
基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置
引用类型值指的是那些保存在堆内存中的对象,意思是变量中保存的实际上只是一个指针,指向内存中的另一位置。
所以说我们在栈中既保存基本类型值,他们占据固定大小的空间,可以顺序访问;同时可以保存一块内存的地址,一个指向堆内存中位置的指针,而保存在堆内存中的数据不是按顺序访问的,因为每个对象所需要的内存空间并不相等。
5种基本数据类型:undefined,null,boolean,number,string他们都是在栈中占据固定大小。
在进行参数赋值或者实参赋值的时候,他们都是值传递,也就是在栈内存中会有一个值的副本,只是当你传给它的是一个对象的时候,因为值传递你把对象的值传给它,也就时传给它了指向堆中空间的地址。所以这个时候的改变可以影响到对象,其他比如基本数据类型了,都是互不相干,值相同而已。
typeof s 如果是string就返回string,但是如果s的值是Null的话,他就返回一个object
person instanceof object 如果person是object对象就返回真
没有块级作用域
比如下面的形式,正常情况下在if结束以后就不能反问到color了,但是在这里我们仍然能够访问到,同样需要注意的是for循环语句for(int i =0; i<5; i++)中的形式。注意不要跟function中的局部变量搞混了。
if (true){
var color = "blue";
}
alert(color); //"blue"
函数声明与函数表达式
解释器在加载数据的时候会先读取函数声明,也就是编译出二进制代码;而函数表达式必须等到解释器执行它所在的代码行,才会对它进行解释,所以如下
//可以正常运行
alert(sum(10,10));
function sum(num1, num2){ //在代码执行之前就加载到作用域中
return num1 + num2;
}
//没有函数名,因为你可以用sum访问到,并且最后别忘了有分号。
alert(sum(10, 10)); //会报错,因为sum还没有被解释出来
var sum = function(num1, num2){
return num1 + num2;
};
函数名仅仅是一个指针而已,它里面保存的是函数的位置,所以我们可以把它赋给另一个变量,这样新变量同样指向了函数。
window.color = "red";
var o = {color: "blue"};
function saycolor(){
alter(this.color);
}
saycolor(); //red 引用全局变量color
o.saycolor = saycolor; //对象o新建一个属性叫saycolor方法
o.saycolor(); //调用当前对象o的这个方法,所以返回blue
函数的属性和方法
1:this 是函数在执行时所处的作用域(在网页的全局作用域中调用函数时,this对象引用的就是window)
2:arguments 包含函数中的所有参数,它有一个callee属性,该属性是一个指针,用于指向拥有这个arguments对象的函数。
function factorial(n){
if(n <= 1){
return 1;
} else{
return n * factorial(n-1);
}
}
var f = factorial;
alert(factorial(5)); //120
alert(f(5)); //0,因为现在函数里面调用的还是factorial的对象
return n * arguments.callee(n-1); //解决办法
3:每个函数都包含两个非继承而来的方法:apply()和call()。主要用途现在你定义了一个方法f,里面然后你想对对象o也调用这个方法,这个就是一个解决的途径。其实我感觉凡是调用call()的方法,里面的实现肯定是利用this,对当前对象进行处理,否则假设你都是一些类似参数s,根本不牵涉到this的引用,那你还让我们给你传递一个对象干啥。如果对象有this引用的属性的话,就用o的,如果没有就相当与给o新建了这个属性
window.color = "red";
var o ={color:"blue"};
function saycolor(s){
alert(this.color + s );
}
saycolor(); //上面已经说了,看函数所在的作用域,现在是网页中的全局,故是red
saycolor.call(o, " car"); //"blue car"对对象o调用saycolor方法,现在的this就是o中值
基本包装类型
因为我们前面也说了5个基本数据类型,不是对象,但是我们平常有需要对这些基本数据类型进行操作,比方说string.substring(2),本来都是对象才有方法的。现在我们平常如何能够正常使用呢?
实际上每当读取一个基本数据类型的时候,后台都会创建一个对应的基本包装类型的对象。然后用这个对象调用方法,然后再删掉这个对象。这种方式主要用于string,number,boolean值
Number
parseInt()/parseFloat(),如果参数为空字符串,或则字符串的开始字符不是数字时,它将会返回一个NaN(not a number)值.
var num = 10;
alert(num.tostring(2)); //返回字符串"1010",2表示基数参数,默认是十进制
alert(num.toFixed(2)); //返回字符串"10.00",2表示显示几位小数,常用于货币之类的运算
alert(num.toExponential(1)); //返回字符串"1.0e+1",返回指数表示法,1表示小数位数
String 方法
var s= "hello world";
alert(s.charAt(1)); //"e"
alert(s.charCodeAt(1)); //"101"
fromCharCode() //字符编码转换成字符串
s.length(); //11
var s1=s.concat("!"); //s1="hello world!"而s="hello world"也就是说改副本
s1 = s + "!"; //比concat简便并且常用,结果是一样的,改副本
alert(s.slice(3,7)); //"lo w"第一个是起始位置,第二个结束位置
alert(s.substring(3,7)); //"lo w"跟slice等价
alert(s.substr(3,7)); //"lo worl"第二个参数指定的是输出的个数
alert(s.indexof("o")); //4 从前开始,o的下标
alert(s.lastindexof("o")); //7 从后开始,o的下标,既然是下标了,所以如果只有一个时它跟上面结果一样
alert(s.indexof("o", 6)); //7 第二个参数指定起始位置
alert(s.lastindexof("o", 6)); //4
alert(s.toUpperCase()); //"HELLO WORLD",是一个副本的值,原值不变
alert(s.toLowerCase()); //"hello world"
Math:
Math.cei() 向上舍如
Math.floor() 向下舍入
Math.round() 标准四舍五入,当时当Math.round(25.5)返回值26
Math.random()返回一个0到1之间的随机数,它常于Math.floor连用,因为它是向下舍入
var a = Math.floor(Math.random() * 10 + 1); // 返回一个介于1到10之间的数
Math.abs(n); //返回绝对值
Math.exp(n); //返回E的n次幂
Math.log(n); //返回n的自然对数
Math.pow(n,p); //返回n的p次幂
Math.sqrt(n); //返回n的平方根
Math.acos(x); //返回x的反余弦值
Math.asin(x); //返回x的反正弦值
Math.atan(x); //返回x的反正切值
Math.atan2(y,x); //返回y/x的反正切值
Math.cos(x);
Math.sin(x);
Math.tan(x);