查看原文
其他

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

Chirag Swadia 脚本之家 2022-04-23
 关注
脚本之家
”,与百万开发者在一起

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


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

以下为译文:

本人从事JavaScript开发已经7年了,但即便到了如今,我仍然会遇到一些令我瞠目结舌的代码片段。有时,我不禁纳闷JavaScript究竟是一门编程语言,还是一种魔法。

我知道很多人认为JavaScript是一门愚蠢的编程语言,bug很多,所以才有了这些“魔法片段”,但我认为JavaScript是一种通用且有趣的语言,而且它也是我养家糊口的手艺。

在本文中,我会介绍一些“魔法片段”。但是,我不建议你在生产应用程序中使用这类代码,因为这些代码片段只是为了理解概念,并对JavaScript产生敬畏之心。另外,在面试的时候千万不要问这类的问题,因为它们丝毫不能体现对JavaScript知识掌握的多少。这些只不过是在任何生产应用程序中都不会遇到的语言怪癖。


01

相等


虽然我不确定其他编程语言是否也会出现这种现象,但如下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/)


02

查找闰年


闰年需要满足以下两个条件:

  • 能够被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。


03

休眠排序 

你可以通过多种排序算法,以任意顺序对数字数组进行排序,甚至可以调用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的异步特性以及事件循环的处理方式,这段代码可能会失灵。


04

总结 


文本提及的三段代码纯属娱乐,请不要在生产应用程序中使用,也千万不要作为技术面试的考题。

你是否也遇到过这般神奇的JavaScript代码?如果有的话,请在下方留言。感谢你的阅读!

原文链接:https://betterprogramming.pub/3-fun-javascript-code-snippets-that-might-surprise-you-33be87c7fbd5

声明:本文由CSDN翻译,转载请注明来源。

看马云如何回应淘宝假货问题!

↓↓↓

参与上方视频号留言互动
每天会选出3名小伙伴获得 8.88元 红包

  推荐阅读:

开发中经常遇到的JavaScript问题整理(超实用)

Python和JavaScript——这两种流行的编程语言之间的主要区别是什么?

四种最令人讨厌的编程语言:Java、Javascript、C++和Perl

JavaScript 将死?

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存