三段诡异的JavaScript代码,结果出乎意料

2021年3月25日 606点热度 0人点赞 0条评论

图片

【CSDN 编者按】自学习前端以来,陆陆续续会遇见很多短小令人惊讶的js代码,很多人会认为这是bug的存在,但换个角度来看待,是不是会发生有趣的事情呢。


作者 | Chirag Swadia
译者 | 弯月
出品 | CSDN(ID:CSDNnews)

以下为译文:

本人从事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) // falseisLeapYear(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翻译,转载请注明来源。

图片

图片

图片

京东程序员回应“被猝死”;淘宝特价版已提交微信小程序;苹果 M1 单核性能勇超 Intel 11 代 i7|极客头条

自由软件之父回归 FSF,遭 1933 人、21 家组织联名抵制!

乔布斯18岁求职信拍卖价22.24万美元,值吗?

进退两难的硅谷程序员们

7820三段诡异的JavaScript代码,结果出乎意料

root

这个人很懒,什么都没留下

文章评论