三段诡异的JavaScript代码,结果出乎意料
自学习前端以来,陆陆续续会遇见很多短小令人惊讶的js代码,很多人会认为这是bug的存在,但换个角度来看待,是不是会发生有趣的事情呢。
以下为译文:
本人从事JavaScript开发已经7年了,但即便到了如今,我仍然会遇到一些令我瞠目结舌的代码片段。有时,我不禁纳闷JavaScript究竟是一门编程语言,还是一种魔法。
我知道很多人认为JavaScript是一门愚蠢的编程语言,bug很多,所以才有了这些“魔法片段”,但我认为JavaScript是一种通用且有趣的语言,而且它也是我养家糊口的手艺。
在本文中,我会介绍一些“魔法片段”。但是,我不建议你在生产应用程序中使用这类代码,因为这些代码片段只是为了理解概念,并对JavaScript产生敬畏之心。另外,在面试的时候千万不要问这类的问题,因为它们丝毫不能体现对JavaScript知识掌握的多少。这些只不过是在任何生产应用程序中都不会遇到的语言怪癖。
相等
虽然我不确定其他编程语言是否也会出现这种现象,但如下JavaScript代码片段可能会在变量a等于某个值的情况下返回true:
if (a == 1 && a == 2 && a == 3){
return true
} else {
return false
}
如果想知道究竟是怎么回事,请阅读这篇文章(https://codeburst.io/javascript-can-a-1-a-2-a-3-ever-evaluate-to-true-aca13ff4462d)。
由于不严谨的相等性(用==做比较),JavaScript会强制转换其中一个比较值的类型。
那么,下面的代码片段又如何呢?你认为对它也会针对某个a值返回true吗?
注意:这里我采用了严格的类型检查(即===)。
if (a === 1 && a === 2 && a === 3){ return true} else { return false}
你肯定会想,这根本不可能,这种情况下不会发生类型强制转换的现象,因此只能返回false。但是,别忘了,这可是JavaScript。
你想了解真相?阅读一下这篇文章吧(https://theanubhav.com/2018/11/7/understanding-primitive-and-getter-setters/)。
查找闰年
闰年需要满足以下两个条件:
能够被400整除;
能够被4整除,但不能被100整除。
你可以根据上述条件,使用任何一种编程语言编写一个简单的程序,就可以判断给定的年份是不是闰年。
你甚至可以在JavaScript中编写相同的逻辑来获取结果,但是JavaScript还有一种神奇的方法,只需一行代码即可:
function isLeapYear(year) {
return new Date(year, 1, 29).getDate() === 29
}
isLeapYear(2019) // false
isLeapYear(2020) // true
神奇吧?
这段代码的原理是:将非闰年(比如2019)传递给函数isLeapYear时,函数getDate就会返回下个月的第一天,即3月1日,而不是2月29日。你可以认为这段代码之所以管用是因为JavaScript的Date实现中有bug。
休眠排序
你可以通过多种排序算法,以任意顺序对数字数组进行排序,甚至可以调用JavaScript自带的sort函数。然而,最近我遇到了下面这段代码,它利用setTimeout对数组进行升序排序:
const numbers = [1, 23, 35, 80, 11, 99, 45]
numbers.forEach((number) => setTimeout(() =>
console.log(number), number)
)
// 1 11 23 35 45 80 99
惊不惊喜?
其实,这段代码有时候也不管用。由于JavaScript的异步特性以及事件循环的处理方式,这段代码可能会失灵。
总结
文本提及的三段代码纯属娱乐,请不要在生产应用程序中使用,也千万不要作为技术面试的考题。
你是否也遇到过这般神奇的JavaScript代码?如果有的话,请在下方留言。感谢你的阅读!
原文链接:https://betterprogramming.pub/3-fun-javascript-code-snippets-that-might-surprise-you-33be87c7fbd5
声明:本文由CSDN翻译,转载请注明来源。