【问题标题】:Javascript - Initialize array with nullsJavascript - 用空值初始化数组
【发布时间】:2015-01-08 13:32:26
【问题描述】:

在 Javascript 中,为什么是

var myArray = new Array(3);

不同于:

var otherArray = [null, null, null];

?

Obs:(myArray == otherArray) 返回false

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

观察

[undefined, undefined, undefined] 

也不等于 myArray。

【问题讨论】:

  • 两个对象只有当它们是同一个对象时才相等。因为在您的情况下,otherArraymyArray 不是同一个数组,所以它们不能相等。
  • 因为null不是javascript中的未定义值:undefined是。第一个是undefined
  • 如果我创建一个数组[undefined, undefined, undefined]仍然不相等
  • obj1 == obj2 将永远是 false, [1] == [1]; // false

标签: javascript arrays


【解决方案1】:

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

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

MDN Reference

【讨论】:

  • 这应该是我朋友今年公认的答案!
  • 你应该使用这个方法。
  • 请注意,IE 不支持“填充”
【解决方案2】:

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

你会得到输出:

[]

【讨论】:

  • 一个关于稀疏数组的资源的链接我猜会是一个完整的答案:)(关于数组迭代方法)
  • 不仅仅是项目只是未定义,索引也没有初始化;
  • "new Array(3); 将创建一个包含三个未定义元素的数组" 不太正确。它创建空数组,根本没有任何值,甚至是未定义的(所谓的“洞”)。它只是读取丢失的索引返回undefined
  • @dfsq 感谢您的评论。我更新了我的答案。我不知道这个。
  • @Christos 它没有索引也没有值,只有孔。这就像分配的空间。一般来说new Array(number)几乎没有什么有用的应用。
【解决方案3】:

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


我怎样才能得到一个像 otherArray 这样的变量,它是一个充满“空值”的数组,但我想要什么大小?

这里是创建 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]

【讨论】:

  • 我不明白你为什么要写这么复杂的函数。我测试了这个function createArray2(len, itm) { var arr = []; while (len > 0) { arr.push(itm); len--;} return arr;} 我在 Chrome 中使用 console.time 运行了测试,createArray(10000, null)createArray(1000000, null) 在 1000 个 forloop 中的结果是:143.964ms/98.495ms 和 20114.130ms/16686.080ms 更快总是我的功能...我错过了什么吗?
【解决方案4】:

我做了一些研究,结果发现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

【讨论】:

    【解决方案5】:

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

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

    或者填写null

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      相关资源
      最近更新 更多