【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代码,结果出乎意料相关推荐

  1. 翻译-高质量JavaScript代码书写基本要点(转载)

    by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=1173 原文作者:S ...

  2. 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点

    才华横溢的Stoyan Stefanov,在他写的由O'Reilly初版的新书<JavaScript Patterns>(JavaScript模式)中,我想要是为我们的读者贡献其摘要,那会 ...

  3. 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点(转)

    才华横溢的Stoyan Stefanov,在他写的由O'Reilly初版的新书<JavaScript Patterns>(JavaScript模式)中,我想要是为我们的读者贡献其摘要,那会 ...

  4. 编写高质量JavaScript代码绳之以法(The Essentials of Writing High Quality JavaScript)翻译...

    原文:The Essentials of Writing High Quality JavaScript 才华横溢的Stoyan Stefanov,在他写的由O'Reilly初版的新书<Java ...

  5. 一行神奇的javascript代码

    一行神奇的javascript代码 一行神奇的JS代码,是在一个博客园里面看到的,当时我就震惊了,这不就是传说中的ZB神奇么- - 哈哈(果断转载过来). 写本篇文章的缘由是之前群里@墨尘发了一段js ...

  6. 如何编写高质量JavaScript代码

    书写可维护的代码(Writing Maintainable Code ) 软件bug的修复是昂贵的,并且随着时间的推移,这些bug的成本也会增加,尤其当这些bug潜伏并慢慢出现在已经发布的软件中时.当 ...

  7. javascript 代码_如何使您JavaScript代码保持简单并提高其可读性

    javascript 代码 by Leonardo Lima 莱昂纳多·利马(Leonardo Lima) 如何使您JavaScript代码保持简单并提高其可读性 (How to keep your ...

  8. javascript 代码_代码简介:2016年JavaScript的现状

    javascript 代码 Here are three stories we published this week that are worth your time: 这是我们本周发布的三个值得您 ...

  9. js如何运行python代码_python中执行javascript代码

    python中执行javascript代码: 1.安装相应的库,我使用的是PyV8 2.import PyV8 ctxt = PyV8.JSContext() ctxt.enter() func = ...

最新文章

  1. svn clean up 出错解决方案
  2. listview侧滑删除
  3. 如何在Spring MVC Test中避免”Circular view path” 异常
  4. mysql解决1055-Expression#22ofSELECT list is not in GROUP BY clause and contains nonaggregated column ‘
  5. php判断电脑浏览器模拟手机访问网页,在PC上测试移动端网站和模拟手机浏览器的5大方法...
  6. java实现逾期提醒_信用卡逾期后的5个阶段 你都知道吗?
  7. C++: 对字符串转换字符集(编码)
  8. 14. YAML(1)
  9. mysql 写出高性能sql 防止索引失效总结
  10. python返回类型为anytype_python - Zeep的SOAP请求(Python) - 堆栈内存溢出
  11. 不使用80,443,端口,域名还需要备案吗?域名没有备案应该怎么选服务器。
  12. docker端口映射突然无效
  13. GBase 8s 编写使用UDR(C/Java)
  14. 字符串与Unicode编码相关转换
  15. Java实验1:个人银行账户管理系统总结
  16. 【论文笔记】煤矿井下UWB人员定位系统研究
  17. 纷享销客百思特 | 数字化营销赋能企业新增长沙龙圆满落幕
  18. 计算机学的痛苦可以换专业,在大学里选错了专业,是一种怎样的“痛苦”体验?...
  19. matplotlib中箱线图、极线图、阶梯图的绘制
  20. Cholesky分解(Matlab代码实现)

热门文章

  1. 【MySql】100问
  2. 排序算法第五篇——快速排序
  3. mongo 让字段自增或自减
  4. 爬虫初窥day1:urllib
  5. 洛谷P2881 [USACO07MAR]排名的牛Ranking the Cows(bitset Floyd)
  6. Map之一个Key存多个Value的MultiValueMap(一个键多个值)
  7. Atitit.json xml 序列化循环引用解决方案json
  8. 寒假汇编语言作业(11)
  9. 拒绝平庸——浅谈WEB登录页面设计
  10. db2 常用命令(二)