【问题标题】:Why is an Array with one Number a Number in Javascript?为什么在Javascript中一个数字的数组是一个数字?
【发布时间】:2015-01-22 05:05:26
【问题描述】:

我发现空数组或只有一个数字的 ar 是一个数字。

我认为这个话题并不是对这种特殊情况的真正解释:Why does isNaN(" ") equal false

document.write( isNaN([1,2,3]) ); // true
document.write( isNaN([1,2,'abc']) ); // true
document.write( isNaN(['abc']) ); // true

// maybe explained through the above link
document.write( isNaN([]) ); // false

// but...
document.write( isNaN([1]) ); // false
document.write( isNaN([-3]) ); // false
document.write( isNaN([1234567]) ); // false
document.write( isNaN([-1.234]) ); // false
document.write( isNaN([[123]]) ); // false
document.write( isNaN(['1']) ); // false

谁能告诉我为什么它有意义?

【问题讨论】:

    标签: javascript arrays nan


    【解决方案1】:

    您正在使用 isNaN 全局函数,该函数具有一些令人困惑的行为,因为它会将非数字强制转换为数字类型,这可能会导致 NaN 值。这就是您的情况发生的情况,因为包含单个数字元素的数组的字符串表示将成功解析为单个数字元素的数字值。

    来自MDN

    自从 isNaN 函数规范的最早版本以来,它对非数字参数的行为一直令人困惑。当isNaN 函数的参数不是数字类型时,该值首先被强制转换为数字。然后测试结果值以确定它是否为NaN。因此,对于非数字,当强制转换为数字类型时会产生一个有效的非 NaN 数值(特别是空字符串和布尔基元,当强制转换为数字值 0 或 1)时,“false”返回值可能是意料之外的;例如,空字符串肯定是“不是数字”。

    还要注意,在 ECMAScript 6 中,现在还有 Number.isNaN 方法,根据 MDN:

    与全局isNaN() 函数相比,Number.isNaN() 不存在将参数强制转换为数字的问题。这意味着现在可以安全地传递通常会转换为NaN 但实际上与NaN 不同的值。这也意味着只有类型编号的值,也就是NaN,才返回true

    很遗憾

    即使是 ECMAScript 6 Number.isNaN 方法也有其自身的问题,如博文 - Fixing the ugly JavaScript and ES6 NaN problem 中所述。

    【讨论】:

      【解决方案2】:

      isNaN 将其值强制为一个数字。 (See MDN)

      因为数组的字符串表示形式是其所有项用逗号连接。由于逗号,其数字表示为NaN

      但如果只有一项,因此没有逗号,它可以转换为数字。

      【讨论】:

      • 是的,但这有什么意义呢?
      • @algorhythm 检查MDN: isNaN() 和旧全局isNaN()Number.isNaN() 之间的区别
      • @algorhythm isNaN: "Returns true if the argument coerces to NaN, and otherwise returns false." -- 这里的“coerces”是指对参数使用ToNumber抽象操作,它将对象(如数组)字符串化,然后对字符串进行数字化(如"1234567",它是[1234567] 的字符串化形式)。如果对象的字符串化形式有逗号(如"1,2,3"),则字符串无法合理转换为数字,因此被强制转换为NaN
      • 请注意,如果字符串只包含空格,则 ToNumber 返回 0,因此 isNaN('\n') 返回 false,而 isNaN('foo')(或任何其他非数字字符串文字)返回 true。
      猜你喜欢
      • 2012-05-10
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多