在JS中,变量是值传递,而数组是引用传递。
举例如下:
//变量的赋值传递
var a = 2; //变量
var b = a;
var b = a;
a = 3;
alert(b); //结果b=2
alert(b); //结果b=2
//数组的赋值传递
var a = [1,2,3]; //数组
var b = a;
b [0] = 5;
alert(a); //结果a=[5,2,3]
var b = a;
b [0] = 5;
alert(a); //结果a=[5,2,3]
以上是比较常见的简单JS语法,但在面试时可能会遇到一些更加细腻并且容易出错的问题。
举例如下:
var
a
=
[
1
,
2
,
3
]; //数组
var b = a;
var b = a;
a
=
[
4
,
5
,
6
]; //改变的是引用
alert(b);
//结果[1,2,3]
应该有很多同学会这样想:因为
数组是引用类型,应该是传递的是引用,所以 b也是[4,5,6],于是错了
。
正确答案是b=[1,2,3]。这是为什么吗?
首先强调一点概念:
数组名存放的内容是地址(在C语言中数组名就是一个地址,指向数组的第一个元素)
现在来详细的解读上面的程序:
var a= [1,2,3]; //定义一个数组并赋值,此时a 指向[1,2,3]数组对象
var b = a; //因为a是数组名,表示的是地址。将a的地址付给b,此时b也指向[1,2,3]数组对象
a = [4,5,6]; //此时a指向数组对象[4,5,6],改变的是a的指向对象,并没有改变[1,2,3]数组对象本身
看到这里,之前有疑惑的同学应该豁然开朗了吧。,再补充一题让大家更充分的理解。
var a = [1,2,3];
var b = a;
a.pop(); //pop()方法 :删除数组对象的最后一个元素 这里是直接改变的数组对象[1,2,3]
alert(b); //结果b=[1,2]