84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
详看代码:
var numbers = [4, 2, 5, 1, 3], n1 = numbers, n2 = numbers; n1.sort(function(a, b) { return a - b; }); console.log(numbers,n1,n2);//结果都是[1,2,3,4,5]
谁能否给解释一下原理,另外怎样能够复制数组sort()之后不影响原数组?
进行对象赋值的时候,赋值的是对象的引用。可以copy一个对象实现。
var numbers = [4, 2, 5, 1, 3], n1 = numbers.slice(0), n2 = numbers; n1.sort(function(a, b) { return a - b; }); console.log(numbers,n1,n2);
这里n2和numbers还是一个对象,但n1是另一个对象,只是对象的内容一样而已。
var numbers = [4, 2, 5, 1, 3], n1 = numbers.slice(0), n2 = numbers; n2 == numbers //true n1 == numbers //false
你传递的是引用
http://stackoverflow.com/questions/7486085/copying-array-by-value-in-javascript
原因是n1,n2都是numbers的引用,显然sort方法改变了引用数组。如果你需要保存原数组,最好的方法就要复制一份
var numbers = [4, 2, 5, 1, 3] var numbers2 = [] for(var i=0;i<numbers.length;i++){ numbers2[i] = numbers[i] } numbers.sort(function(a, b) { return a - b; }); console.log(numbers,numbers2);
因为数组是对象,所以赋值是数据引用类型,所以改变会影响到原来的变量的值。 如果想不影响原先的数组,可以复制数组传递给新变量,这样改变新变量就不会影响到原来的变量的值。
var numbers = [4, 2, 5, 1, 3]; var f=[]; for(var i=0;i<numbers.length;i++){ f[i]=numbers[i]; } n1=f;
js的数组和普通的"a linear collection of elements"不同,他其实是对象,对应访问数组的索引其实是对象的属性,你的方式很明显是shallow copy,所以引用指向未变; 解决方案:deep copy一份就好了
这就是PHP程序猿最容易弄混淆的地方 —— PHP中的array默认是传值的,据说采用了写时复制的技巧,所以在PHP中类似的代码n1排序后n2和numbers是不会变的 —— 然而JS中array是个对象,是按引用传递的! 偶也曾犯过类似的错误,写PHP多了,就容易忘记其他语言中array是传引用。 额,据初步统计,除了JavaScript,像C,C++, C#, Python, Java和Ruby中的数组都是传引用,而传值的目前偶只晓得有PHP —— PHP果然是“世界上最好的语言”
进行对象赋值的时候,赋值的是对象的引用。可以copy一个对象实现。
这里n2和numbers还是一个对象,但n1是另一个对象,只是对象的内容一样而已。
你传递的是引用
http://stackoverflow.com/questions/7486085/copying-array-by-value-in-javascript
原因是n1,n2都是numbers的引用,显然sort方法改变了引用数组。如果你需要保存原数组,最好的方法就要复制一份
因为数组是对象,所以赋值是数据引用类型,所以改变会影响到原来的变量的值。
如果想不影响原先的数组,可以复制数组传递给新变量,这样改变新变量就不会影响到原来的变量的值。
js的数组和普通的"a linear collection of elements"不同,他其实是对象,对应访问数组的索引其实是对象的属性,你的方式很明显是shallow copy,所以引用指向未变;
解决方案:deep copy一份就好了
这就是PHP程序猿最容易弄混淆的地方 —— PHP中的array默认是传值的,据说采用了写时复制的技巧,所以在PHP中类似的代码n1排序后n2和numbers是不会变的 —— 然而JS中array是个对象,是按引用传递的!
偶也曾犯过类似的错误,写PHP多了,就容易忘记其他语言中array是传引用。
额,据初步统计,除了JavaScript,像C,C++, C#, Python, Java和Ruby中的数组都是传引用,而传值的目前偶只晓得有PHP —— PHP果然是“世界上最好的语言”