You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:48:24