为什么isNAN(“12”)评估为假?

时间:2018-01-08 11:03:49

标签: javascript

为什么JavaScript将12和“12”解释为相同?

function sanitise(x) {
  if (isNaN(x)) {
    return NaN;
  }
  return x;
}

var a = "12"
var b = 12
console.log(typeof(a))
console.log(sanitise(a));
console.log(sanitise(b));

输出:

> "string"
> "12"
> 12

然后,“12”和“string”之间有什么区别?

6 个答案:

答案 0 :(得分:7)

  

isNaN()函数确定值是否为NaN。

根据documentation,当算术运算导致未定义或不可表示的值时,会生成NaN值。这些值不一定代表溢出条件。 NaN也是由于尝试强制转换为非数值的数值而没有原始数值可用。

例如,将零除以零会产生NaN - 但将其他数除以零则不会。

这里“12”不是数字,但它也不是NaN。因此isNaN()会返回false

此外,当isNaN函数的参数不是Number类型时,该值首先被强制转换为Number。然后测试结果值以确定它是否为NaN

因此isNaN('s')返回true,因为's'被转换为数字。将此解析为数字失败并返回NaN

答案 1 :(得分:2)

  

为什么“12”在JavaSciprt中不是NaN?

根据spec,在检查给定输入是否为数字之前,存在隐式转换 toNumber (或非数字 - NaN

  
      
  1. 令num为ToNumber(数字)。
  2.   

所以isNaN("12") => isNaN(12) =>的

答案 2 :(得分:1)

这是因为在场景后面,isNaN将传递给它的参数转换为数字,然后再检查它是否为数字

答案 3 :(得分:1)

  

JavaScript是否将“12和12视为相同的东西?”

没有。

某些条件下,它会隐式地将12转换为"12",反之亦然(其他示例包括您是否与==进行比较或连接包含12"" + 12)的字符串。

  

然后,“12”和“string”之间有什么区别?

一个是将数字12表示为数字的字符串,另一个是表示单词字符串的字符串。

typeof运算符告诉您(以字符串的形式)值是什么类型的数据。

答案 4 :(得分:1)

检查以下信息。

  

此功能与Number specific Number.isNaN()不同   方法

     

全局isNaN()函数,将测试值转换为Number,   然后测试它。

Link

答案 5 :(得分:0)

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime applicationLifetime, IBusControl bus) { applicationLifetime.ApplicationStopping.Register(() => bus.Stop(TimeSpan.FromSeconds(10))); .... "12"不是一回事,但在某些情况下,JS会默默地将一个转换为另一个。

例如,12"12" + 12(将数字转换为字符串),但"1212""12" * 12(将字符串转换为数字)。

首次转换是因为144用于numbers addition and strings concatenation。如果其中一个操作数是一个字符串,那么它确保另一个也是一个字符串(如果它不是一个字符串,则将其转换为字符串)。为了作为加法运算符,它的操作数都必须是数字。

另一方面,+仅用作multiplication operator,这就是为什么它将其操作数转换为数字以便能够使用它们。

isNaN() function检查其参数是否具有使用通常NaN无法与其他数字进行比较的特殊浮点值comparison operators (== and ===)。它不检查其参数的类型;其目的来区分其他类型的数字。它用于检测除零和无法用浮点数格式表示的值(加上大数字时出现溢出结果,小值除以大值时出现下溢结果等)。