在Javascript中,为什么
> var myArray = new Array(3);
不同于:
> var otherArray = [*null*, *null*, *null*];
Obs:(myArray == otherArray)
返回false
。
而且,我怎么能得到一个像otherArray
这样的变量,这是一个充满' nulls`的数组,但是我喜欢什么尺寸?
修改
[undefined, undefined, undefined]
也不等于myArray。
答案 0 :(得分:52)
答案 1 :(得分:3)
此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));
你将得到一个输出:
[]
答案 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)]
)