Javascript - 使用空值初始化数组

时间:2015-01-08 13:32:27

标签: javascript arrays

在Javascript中,为什么

> var myArray = new Array(3);

不同于:

> var otherArray = [*null*, *null*, *null*];

Obs:(myArray == otherArray)返回false

而且,我怎么能得到一个像otherArray这样的变量,这是一个充满' nulls`的数组,但是我喜欢什么尺寸?

修改

[undefined, undefined, undefined] 

也不等于myArray。

5 个答案:

答案 0 :(得分:52)

使用EcmaScript 6(ES2105),创建一个包含例如五个空值的数组就像这样简单:

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

MDN Reference

答案 1 :(得分:3)

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));

你将得到一个输出:

[]

答案 2 :(得分:3)

首先要注意的是,如果要比较两个 Arrays 或任何其他 Object ,您必须循环它们或序列化它们,因为比较引用将始终给false


  

如何获得像otherArray这样的变量,这是一个充满'nulls'的数组,但是我想要的是什么尺寸?

以下是创建 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]

答案 3 :(得分:1)

我进行了一些研究,结果证明 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

答案 4 :(得分:1)

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

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

或者用 null 填充。

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