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);
将创建一个空数组。因此,出于这个原因,myArray
和 otherArray
是不同的数组。此外,即使它们具有相同的值,三个 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);
我做了一些研究,结果 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)]
)
在 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);
将创建一个空数组。因此,出于这个原因,myArray
和 otherArray
是不同的数组。此外,即使它们具有相同的值,三个 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);
我做了一些研究,结果 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)]
)