wtfjs:一个接近20k关注的有趣JS项目(上),面试杀手锏

文章详细解释了JavaScript中Number构造函数的行为,包括解析undefined和NaN的情况,parseInt函数的怪异特性如对字符串Infinity的解析,以及布尔值的数学运算。还提到HTML注释在JavaScript中的作用。
摘要由CSDN通过智能技术生成

[‘’] == ‘’ // -> 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

??? 说明:

根据规范:

  1. 如果没有参数传递给这个函数,让 n 为 +0 ;

  2. 否则,让 n 调用 ToNumber(value)

  3. 如果值为 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 返回 11/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 注释。

// 有效注释

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值