Page 124 - 你不知道的JavaScript(上卷)
P. 124
数组也是对象,所以虽然每个下标都是整数,你仍然可以给数组添加属性:
var myArray = [ "foo", 42, "bar" ];
myArray.baz = "baz";
myArray.length; // 3
myArray.baz; // "baz"
可以看到虽然添加了命名属性(无论是通过 . 语法还是 [] 语法),数组的 length 值并未发
生变化。
你完全可以把数组当作一个普通的键 / 值对象来使用,并且不添加任何数值索引,但是这
并不是一个好主意。数组和普通的对象都根据其对应的行为和用途进行了优化,所以最好
只用对象来存储键 / 值对,只用数组来存储数值下标 / 值对。
注意:如果你试图向数组添加一个属性,但是属性名“看起来”像一个数字,那它会变成
一个数值下标(因此会修改数组的内容而不是添加一个属性):
var myArray = [ "foo", 42, "bar" ];
myArray["3"] = "baz";
myArray.length; // 4
myArray[3]; // "baz"
3.3.4 复制对象
JavaScript 初学者最常见的问题之一就是如何复制一个对象。看起来应该有一个内置的 copy()
方法,是吧?实际上事情比你想象的更复杂,因为我们无法选择一个默认的复制算法。
举例来说,思考一下这个对象:
function anotherFunction() { /*..*/ }
var anotherObject = {
c: true
};
var anotherArray = [];
var myObject = {
a: 2,
b: anotherObject, // 引用,不是复本!
c: anotherArray, // 另一个引用!
d: anotherFunction
};
对象 | 109