请考虑以下示例:
var ar = [4, 2, 3];
ar.$x = 'something';
var br = angular.copy(ar);
console.dir(br);
br
不再具有$x
属性,因为在复制数组时,angular会使用for (;;;)
进行迭代,但不会看到自定义属性(如果它使用for in
进行迭代,那么它会起作用。)
我应该做以下哪一项?
答案 0 :(得分:5)
试试angular.merge() 这是一个包含可枚举属性的深层副本。
var ar = [4, 2, 3];
ar.$x = 'something';
var br = angular.merge([], ar);
console.dir(br);
输出
Array[3]
0: 4
1: 2
2: 3
$x: "something"
length: 3
__proto__: Array[0]
答案 1 :(得分:2)
我认为这不是一个角度问题。如果你这样说的话:
ar.$x = 'something';
console.log(Object.prototype.toString.call(ar));
您将看到将记录[object Array]
。这就是Array.isArray()
方法的工作原理,反过来,这就是角copy()
方法如何决定如何遍历作为参数传递的实体。这种检测至关重要,因为阵列上的for ... in
循环可能会在其他情况下产生一些混淆。这里描述了原因:Why is using "for...in" with array iteration a bad idea?
对于这种特殊情况,我建议您更改代码。
答案 2 :(得分:1)
尝试使用jQuery:
jQuery.extend([],ar);
var ar = [4, 2, 3];
ar.$x = 'something';
var br = jQuery.extend([], ar);
console.dir(br);