JavaScript 可以做到这一点吗?
你可能想知道为什么我最近写得少了。我向你保证,不是因为我变懒了(我现在就是🤩),只是我终于放假了,真是个迟到的假期。不过为了保持活力,我想既然现在玩得开心,那就写一篇有趣的文章吧😊。
在这篇文章中,我将介绍一些史上最有趣却又令人难以置信的 JavaScript 代码片段。你准备好了吗?
[]
相等![]
数组等于非数组😂:
;[] == ![] // -> true
💡 发生什么事了?
抽象相等运算符在比较两边之前会先将其转换为数字,并且0
由于不同的原因,两边都会转换为 。数组为真值,因此右侧会变为假值,然后被强制转换为0
。然而,左侧的空数组会被强制转换为数字,而不会先转换为布尔值;尽管空数组0
是真值,它还是会被强制转换为 🤯。
true
是false
真即假:
!!'false' == !!'true' // -> true
!!'false' === !!'true' // -> true
💡 发生什么事了?
true
是truthy
,用值 1(数字)表示,true
以字符串形式表示为NaN
。所以:
true == 'true' // -> false
false == 'false' // -> false
false
不是空字符串,所以它是一个真值,因此:
!!'false' // -> true
!!'true' // -> true
很酷吧?😎
巴娜娜🍌
让我们创建一个香蕉:
'b' + 'a' + +'a' + 'a' // -> baNaNa
💡 发生什么事了?
这是一个老把戏,重新组合了一下。表达式 被转换为"ba" + (+"a") + "a"
,由于"a"
被转换为数字,所以它变成了NaN
。
让我们失败吧
你做梦也不会相信这是真的,但是:
;(![] + [])[+[]] +
(![] + [])[+!+[]] +
([![]] + [][[]])[+!+[] + [+[]]] +
(![] + [])[!+[] + !+[]]
// -> 'fail'
💡 发生什么事了?
如果我们将这一大堆事情分解成更小的部分,我们会发现以下模式经常出现:
![] + [] // -> 'false'
![] // -> false
我们尝试添加[]
到false
,但由于内部有许多函数调用,我们最终会将右操作数转换为字符串:
![] + [].toString() // -> 'false'
将字符串视为数组,我们可以通过以下方式访问其第一个字符[0]
:
'false'[0] // -> 'f'
其余部分显而易见,但i
有点棘手。i
通过生成字符串falseundefined
并获取索引处的元素来获取失败的 in ['10']
。
数组相等是邪恶的👾
数组相等在 JavaScript 中是邪恶的,如下所示:
[] == '' // -> true
[] == 0 // -> true
[''] == '' // -> 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 节“抽象相等性比较” 。
parseInt
很糟糕
parseInt
因其怪癖而闻名,我只提到其中最著名的一个:
parseInt('f**k') // -> NaN
parseInt('f**k', 16) // -> 15
💡 发生什么事了?
发生这种情况是因为parseInt
它会继续逐个字符地解析,直到遇到不认识的字符。in是十六进制f
数字。f**k
15
NaN
是
不是一个数字
的类型NaN
为number
:
typeof NaN // -> 'number'
💡 发生什么事了?
typeof
和运算符工作原理的解释instanceof
:
三个数字的比较
这是金色的:
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://dev.to/yashints/javascript-can-do-that-4c2e