【问题标题】:Why do arrays of length 1 behave like scalars inJavaScript?为什么长度为 1 的数组表现得像 JavaScript 中的标量?
【发布时间】:2019-01-03 03:25:41
【问题描述】:

例子:

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)

但是为什么它会起作用呢?

【问题讨论】:

    标签: javascript arrays type-conversion


    【解决方案1】:

    这是因为在乘法过程中(*type conversion 发生了:

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

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

    自己看:

    console.log(String([1,2]));   // '1,2' (of type string)
    console.log(String([2]));     // '2' (of type string)
    console.log(Number('1,2'));   // NaN (of type number)
    console.log(Number('2'));     // 2 (of type number)

    欲了解更多信息,请参阅this

    【讨论】:

    • 确实,这甚至可以扩展到更多级别:console.log(Number([[[2]]])); // 2
    【解决方案2】:

    当一个数组在一个表达式中需要一个原语时,它的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(',')在一个元素的数组上被调用时,没有逗号,所以可以将结果转换为数字并与*相乘。

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

    【讨论】:

      【解决方案3】:

      这与 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 一样,就是这样!

      【讨论】:

      • 第一个例子并不奇怪。 [1, 2] == '1,2' 表示 String([1,2]) == '1,2' 取决于双方的类型。
      【解决方案4】:

      您可以在这里找到全面的答案: Official specification: ToNumber

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-17
        • 2020-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多