用作混合数据结构的 JavaScript 对象

标签 javascript

我相当了解 JavaScript 和初始化数据结构时使用的原型(prototype)继承,但我仍然不完全确定 JS 的独特功能之一是如何工作的。

假设我创建了一个数组:

var myArr = [];

我现在可以将项目推送到数组:

myArr.push('foo');
myArr.push('bar');

此时myArr.length == 2

现在我可以做类似的事情

myArr['myProp'] = 5; // OR myArr.myProp = 5;

但是我的 myArr.length 仍然等于 2,我可以使用某种类型的迭代方法来迭代最初推送的 2 个值。

所以基本上这个对象是一个“混合”数据结构,可以像数组或对象一样对待。

所以我的问题是原生对象语法(myObj.someProperty = 'blah'myObj['someProperty'] = 'blah')是否专门适用于Object.prototype 以及从该原型(prototype)继承的任何对象?这是有道理的,因为对象的原型(prototype)链看起来像:

var myObj = {} -> Object.prototype -> null

数组的原型(prototype)链如下所示:

var myArr = [] -> Array.prototype -> Object.prototype -> null

这让我假设您可以用对象 (myObj.someProperty//as getter or setter) 做的任何事情都可以用数组来完成,这将解释我上面提到的现象。

最佳答案

正式确定我的答案。这是完全正确的。除了字面量和临时值,几乎所有 JavaScript 中的东西都是对象。包括函数、数组和变量。

正是出于这个确切的原因,使用以下语法遍历数组被认为是危险的:

for (x in myArray){}

上面这行代码可能会导致不可预知的结果!

这种将所有数据类型创建为对象的方法允许 JavaScript 尽可能地动态和灵活。

您可以看到对象 here 的完整描述.

关于用作混合数据结构的 JavaScript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31952495/

相关文章:

javascript - 内联(不是内联 block )行为元素的最小宽度

javascript - Selenium - 能够获取在网页中呈现和显示的 Webelements 列表

用于视频的 Javascript 新窗口未在 IE 中调整大小

javascript - 为什么我的隐藏/取消隐藏按钮仅在第二次单击时起作用?

javascript - 绘制圆圈,然后使用 html canvas 和 javascript 移动它

javascript - 如何使用 javascript、jquery、html 和 css 制作基本的事件日历?

javascript - MVC中数据库查询后重新加载页面js

javascript - 行尾无法通过正则表达式删除或 trim Node.JS

javascript - 自定义组合框下拉问题

javascript - Nodejs/expressjs 中请求参数的字符串不可变性问题