(1) console.log(8*null)
//输出为0(null更改为0)
(2) console.log("5"-1)
//输出到4(“5”变为5)
(3) console.log("5"+1)
//输出到“51”(1变为“1”)
好像你看到了上面的代码行,有时类型转换发生在左侧,有时则发生在二元运算符的右侧。
所以我的问题是JavaScript如何决定需要更改哪个操作数类型,它是在内部发生的(不知道用户)还是有数据类型的优先级?
答案 0 :(得分:4)
因为*
是multiplicative operator,所以它在两个操作数上调用规范的ToNumber
抽象操作(首先是左边的操作数,然后是右边的操作数)。 ToNumber(null)
的结果为0
(请参阅表格的链接),因此8 * 0
为0
。
由于-
是subtraction operator,因此它还会在其操作数上调用ToNumber
。因此,5 - 1
为4
。
+
operator有两个含义:数学加法和字符串连接。如果任一操作数是一个字符串,则会得到连接,而不是添加。更正式地说:它首先通过规范的抽象ToPrimitive
操作将其操作数转换为 primitives ,然后确定操作数的原始值是否为字符串,如果是,则进行连接。在+
的情况下,哪个操作数(左侧或右侧)是一个字符串无关紧要,它可以是任何一个,这使得它连接而不是添加。
所以我的问题是JavaScript如何决定需要更改哪个操作数类型,它是在内部发生的(不知道用户)还是有数据类型的优先级?
在规范中详细阐述了非常详尽的细节,因此,如果您对特定情况有任何疑问,那就去看看。