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 < a
是false
,所以取反的结果就是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