JavaScript 可以做到这一点吗?

2025-05-28

JavaScript 可以做到这一点吗?

你可能想知道为什么我最近写得少了。我向你保证,不是因为我变懒了(我现在就是🤩),只是我终于放假了,真是个迟到的假期。不过为了保持活力,我想既然现在玩得开心,那就写一篇有趣的文章吧😊。

在这篇文章中,我将介绍一些史上最有趣却又令人难以置信的 JavaScript 代码片段。你准备好了吗?

[]相等![]

数组等于非数组😂:

;[] == ![] // -> true
Enter fullscreen mode Exit fullscreen mode

💡 发生什么事了?

抽象相等运算符在比较两边之前会先将其转换为数字,并且0由于不同的原因,两边都会转换为 。数组为真值,因此右侧会变为假值,然后被强制转换为0。然而,左侧的空数组会被强制转换为数字,而不会先转换为布尔值;尽管空数组0是真值,它还是会被强制转换为 🤯。

truefalse

真即假:

!!'false' == !!'true' // -> true
!!'false' === !!'true' // -> true
Enter fullscreen mode Exit fullscreen mode

💡 发生什么事了?

truetruthy,用值 1(数字)表示,true以字符串形式表示为NaN。所以:

true == 'true' // -> false
false == 'false' // -> false
Enter fullscreen mode Exit fullscreen mode

false不是空字符串,所以它是一个真值,因此:

!!'false' // -> true
!!'true' // -> true
Enter fullscreen mode Exit fullscreen mode

很酷吧?😎

巴娜娜🍌

让我们创建一个香蕉:

'b' + 'a' + +'a' + 'a' // -> baNaNa
Enter fullscreen mode Exit fullscreen mode

💡 发生什么事了?

这是一个老把戏,重新组合了一下。表达式 被转换为"ba" + (+"a") + "a",由于"a"被转换为数字,所以它变成了NaN

让我们失败吧

你做梦也不会相信这是真的,但是:

;(![] + [])[+[]] +
  (![] + [])[+!+[]] +
  ([![]] + [][[]])[+!+[] + [+[]]] +
  (![] + [])[!+[] + !+[]]
// -> 'fail'
Enter fullscreen mode Exit fullscreen mode

💡 发生什么事了?

如果我们将这一大堆事情分解成更小的部分,我们会发现以下模式经常出现:

![] + [] // -> 'false'
![] // -> false
Enter fullscreen mode Exit fullscreen mode

我们尝试添加[]false,但由于内部有许多函数调用,我们最终会将右操作数转换为字符串:

![] + [].toString() // -> 'false'
Enter fullscreen mode Exit fullscreen mode

将字符串视为数组,我们可以通过以下方式访问其第一个字符[0]

'false'[0] // -> 'f'
Enter fullscreen mode Exit fullscreen mode

其余部分显而易见,但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
Enter fullscreen mode Exit fullscreen mode

💡 发生什么事了?

这背后的解释相当长。因此,我向你介绍规范的7.2.13 节“抽象相等性比较” 。

parseInt很糟糕

parseInt因其怪癖而闻名,我只提到其中最著名的一个:

parseInt('f**k') // -> NaN
parseInt('f**k', 16) // -> 15
Enter fullscreen mode Exit fullscreen mode

💡 发生什么事了?

发生这种情况是因为parseInt它会继续逐个字符地解析,直到遇到不认识的字符。in是十六进制f数字f**k15

NaN 不是一个数字

的类型NaNnumber

typeof NaN // -> 'number'
Enter fullscreen mode Exit fullscreen mode

💡 发生什么事了?

typeof和运算符工作原理的解释instanceof

三个数字的比较

这是金色的:

1 < 2 < 3 // -> true
3 > 2 > 1 // -> false
Enter fullscreen mode Exit fullscreen mode

💡 发生什么事了?

为什么会这样呢?嗯,问题出在表达式的第一部分。它的工作原理如下:

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
Enter fullscreen mode Exit fullscreen mode

您可以使用大于或等于运算符 ( >=) 来解决这个问题:

3 > 2 >= 1 // true
Enter fullscreen mode Exit fullscreen mode

阅读规范中有关关系运算符的更多信息:

这只是 JavaScript 给我们带来的一些乐趣。难怪有些人不喜欢它,因为他们不明白它是怎么工作的😂。

文章来源:https://dev.to/yashints/javascript-can-do-that-4c2e
PREV
让我们在 10 分钟内使用 Tensorflow.js 构建一个游戏🎮
NEXT
提高 HTML 和 CSS 性能