香蕉吧啦-JavaScript怪异行为集合(一)

[广告]京东京造 K2蓝牙双模机械键盘 背光84键有线/蓝牙无线双模


1 Not a Number是一个数字

全局属性 NaN 的值表示不是一个数字(Not-A-Number),那么它是什么类型?

typeof NaN; // 'number'

所以不是一个数字,是一个数字。


2   + ‘a’ = ?

('b'+'a'+ +'a' +'a').toLowerCase();

以上代码你认为会输出什么?baaa 吗?…

正确答案是:banana

因为对字符串(准确的说,是非数字的字符串)做数值运算会得到Not a number,所以+ ‘a’ 会生成 NaN。

而toLowerCase(),是个障眼法,稍稍隐藏了NaN.


3 最大值比最小值小

Math.min(1, 4, 7, 2); // 1
Math.max(1, 4, 7, 2); // 7

以上很合理。但是在没有参数的情况下,最小值比最大值大。

Math.min(); // Infinity
Math.max(); // -Infinity
Math.min() > Math.max(); // true

原因是:Math.max() – JavaScript | MDN

-Infinity is the initial comparant because almost every other value is bigger, that’s why when no arguments are given, -Infinity is returned.

-Infinity是初始比较值,因为几乎所有其他的值都比较大,这就是为什么当没有给出参数时,-Infinity会被返回。

相反,Math.min() 会返回 Infinity 正无穷大。


4 parseInt(null,24)

parseInt接收两个参数:string值和radix进制值:

  • string:被解析的字符串(前后空格会被忽略,若不是字符串,则转换成字符串)
  • radix:指定 string(第一个参数)的基数(2~36,即 2 进制 ~ 36进制),若不传或传 0,则 string(第一个参数)以 10 进制 来解析

所以:parseInt(null,24) 是将null值转化成 24 进制。

等于多少?

答案是 23.

首先我们来了解什么是 24 进制。

Base-24 Conversion Tool

即24进制就是 数字0-9 加 字符 A-N表示法。

而 parseInt(null, 24) 会将null 值转换成字符串 “Null”,因为第二个字符‘u’不在24进制当中,所以只取第一个字符N,对应24进制是23。

所以 parseInt(“mzhren”,24)得到的值就是22.


5 那么 parseInt(NaN,24) 等于多少?

NaN 与 Null 第1个字符都是N,那应该是也是23吧。

答案当然是否定的。

正确答案是:13511.

因为 NaN 三个字符都符合 24进制,N是23,a是10,所以:

23 * 242 + 10 * 241 + 23 * 24 = 13511

同理,parseInt(1/0,19)等类似的题目,都比较理解了。

参考资料

码中人 微信公众号