var array = [1,2,3,4,5];
var arrayRef = array;
array.push(6);
print(arrayRef);
引用指向的是地址,也就是说,引用不会指向引用本身,而是指向该引用所对应的实际对象。因此通过修改array指向的数组,则arrayRef指向的是同一个对象,因此运行效果如下:
1,2,3,4,5,6
2.2.2变量的作用域
变量被定义的区域即为其作用域,全局变量具有全局作用域;局部变量,比如声明在函数内部的变量则具有局部作用域,在函数的外部是不能直接访问的。比如:
复制代码 代码如下:
var variable = "out";
function func(){
var variable = "in";
print(variable);//打印”in”
}
func();
print(variable);//打印”out”
应该注意的是,在函数内var关键字是必须的,如果使用了变量而没有写var关键字,则默认的操作是对全局对象的,比如:
复制代码 代码如下:
var variable = "out";
function func(){
variable = "in";//注意此variable前没有var关键字
print(variable);
}
func();
print(variable);//全局的变量variable被修改
由于函数func中使用variable而没有关键字var,则默认是对全局对象variable属性做的操作(修改variable的值为in),因此此段代码会打印:
in
in
2.3运算符
运算符,通常是容易被忽略的一个内容,但是一些比较古怪的语法现象仍然可能需要用到运算符的结合率或者其作用来进行解释,JavaScript中,运算符是一定需要注意的地方,有很多具有JS编程经验的人仍然免不了被搞得晕头转向。
我们在这一节主要讲解这样几个运算符:
2.3.1中括号运算符([])
[]运算符可用在数组对象和对象上,从数组中按下标取值:
复制代码 代码如下:
var array = ["one", "two", "three", "four"];
array[0]
而[]同样可以作用于对象,一般而言,对象中的属性的值是通过点(.)运算符来取值,如:
复制代码 代码如下:
var object = {
field : "self",
printInfo : function(){
print(this.field);
}
}
object.field;
object.printInfo();
但是考虑到这样一种情况,我们在遍历一个对象的时候,对其中的属性的键(key)是一无所知的,我们怎么通过点(.)来访问呢?这时候我们就可以使用[]运算符:
复制代码 代码如下:
for(var key in object){
print(key + ":" + object[key]);
}
运行结果如下:
field:slef
printInfo:function (){
print(this.field);
}
2.3.2点运算符(.)
点运算符的左边为一个对象(属性的集合),右边为属性名,应该注意的是右边的值除了作为左边的对象的属性外,同时还可能是它自己的右边的值的对象:
复制代码 代码如下:
var object = {
field : "self",
printInfo : function(){
print(this.field);
},
outter:{
inner : "inner text",
printInnerText : function(){
print(this.inner);
}
}
}
object.outter.printInnerText();
这个例子中,outter作为object的属性,同时又是printInnerText()的对象。
2.3.3 == 和 === 以及 != 和 !==
运算符==读作相等,而运算符===则读作等同。这两种运算符操作都是在JavaScript代码中经常见到的,但是意义则不完全相同,简而言之,相等操作符会对两边的操作数做类型转换,而等同则不会。我们还是通过例子来说明:
print(1 == true);
print(1 === true);
print("" == false);
print("" === false);
print(null == undefined);
print(null === undefined);
运行结果如下:
复制代码 代码如下:
true
false
true
false
true
false
相等和等同运算符的规则分别如下:
相等运算符
如果操作数具有相同的类型,则判断其等同性,如果两个操作数的值相等,则返回true(相等),否则返回false(不相等).
如果操作数的类型不同,则按照这样的情况来判断:
◆ null和undefined相等
◆ 其中一个是数字,另一个是字符串,则将字符串转换为数字,在做比较
◆ 其中一个是true,先转换成1(false则转换为0)在做比较
◆ 如果一个值是对象,另一个是数字/字符串,则将对象转换为原始值(通过toString()或者valueOf()方法)
◆ 其他情况,则直接返回false
等同运算符
如果操作数的类型不同,则不进行值的判断,直接返回false
如果操作数的类型相同,分下列情况来判断:
◆ 都是数字的情况,如果值相同,则两者等同(有一个例外,就是NaN,NaN与其本身也不相等),否则不等同
◆ 都是字符串的情况,与其他程序设计语言一样,如果串的值不等,则不等同,否则等同
◆ 都是布尔值,且值均为true/false,则等同,否则不等同
◆ 如果两个操作数引用同一个对象(数组,函数),则两者完全等同,否则不等同
◆ 如果两个操作数均为null/undefined,则等同,否则不等同
比如:
复制代码 代码如下: