84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
详看代码:
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果然是“世界上最好的语言”