为什么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”之间有什么区别?
答案 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
)
- 令num为ToNumber(数字)。
醇>
所以isNaN("12")
=> isNaN(12)
=>的假强>
答案 2 :(得分:1)
这是因为在场景后面,isNaN将传递给它的参数转换为数字,然后再检查它是否为数字
答案 3 :(得分:1)
JavaScript是否将“12和12视为相同的东西?”
没有。
在某些条件下,它会隐式地将12
转换为"12"
,反之亦然(其他示例包括您是否与==
进行比较或连接包含12
("" + 12
)的字符串。
然后,“12”和“string”之间有什么区别?
一个是将数字12表示为数字的字符串,另一个是表示单词字符串的字符串。
typeof
运算符告诉您(以字符串的形式)值是什么类型的数据。
答案 4 :(得分:1)
答案 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 ===
)。它不检查其参数的类型;其目的不来区分其他类型的数字。它用于检测除零和无法用浮点数格式表示的值(加上大数字时出现溢出结果,小值除以大值时出现下溢结果等)。