JavaScript中如何为对象分配数组的内在数组属性?
问题:能否仅复制数组的“内在元素”到其他对象?
我已经找到了解决当前问题的替代方案,但还是忍不住向资深开发者们提出这个进阶问题!在JavaScript中,除原始类型外几乎所有事物都是对象,数组也不例外,因此我们可以为数组添加属性。
var arr = []; arr[1] = 42; arr[5] = 666; arr.firstName = 'ebenezer'; arr.lastName = 'scrooge'; var arr2 = []; arr2.firstName = 'daffy'; arr2.lastName = 'duck'; var obj2 = {}; obj2.firstName = 'smokey'; obj2.lastName = 'bear';
我把arr里的数组元素部分称为“内在数组”,比如:
arr[1] // 返回42
我的问题是:能不能只把内在数组(也就是数组的所有索引元素,不包含其他自定义属性)分配给其他对象?比如像下面这样:
arr2.arrayProp (??类似这样的写法??) = arr[]; arr2[1] // 希望返回42 arr2.firstName // 希望返回'daffy' obj2[](??类似这样的写法??) = arr[]; obj2[1] // 希望返回42 obj2.firstName // 希望返回'smokey'
显然,直接分配整个数组或对象只会创建对原对象及其所有属性的引用。我想知道有没有什么底层方法能只分配数组的内在元素部分,原以为答案是“不能”,但还是希望能有惊喜。
编辑补充
经过讨论后我有了清晰的认知,已将最佳答案授予@HauWu。
我的问题核心取决于以下测试结果:
给定代码:
arr[1] = 'intIndex'; arr['1'] = 'strIndex'; console.log(arr[1], arr['1']);
会得到哪种结果?
A: intIndex strIndex 或 B: strIndex strIndex
结果是B,此前我一直误以为是A,这源于我对JavaScript数组的误解。
查阅Array文档后发现,数组对象不能使用任意字符串作为元素索引,必须使用非负整数(或其对应的字符串形式)。非整数的索引操作只会访问对象的属性集合,而非数组元素。我此前忽略了“或其对应的字符串形式”这部分内容,误以为数组元素和对象属性是完全分离的存储结构。
进一步查阅规范,数组被归类为奇异对象(exotic object),会对整数等效键进行特殊处理,内部通过CanonicalNumericIndexString和ToIndex来解析整数等效键。
最终总结
- JavaScript中的数组元素是以整数索引的字符串形式作为键的对象属性;
- JavaScript会针对数组查找性能进行优化,可能会构建内部的经典内存查找数组,但这属于实现相关的优化,并非规范要求。
回到最初的问题:无法通过单一赋值操作复制数组的内在元素,因为它们本质上就是对象属性,只能采用变通方案实现需求。
有趣的JavaScript代码示例
var foo = { toString: function() { return "hello"; } }; var hi = { hello: "hola" }; hi[foo]; // 返回“hola”
var A=[]; A[NaN]="notanumerbery"; console.log(A[parseInt(":P")]); // notanumerbery
内容的提问来源于stack exchange,提问作者Ben McIntyre
相关产品推荐
相关产品推荐

