三段诡异的JavaScript代码,结果出乎意料
【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) // 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翻译,转载请注明来源。
三段诡异的JavaScript代码,结果出乎意料相关推荐
- 翻译-高质量JavaScript代码书写基本要点(转载)
by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=1173 原文作者:S ...
- 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点
才华横溢的Stoyan Stefanov,在他写的由O'Reilly初版的新书<JavaScript Patterns>(JavaScript模式)中,我想要是为我们的读者贡献其摘要,那会 ...
- 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点(转)
才华横溢的Stoyan Stefanov,在他写的由O'Reilly初版的新书<JavaScript Patterns>(JavaScript模式)中,我想要是为我们的读者贡献其摘要,那会 ...
- 编写高质量JavaScript代码绳之以法(The Essentials of Writing High Quality JavaScript)翻译...
原文:The Essentials of Writing High Quality JavaScript 才华横溢的Stoyan Stefanov,在他写的由O'Reilly初版的新书<Java ...
- 一行神奇的javascript代码
一行神奇的javascript代码 一行神奇的JS代码,是在一个博客园里面看到的,当时我就震惊了,这不就是传说中的ZB神奇么- - 哈哈(果断转载过来). 写本篇文章的缘由是之前群里@墨尘发了一段js ...
- 如何编写高质量JavaScript代码
书写可维护的代码(Writing Maintainable Code ) 软件bug的修复是昂贵的,并且随着时间的推移,这些bug的成本也会增加,尤其当这些bug潜伏并慢慢出现在已经发布的软件中时.当 ...
- javascript 代码_如何使您JavaScript代码保持简单并提高其可读性
javascript 代码 by Leonardo Lima 莱昂纳多·利马(Leonardo Lima) 如何使您JavaScript代码保持简单并提高其可读性 (How to keep your ...
- javascript 代码_代码简介:2016年JavaScript的现状
javascript 代码 Here are three stories we published this week that are worth your time: 这是我们本周发布的三个值得您 ...
- js如何运行python代码_python中执行javascript代码
python中执行javascript代码: 1.安装相应的库,我使用的是PyV8 2.import PyV8 ctxt = PyV8.JSContext() ctxt.enter() func = ...
最新文章
- svn clean up 出错解决方案
- listview侧滑删除
- 如何在Spring MVC Test中避免”Circular view path” 异常
- mysql解决1055-Expression#22ofSELECT list is not in GROUP BY clause and contains nonaggregated column ‘
- php判断电脑浏览器模拟手机访问网页,在PC上测试移动端网站和模拟手机浏览器的5大方法...
- java实现逾期提醒_信用卡逾期后的5个阶段 你都知道吗?
- C++: 对字符串转换字符集(编码)
- 14. YAML(1)
- mysql 写出高性能sql 防止索引失效总结
- python返回类型为anytype_python - Zeep的SOAP请求(Python) - 堆栈内存溢出
- 不使用80,443,端口,域名还需要备案吗?域名没有备案应该怎么选服务器。
- docker端口映射突然无效
- GBase 8s 编写使用UDR(C/Java)
- 字符串与Unicode编码相关转换
- Java实验1:个人银行账户管理系统总结
- 【论文笔记】煤矿井下UWB人员定位系统研究
- 纷享销客百思特 | 数字化营销赋能企业新增长沙龙圆满落幕
- 计算机学的痛苦可以换专业,在大学里选错了专业,是一种怎样的“痛苦”体验?...
- matplotlib中箱线图、极线图、阶梯图的绘制
- Cholesky分解(Matlab代码实现)