fuck-the-js

null vs 0

null > 0 //false
null < 0 //false
null == 0 //false
null >= 0 //true
null <= 0 //true

这个是因为比较符(>, <)会进行转换成数字,Number(null) == 0, 然而null == 0在规范里,是不存在这种相等,所以一律返回false.

+

'x' + + 'w' // xNaN

为什么,可以看到主要的问题是在+ +这个地方。 他是相当于'x' + (+'w'),在这里会把w进行强制转换(Number('w')), 所以变成了'x' + NaN. 具体的可以参考最新版的规范-12.8.3.1Runtime Semantics: Evaluation - 12.8.5

object vs object

var a = { b: 42 };
var b = { b: 43 };

a < b;    // false
a == b;    // false
a > b;    // false

a <= b;    // true
a >= b;    // true

看代码,可能会产生疑问。a < b是相当于[object object] < [object object],我们知道两个字符串在进行比较的时候,是逐字符串字典顺序比较的,但是这个比较奇怪,不会按照字典顺序比较。 他的比较a <= b实际是通过先比较b < a,然后对b < a的结果取反,我们知道b < afalse,所以取反的结果就是true.

false       =>  ![]
true        =>  !![]
undefined   =>  [][[]]
NaN         =>  +[![]]
0           =>  +[]
1           =>  +!+[]
2           =>  !+[]+!+[]
10          =>  [+!+[]]+[+[]]
Array       =>  []
Number      =>  +[]
String      =>  []+[]
Boolean     =>  ![]
Function    =>  []["filter"]
eval        =>  []["filter"]["constructor"]( CODE )()
window      =>  []["filter"]["constructor"]("return this")()

摘选自jsfuck

操蛋系列

promise和async打印顺序

const p = Promise.resolve();

p.then(() => console.log('then3'));
(async function() {
    await p;
    console.log('after await1')
    await p;
    console.log('after await2')
})()

p.then(() => console.log('then1'))
  .then(() => console.log('then2'));

你觉得上面会输出什么?两个都是微任务。不能单一的说输出啥,记得环境。

以浏览器端来说,当前的chrome版本(v75.0.3770.100)的行为和node8版本的行为差不多,但是如果你切换到node10去跑,又是另外一种结果。

好吧,或许你可以看这里再了解了解吧。

看看更快的async和promise这篇文章。

Last updated