JavaScript
是一个非常有趣的语言,但同时也充满了各种奇怪的行为。这些奇怪的行为有时会搞砸我们的日常工作,有时则会让我们忍俊不禁。
WTFJS
这个开源项目的初衷只是因为好玩。收集一些疯狂的例子,并尽可能解释它们的原理,学习以前不了解的知识。
如果你是初学者,您可以根据此笔记深入了解 JavaScript。
如果你是专业开发人员,你将从这些例子中看到人见人爱的 JavaScript 也充满了非预期的边界行为。
总之,古人云:三人行,必有我师焉。我相信这些例子总能让你学习到新的知识。
这里拿出来几个例子看一下:
尽管 null 是假值,但它不等于 false。
!!null; // -> false
null == false; // -> false
但是,别的被当作假值的却等于 false,如 0 或 ''。
0 == false; // -> true
"" == false; // -> true
如果你尝试将两个数组相加:
[1, 2, 3] + [4, 5, 6]; // -> '1,2,34,5,6'
💡 说明:数组之间会发生串联。步骤如下:
[1, 2, 3] +
[4, 5, 6][
// 调用 toString()
(1, 2, 3)
].toString() +
[4, 5, 6].toString();
// 串联
"1,2,3" + "4,5,6";
// ->
("1,2,34,5,6");
Number.MIN_VALUE 是最小的数字,大于零:
Number.MIN_VALUE > 0; // -> true
💡 说明:Number.MIN_VALUE 是 5e-324,即可以在浮点精度内表示的最小正数,也是在该精度内无限接近零的数字。它定义了浮点数的最高精度。
现在,整体最小的值是 Number.NEGATIVE_INFINITY,尽管这在严格意义上并不是真正的数字。
— StackOverflow 上的“为什么在 JavaScript 中 0 小于 Number.MIN_VALUE?”
https://stackoverflow.com/questions/26614728/why-is-0-less-than-number-min-value-in-javascript
做一下数学计算:
true + true; // -> 2
(true + true) * (true + true) - true; // -> 3
嗯……🤔
💡 说明:我们可以用 Number 构造函数将值强制转化成数值。很明显,true 将被强制转换为 1 :
Number(true); // -> 1
一元加运算符会尝试将其值转换成数字。它可以转换字符串形式表达的整数和浮点数,以及非字符串值 true、false 和 null。如果它不能解析特定的值,它将转化为 NaN。这意味着我们可以有更简便的方式将 true 转换成 1:
+true; // -> 1
当你执行加法或乘法时,将会 ToNumber 方法。根据规范,该方法的返回值为:
如果参数是 true,返回 1。如果参数是 false,则返回 +0。
因此我们可以将布尔值相加并得到正确的结果
1 < 2 < 3; // -> true
3 > 2 > 1; // -> false
💡 说明:为什么会这样呢?其实问题在于表达式的第一部分。以下是它的工作原理:
1 < 2 < 3; // 1 < 2 -> true
true < 3; // true -> 1
1 < 3; // -> true
3 > 2 > 1; // 3 > 2 -> true
true > 1; // true -> 1
1 > 1; // -> false
我们可以用 大于或等于运算符(>=):
3 > 2 >= 1; // true
了不起只是列举了几个例子,现在开发各种工具、三方库,很多人特别是刚入门的小伙伴对于这些基础技能还真是没仔细了解过,这个项目收集一些JavaScript的例子,并尽可能解释它们的原理,值得看看学习一下。
项目地址:https://github.com/denysdovhan/wtfjs