Javascript - 用空值初始化数组

Javascript - Initialize array with nulls

在 Javascript 中,为什么是

var myArray = new Array(3);

不同于:

var otherArray = [null, null, null];

?

观察:(myArray == otherArray) returns false.

另外,我怎样才能得到一个像 otherArray 这样的变量,它是一个充满“空值”的数组,但大小随我喜欢?

观察

[undefined, undefined, undefined] 

也不等于 myArray。

var myArray = new Array(3); 将创建一个空数组。因此,出于这个原因,myArrayotherArray 是不同的数组。此外,即使它们具有相同的值,三个 undefined 值,数组也不会相同。数组是一个对象,变量 myArray 持有对该对象的引用。具有相同值的两个对象不相同。

例如,

var a = new Object();
var b = new Object();
console.log(a===b); // outputs false.

除此之外:

var customerA = { name: "firstName" };
var customerB = { name: "firstName" };
console.log(customerA===customerB); // outputs false.

更新

此外,在 var myArray = new Array(3) 的情况下,甚至索引都没有初始化,正如 Paul 在他的评论中正确指出的那样。

如果你试试这个:

var array = [1,2,3];
console.log(Object.keys(array));

你会得到一个输出:

["1","2","3"];

而如果您尝试这样做:

var array = new Array(3);
console.log(Object.keys(array));

你将得到输出:

[]

首先要注意的一点是,如果您想比较两个 Arrays 或任何其他 Object,您要么必须遍历它们,要么将它们序列化,因为比较引用总是会给出 false


How can I get a variable like otherArray, which is an array full of 'nulls', but with whatever size I'd like?

这是创建 Arrays 的另一种方法,其项目具有默认值并且所有索引均已初始化:

function createArray(len, itm) {
    var arr1 = [itm],
        arr2 = [];
    while (len > 0) {
        if (len & 1) arr2 = arr2.concat(arr1);
        arr1 = arr1.concat(arr1);
        len >>>= 1;
    }
    return arr2;
}

现在,

createArray(9, null);
// [null, null, null, null, null, null, null, null, null]

使用 EcmaScript 6 (ES2105),创建包含 five nulls 的数组就这么简单:

const arr = new Array(5).fill(null);

MDN Reference

我做了一些研究,结果 Array(length).fill(null) 它不是性能方面的最佳解决方案。

最佳表现显示:

const nullArr = Array(length)
for (let i = 0; i < length; i++) {
  nullArr[i] = null
}

看看这个:

const Benchmark = require('benchmark')
const suite = new Benchmark.Suite

const length = 10000

suite
  .add('Array#fill', function () {
    Array(length).fill(null)
  })
  .add('Array#for', function () {
    const nullArr = Array(length)
    for (let i = 0; i < length; i++) {
      nullArr[i] = null
    }
  })

  .on('cycle', function (event) {
    console.log(String(event.target))
  })
  .on('complete', function () {
    console.log('Fastest is ' + this.filter('fastest').map('name'))
  })

  .run({ async: true })

显示如下结果:

Array#fill x 44,545 ops/sec ±0.43% (91 runs sampled)
Array#for x 78,789 ops/sec ±0.35% (94 runs sampled)
Fastest is Array#for

您也可以尝试 [...new Array(76)] 生成 76 个未定义项。

console.log(
  [...new Array(76)]
)  

或填写null.

console.log(
  [...new Array(76).fill(null)]
)