为什么长度为1的数组在JavaScript中的行为类似于标量?

时间:2018-07-26 07:50:20

标签: javascript arrays type-conversion

示例:

let a = [1, 2]
console.log(a * 2);  // NaN, this isn't Python
a = [3];
console.log(a);  // an array, as expected: [3]
console.log(a * 2);  // 6!

这在实践中对于Headers对象很有用,该对象通常包含1个元素的数组:

// calculate when an API will reset its rate limit
new Date(response.headers['x-rate-limit-reset'] * 1000)

但是为什么有效?

4 个答案:

答案 0 :(得分:2)

这是因为在乘法(*type conversion期间发生:

console.log(Number([1, 2])); // NaN

console.log(Number([2]));   // 2

注意:在转换为Number之前,JavaScript会尝试将数组转换为String,这样会产生逗号分隔的值,例如'1,2'和{{1} }。然后,当JavaScript尝试将这些字符串转换回'2'(因为我们将它们相乘)时,Number产生'1,2',而NaN得到的转换就很好。

亲自看看:

'2'

有关更多信息,请参见this

答案 1 :(得分:1)

当数组位于需要基本值的表达式中时,将调用其toString方法。对于数组,这基本上是arr.join(',')。包含逗号的字符串不能转换为数字:

let a = [1, 2]
console.log(a * 2);  // doesn't work
console.log('1, 2' * 2) // same string result: also doesn't work
console.log([1, 2].toString() === '1,2');

但是当在具有一个元素的数组上调用join(',')时,没有逗号,因此结果 可以转换为数字并乘以*。 / p>

console.log([3].toString());
console.log([3, 4].toString());
console.log(isNaN([3].toString()));
console.log(isNaN([3, 4].toString()));

答案 2 :(得分:1)

这与JavaScript的相同性有关。

查看此页面以获取完整的文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness

可能会发生很多自动转换:)

这是一个奇怪/有趣的人:

console.log([1, 2] == '1,2')

所以可以这样解释:

console.log([6] == '6');
console.log([6] == 6);
console.log([6] * '7');

*是一个数学运算符,它尝试将所有内容都转换为数字!可以将[6]强制转换为6,就像将'7'强制强制转换为7一样!

答案 3 :(得分:1)

您可以在这里找到完整的答案: Official specification: ToNumber