[‘’] == ‘’ // -> true
[0] == 0 // -> true
[0] == ‘’ // -> false
[‘’] == 0 // -> true
[null] == ‘’ // true
[null] == 0 // true
[undefined] == ‘’ // true
[undefined] == 0 // true
[[]] == 0 // true
[[]] == ‘’ // true
[[[[[[]]]]]] == ‘’ // true
[[[[[[]]]]]] == 0 // true
[[[[[[ null ]]]]]] == 0 // true
[[[[[[ null ]]]]]] == ‘’ // true
[[[[[[ undefined ]]]]]] == 0 // true
[[[[[[ undefined ]]]]]] == ‘’ // true
??? 说明:
你应该非常小心留意上面的例子! 7.2.13 Abstract Equality Comparison 规范描述了这些行为。
undefined
和 Number
如果我们不把任何参数传递到 Number
构造函数中,我们将得到 0
。undefined
是一个赋值形参,没有实际的参数,所以您可能期望 NaN
将 undefined
作为参数的值。然而,当我们通过 undefined
,我们将得到 NaN
。
Number(); // -> 0
Number(undefined); // -> NaN
??? 说明:
根据规范:
-
如果没有参数传递给这个函数,让
n
为+0
; -
否则,让
n
调用ToNumber(value)
-
如果值为
undefined
,那么ToNumber(undefined)
应该返回NaN
.
这是相应的部分:
-
20.1.1 Number 构造器函数
-
7.1.3 ToNumber(
argument
)
parseInt
是一个坏蛋
parseInt
它以的怪异而出名。
parseInt(“f*ck”); // -> NaN
parseInt(“f*ck”, 16); // -> 15
**??? 说明:
** 这是因为 parseInt
会持续通过解析直到它解析到一个不识别的字符,'f*ck'
中的 f
是 16 进制下的 15
。
解析 Infinity
到整数也很有意思…
//
parseInt(“Infinity”, 10); // -> NaN
// …
parseInt(“Infinity”, 18); // -> NaN…
parseInt(“Infinity”, 19); // -> 18
// …
parseInt(“Infinity”, 23); // -> 18…
parseInt(“Infinity”, 24); // -> 151176378
// …
parseInt(“Infinity”, 29); // -> 385849803
parseInt(“Infinity”, 30); // -> 13693557269
// …
parseInt(“Infinity”, 34); // -> 28872273981
parseInt(“Infinity”, 35); // -> 1201203301724
parseInt(“Infinity”, 36); // -> 1461559270678…
parseInt(“Infinity”, 37); // -> NaN
也要小心解析 null
:
parseInt(null, 24); // -> 23
??? 说明:
它将
null
转换成字符串'null'
,并尝试转换它。对于基数 0 到 23,没有可以转换的数字,因此返回 NaN。在 24,“n”
,第 14 个字母被添加到数字系统。在 31,“u”
,添加第 21 个字母,可以解码整个字符串。在 37 处,不再有可以生成的有效数字集,并返回NaN
。
— “parseInt(null, 24) === 23… wait, what?” at StackOverflow
不要忘记八进制:
parseInt(“06”); // 6
parseInt(“08”); // 8 如果支持 ECMAScript 5
parseInt(“08”); // 0 如果不支持 ECMAScript 5
??? 说明:
这是因为 parseInt
能够接受两个参数,如果没有提供第二个参数,并且第一个参数以 0
开始,它将把第一个参数当做八进制数解析。
parseInt
总是把输入转为字符串:
parseInt({ toString: () => 2, valueOf: () => 1 }); // -> 2
Number({ toString: () => 2, valueOf: () => 1 }); // -> 1
解析浮点数的时候要注意
parseInt(0.000001); // -> 0
parseInt(0.0000001); // -> 1
parseInt(1 / 1999999); // -> 5
??? 说明: ParseInt
接受字符串参数并返回一个指定基数下的证书。ParseInt
也去除第一个字符串中非数字字符(字符集由基数决定)后的内容。0.000001
被转换为 "0.000001"
而 parseInt
返回 0
。当 0.0000001
被转换为字符串时它被处理为 "1e-7"
因此 parseInt
返回 1
。1/1999999
被转换为 5.00000250000125e-7
而 parseInt
返回 5
。
true
和 false
数学运算
我们做一些数学计算:
true +
true(
// -> 2
true + true
) *
(true + true) -
true; // -> 3
嗯… ???
??? 说明:
我们可以用 Number
构造函数强制转化成数值。很明显,true
将被强制转换为 1
:
Number(true); // -> 1
一元加运算符尝试将其值转换成数字。它可以转换整数和浮点的字符串表示,以及非字符串值 true
,false
和 null
。如果它不能解析特定的值,它将转化为 NaN
。这意味着我们可以更容易地强制将 true
换成 1
+true; // -> 1
当你执行加法或乘法时,ToNumber
方法调用。根据规范,该方法返回:
如果
参数
is true , 返回 1 。如果参数
是 false 返回 +0。
这就是为什么我们可以进行进行布尔值相加并得到正确的结果
相应部分:
-
12.5.6 一元
+
运算符 -
12.8.3 加法运算符(
+
) -
7.1.3 ToNumber(
argument
)
HTML 注释在 JavaScript 中有效
你会留下深刻的印象,<!--
(这是 HTML 注释)是一个有效的 JavaScript 注释。
// 有效注释