javascript - 奇怪的数组对象 - JavaScript

标签 javascript

与其他编程语言相比,JavaScript 中的数组非常独特,而且它也有其全部的怪癖。

包括这个:

// Making a normal array.
var normalArray = [];
normalArray.length = 0;

normalArray.push(1);
normalArray[1] = 2;

normalArray; // returns [1, 2]
normalArray.length // returns 2

所以,是的,上面就是我们都知道的如何创建数组并用元素填充它们,对吧? (暂时忽略 normalArray.length = 0 部分)

但是为什么当相同的序列应用于一个不纯粹是数组的对象时,它看起来有点不同,并且它的 length 属性有点偏离?

// Making an object that inherits from the array prototype (i.e.: custom array)
var customArray = new (function MyArray() {
    this.__proto__ = Object.create(Array.prototype);
    return this
});
customArray.length = 0;

customArray.push(1);
customArray[1] = 2;

customArray; // returns [1, 1: 2]
customArray.length // returns 1

不完全确定这里发生了什么,但我们将非常感谢一些解释。

最佳答案

这可能不是完美的答案,但根据我对 Javascript 数组的理解,它们与通常的对象有点不同。 (主要是因为它维护了长度属性,而对象则没有)。

因此,如果我们以您的代码为例:

var normalArray = [];

这是在 Javascript 中创建数组的正确方法。但下面这个呢?

var customArray = new (function MyArray() {
    this.__proto__ = Object.create(Array.prototype);
    return this
});

它们一样吗?让我们看看..

Array.isArray(normalArray); // true -> [object Array]
Array.isArray(customArray); // false -> [object Object]

所以很明显,虽然你继承了数组原型(prototype),但它并没有真正创建一个 Array 类型的对象。它只是创建一个普通的 JS 对象,但具有继承的数组函数。这就是为什么当您使用 customArray.push(1); 设置值时它会更新长度的原因。

但是由于您的 customArray 只是一个常规对象,并且对于常规 JS 对象,使用 [] 表示法来设置属性,因此它不会更新长度(因为对象没有length属性)

希望很清楚:)

关于javascript - 奇怪的数组对象 - JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52049724/

相关文章:

javascript - 设置固定高度后宽度和高度相等

javascript - jQuery 动画不会在 'queue' 函数内部触发

javascript - 使用 "for .. of"循环从 Vanilla JavaScript 中的 Select 标签中删除选项

javascript - 如何制作只允许数字、退格键和删除键的输入

JavaScript for .. in 循环 IE 问题

javascript - 删除并重新填充 boostrapTable

javascript - 使用 React 路由器 React 中间件身份验证组件

PHP:使用来自 php 的参数调用 javascript 函数

javascript - 如何在这篇文章中创建全局变量?

javascript - PHP 文件未通过 AJAX 调用