JavaScript数组赋值引用及理解

今天看到一道前端js面试题,加深了我对数组的一些理解。


var arr1 = 'edison'.split('');

var arr2 = arr1.reverse();

var arr3 = 'chan'.split('');

arr2.push(arr3);

console.log('arr1:length='+arr1.length+'  last='+arr1.slice(-1));

console.log('arr2:length='+arr2.length+'  last='+arr2.slice(-1));

一开始我的答案是

arr1:length=6 last='e'(错的)

arr2:length=7 last='c','h','a','n'

但是我错了。。。,因为答案如下:

arr1:length=7  last=c,h,a,n

 arr2:length=7  last=c,h,a,n

我一开始很疑惑,因为我理解的是将数组的变量赋值跟js基础类型的赋值一样,将一个数组变量赋值给另一个变量!!!!。所以导致我arr1的结果出错。

因为实际正确的是将这两个变量指向内存堆中的同一个数组(浅拷贝),无论通过改变其中哪一个变量,实际都是改的内存中的那一个数组!!!


之所以我的结果错了,是因为我的理解是将arr1的值copy给了arr2,如图:


错的理解

于是,我看到了这样一段代码~~~,瞬间理解加深!!!

var a=['q','w','e','r'];

var b=a;

a=['a','s','d','f'];

console.log(b);

有的同学没太理解的或者看了我之前的理解的,可能会以为 b应该可能会是['a','s','d','f'],但是错了!!!


结果诧异!!!

但是如果对数组比较理解的同学就嗤之以鼻了,,,,这不如同制仗一般吗? 毋庸置疑的嘛。没错



这里的a 是在内存中重新开辟了一个内存空间来存放'a','s','d','f',并将a指向它,所以一旦数组出现 [  ]  ,我们就要注意了,相当于是 a是又创建一个数组并赋值了,它就会在内存队中开辟新的空间,哪怕它以前再辉煌,他也只看现在,活在当下,从此a,b不再是一路人!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 5,591评论 0 7
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile丽语阅读 4,052评论 0 6
  • 本文为转载: 作者:zyydeveloper 链接:http://www.jianshu.com/p/5f776a...
    Buddha_like阅读 1,002评论 0 2
  • 故乡小村的时光时不时在记忆中闪烁着,回想起来仍然记忆犹新。 在故乡街口,路边种着绿树,路边停放着...
    木子_1a77阅读 237评论 0 0
  • 夏夜里说一句晚安 小人家式开头,但今天更新的人是汤!! 小人家这几天在遥远的北方,如果想她请在后台回复「想她」。然...
    每颗橙子阅读 199评论 0 0

友情链接更多精彩内容