Javascript数组中的按值传递
2017-02-03 23:20
204 查看
var a = [1,2,3,4,5,6];
var b = a;
a = [“你”,”我”,”他”];
alert(b); //[1,2,3,4,5,6]
当被朋友问到b显示的值是什么时?这样一个问题,当时直接的理解,数组是引用类型,应该是传递的是引用值,so b也是[“你”,”我”,”他”],于是错了。js数组传递是跟基本类型一样创建副本吗?
于是,我又做了如下测试:
var a = [1,2,3,4,5,6];
var b = a;
a.length–;
alert(b); // [1,2,3,4,5];
这样好像又是引用传递了? 晕了!!!
后面反复思考推敲,原理如下:
a = [“你”,”我”,”他”];//改变的是a引用本身,没有改变数组对象
a.length–;//改变的是数组对象,a引用没有改变
b = a;//该操作后,b直接指向数组对象,不是b指向a,a再指向数组。
//所以改变a引用并不会对b引用造成影响,改变数组对象可以。
图示:
例如:
1.var a = [1,2,3,4,5,6];
2.var b = a;
3.a = [“你”,”我”,”他”];
4.console.log(b);
此时b为多少呢?
b = [1,2,3,4,5,6];
为什么此处a的改变不会是b发生变化?关键问题是第3行语句的理解。
首先第一行,a引用数组[1,2,3,4,5,6],不妨先假设数组[1,2,3,4,5,6]地址为A或0x1001(内存随机分配的);
第二行,var b = a;应理解为,b引用了a当前的指向地址,即b指向地址A,即数组[1,2,3,4,5,6]。
第三行,a = [“你”,”我”,”他”];为修改a的指向地址,使a指向数组 [“你”,”我”,”他”],不妨设其地址为B或0x1009。
所以,最终结果为,b指向地址A,数组[1,2,3,4,5,6],a指向地址B,数组 [“你”,”我”,”他”];
其实,只要理解清楚,对数组变量的操作,实质为修改数组本身数据,还是修改变量的地址,则将一目了然。
举个例子:
arr = [1,2,3,4];
arr.pop();//此处操作为修改arr指向的数组本身。结果为arr = [1,2,3];
//a.pop(); <=> a.length–;
//pop() 方法将删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值。如果数组已经为空,则 pop() 不改变数组,并返回 undefined 值。
newArr = arr;//此处操作为赋予newArr指向arr所指向的地址,即数组[1,2,3]。
arr = [4,5,6];//此处操作为使arr指向新数组[4,5,6],arr指向新数组地址。
console.log(arr);//此处arr = [4,5,6]
console.log(newArr);//newArr = [1,2,3];
最后,一言以蔽之,关于数组变量的操作,应关注变量所指向地址的数组,以及操作所修改的为哪个地址的数组。
var b = a;
a = [“你”,”我”,”他”];
alert(b); //[1,2,3,4,5,6]
当被朋友问到b显示的值是什么时?这样一个问题,当时直接的理解,数组是引用类型,应该是传递的是引用值,so b也是[“你”,”我”,”他”],于是错了。js数组传递是跟基本类型一样创建副本吗?
于是,我又做了如下测试:
var a = [1,2,3,4,5,6];
var b = a;
a.length–;
alert(b); // [1,2,3,4,5];
这样好像又是引用传递了? 晕了!!!
后面反复思考推敲,原理如下:
a = [“你”,”我”,”他”];//改变的是a引用本身,没有改变数组对象
a.length–;//改变的是数组对象,a引用没有改变
b = a;//该操作后,b直接指向数组对象,不是b指向a,a再指向数组。
//所以改变a引用并不会对b引用造成影响,改变数组对象可以。
图示:
例如:
1.var a = [1,2,3,4,5,6];
2.var b = a;
3.a = [“你”,”我”,”他”];
4.console.log(b);
此时b为多少呢?
b = [1,2,3,4,5,6];
为什么此处a的改变不会是b发生变化?关键问题是第3行语句的理解。
首先第一行,a引用数组[1,2,3,4,5,6],不妨先假设数组[1,2,3,4,5,6]地址为A或0x1001(内存随机分配的);
第二行,var b = a;应理解为,b引用了a当前的指向地址,即b指向地址A,即数组[1,2,3,4,5,6]。
第三行,a = [“你”,”我”,”他”];为修改a的指向地址,使a指向数组 [“你”,”我”,”他”],不妨设其地址为B或0x1009。
所以,最终结果为,b指向地址A,数组[1,2,3,4,5,6],a指向地址B,数组 [“你”,”我”,”他”];
其实,只要理解清楚,对数组变量的操作,实质为修改数组本身数据,还是修改变量的地址,则将一目了然。
举个例子:
arr = [1,2,3,4];
arr.pop();//此处操作为修改arr指向的数组本身。结果为arr = [1,2,3];
//a.pop(); <=> a.length–;
//pop() 方法将删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值。如果数组已经为空,则 pop() 不改变数组,并返回 undefined 值。
newArr = arr;//此处操作为赋予newArr指向arr所指向的地址,即数组[1,2,3]。
arr = [4,5,6];//此处操作为使arr指向新数组[4,5,6],arr指向新数组地址。
console.log(arr);//此处arr = [4,5,6]
console.log(newArr);//newArr = [1,2,3];
最后,一言以蔽之,关于数组变量的操作,应关注变量所指向地址的数组,以及操作所修改的为哪个地址的数组。
相关文章推荐
- 把javascript,vbscript中得数组传递给COM组件(or Activex)
- 把javascript,vbscript中得数组传递给COM组件(or Act
- javascript数组与php数组的地址传递及值传递用法实例
- 如何将php数组或者对象传递给javascript
- php实现向javascript传递数组的方法
- 如何将服务器端计算出的数组传递到客户端的JavaScript?
- Javascript小知识点(七):数据类型赋值,浅拷贝,深拷贝(数组值传递还是引用传递)
- php和javascript交互:传递数组
- 如何将php数组或者对象传递给javascript
- javascript基础:函数传递参数的方式、参数数组、变量范围(变量作用域)
- PHP和Javascript传递数组参数的方法
- 将PHP数组或对象传递给javascript 交互 传值 json_encode
- PHP和JavaScript传递数组并使用dtree.js生成树
- php和javascript交互:传递数组
- 把javascript,vbscript中得数组传递给COM组件(or Activex)
- php向javascript传递数组
- 关于javascript数组与VB DLL中中数组的传递问题
- PHP和JavaScript之间的数组传递(转)
- JSP 向 JavaScript 中传递数组
- javascript 向servlet传递数组数据