Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一个有趣又棘手的 JavaScript 示例库

一个有趣又棘手的 JavaScript 示例库

作者头像
程序员老鱼
发布于 2023-05-23 11:32:50
发布于 2023-05-23 11:32:50
34600
代码可运行
举报
文章被收录于专栏:前端实验室前端实验室
运行总次数:0
代码可运行

JavaScript 是一个非常有趣的语言,但同时也充满了各种奇怪的行为。这些奇怪的行为有时会搞砸我们的日常工作,有时则会让我们忍俊不禁。

WTFJS 这个开源项目的初衷只是因为好玩。收集一些疯狂的例子,并尽可能解释它们的原理,学习以前不了解的知识。

如果你是初学者,您可以根据此笔记深入了解 JavaScript。

如果你是专业开发人员,你将从这些例子中看到人见人爱的 JavaScript 也充满了非预期的边界行为。

总之,古人云:三人行,必有我师焉。我相信这些例子总能让你学习到新的知识。

这里拿出来几个例子看一下:

1.null 是假值,但又不等于 false

尽管 null 是假值,但它不等于 false。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!!null; // -> false
null == false; // -> false

但是,别的被当作假值的却等于 false,如 0 或 ''。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0 == false; // -> true
"" == false; // -> true
2. 数组相加

如果你尝试将两个数组相加:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[1, 2, 3] + [4, 5, 6]; // -> '1,2,34,5,6'

💡 说明:数组之间会发生串联。步骤如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[1, 2, 3] +
  [4, 5, 6][
    // 调用 toString()
    (1, 2, 3)
  ].toString() +
  [4, 5, 6].toString();
// 串联
"1,2,3" + "4,5,6";
// ->
("1,2,34,5,6");
3. 最小值大于零

Number.MIN_VALUE 是最小的数字,大于零:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Number.MIN_VALUE > 0; // -> true

💡 说明:Number.MIN_VALUE 是 5e-324,即可以在浮点精度内表示的最小正数,也是在该精度内无限接近零的数字。它定义了浮点数的最高精度。

现在,整体最小的值是 Number.NEGATIVE_INFINITY,尽管这在严格意义上并不是真正的数字。

— StackOverflow 上的“为什么在 JavaScript 中 0 小于 Number.MIN_VALUE?”

https://stackoverflow.com/questions/26614728/why-is-0-less-than-number-min-value-in-javascript

4. true 和 false 的数学运算

做一下数学计算:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
true + true; // -> 2
(true + true) * (true + true) - true; // -> 3

嗯……🤔

💡 说明:我们可以用 Number 构造函数将值强制转化成数值。很明显,true 将被强制转换为 1 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Number(true); // -> 1

一元加运算符会尝试将其值转换成数字。它可以转换字符串形式表达的整数和浮点数,以及非字符串值 true、false 和 null。如果它不能解析特定的值,它将转化为 NaN。这意味着我们可以有更简便的方式将 true 转换成 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+true; // -> 1

当你执行加法或乘法时,将会 ToNumber 方法。根据规范,该方法的返回值为:

如果参数是 true,返回 1。如果参数是 false,则返回 +0。

因此我们可以将布尔值相加并得到正确的结果

5. 三个数字的比较
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 < 2 < 3; // -> true
3 > 2 > 1; // -> false

💡 说明:为什么会这样呢?其实问题在于表达式的第一部分。以下是它的工作原理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 < 2 < 3; // 1 < 2 -> true
true < 3; // true -> 1
1 < 3; // -> true

3 > 2 > 1; // 3 > 2 -> true
true > 1; // true -> 1
1 > 1; // -> false

我们可以用 大于或等于运算符(>=):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
3 > 2 >= 1; // true

了不起只是列举了几个例子,现在开发各种工具、三方库,很多人特别是刚入门的小伙伴对于这些基础技能还真是没仔细了解过,这个项目收集一些JavaScript的例子,并尽可能解释它们的原理,值得看看学习一下。

项目地址:https://github.com/denysdovhan/wtfjs

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
炫技!JavaScript 的花式玩法
JavaScript 是一个伟大的语言。它有简单的语法,完善的生态系统,更重要的,有一个庞大的社区。
疯狂的技术宅
2019/03/28
1.6K0
炫技!JavaScript 的花式玩法
25 道神奇的 javascript 示例,全答对算我输!!!
JavaScript 是一种很好的语言。它有一个简单的语法,庞大的生态系统,以及最重要,最伟大的社区。同时,我们都知道,JavaScript 是一个非常有趣又充满戏法的语言。 他们中的有些可以迅速将我们的日常工作变成地狱,有些可以让我们大声笑起来。
@超人
2021/09/17
1.1K0
3《JavaScript高级程序设计》__ 语言基础(上)
大家好,我是HoMeTown,web领域有一本神书大家应该都有看过,这本书我看过两遍,但是每次看都是粗粗的略过一些重要的知识点,甚至一些面试过程中的问题,在这本书里都能找到答案。
HoMeTown
2022/10/26
6820
3《JavaScript高级程序设计》__ 语言基础(上)
Javascript:Javascript数据类型详解
  要成为一个优秀的前端工程师,系统的学习Javascript,有夯实的Javascript基础,以及对语言本身的深刻的理解,是基本功。从Javascript数据类型开始,我将对Javascript知识体系进行系统的梳理。
王金龙
2019/02/25
8540
探秘 JavaScript 世界的神秘数字 1.7976931348623157e+308
JavaScript 的 Number 对象中存储了很多常量,神秘数字 1.7976931348623157e+308 就在其中,打开浏览器 Console,输入 Number.MAX_VALUE,就会得到这个数字:
清秋
2022/09/20
1.9K0
探秘 JavaScript 世界的神秘数字 1.7976931348623157e+308
JavaScript Number 对象(下)
NaN 属性是代表非数字值的特殊值。该属性用于指示某个值不是数字。可以把 Number 对象设置为该值,来指示其不是数字值。
陈不成i
2021/07/20
3240
大话 JavaScript(Speaking JavaScript):第十一章到第十五章
JavaScript 对所有数字都使用单一类型:它将它们全部视为浮点数。但是,如果小数点后没有数字,则不显示小数点:
ApacheCN_飞龙
2024/01/12
6890
JavaScript——语法与数据类型
ECMA5引入了严格模式的概念。严格模式是为JavaScript定义了一种不同的解析与执行模型。在严格模式下,ECMA3中的一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误。要在整个脚本中启用严格模型,可以在顶部添加b编译指示代码,告诉JavaScript引擎切换到严格模式:
喝茶去
2019/04/16
6000
JavaScript 浮点数之迷:大数危机
在 JavaScript 中浮点数运算时经常出现 0.1+0.2=0.30000000000000004 这样的问题,除了这个问题之外还有一个不容忽视的大数危机(大数处理丢失精度问题),也是近期遇到的一些问题,做下梳理同时理解下背后产生的原因和解决方案。
五月君
2020/02/19
1.5K0
「硬核JS」数字之美
一直都在佛系更新,这次佛系时间有点长,很久没发文了,有很多小伙伴滴我,其实由于换工作以及搬家的原因,节奏以及时间上都在调整,甚至还有那么一小段时间有点焦虑,你懂的,现已逐渐稳定,接下来频率应该就会高了,奥利给~
isboyjc
2022/03/28
5.7K0
「硬核JS」数字之美
关于数字的前端面试题
写在前面,总结面试题不一定是为了准备面试,更是对于自己的一种温故知新,了解自己知识的熟练度和理解度。 问题一览 如何判断一个值是否为NaN?运行环境内建的方法isNaN()有坑 如何判断两个浮点数相等
用户1687375
2018/06/08
1.4K0
ECMAScript数据类型关系总结
ECMAScript 有 5 种原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String
csxiaoyao
2019/02/15
8670
【JS】125-重温基础:数字
前置基础: 在JavaScript中,数字为双精度浮点类型(即一个数字范围只能在-(253-1)和(253-1)之间),整数类型也一样。 另外数字类型也可以是以下三种符号值:
pingan8787
2020/05/13
2.6K0
javascript(二):数据类型&数值
第一部分:数据类型 javascript数据类型通常来说是6种(ES6新增第七种Symbol类型) number:数值 string:字符串 boolean:布尔类型,true或false undefined:未赋值 null:空,值是“无”的状态 object:对象 通常number,string,boolean称为原始类型(primitive type)的值,即最基本的值,不能继续细分;而对象称为合成类型(complex type)的值,一个对象往往是多个原始类型的合成;而undefined和null是
用户1149564
2018/01/11
1.5K0
javascript(二):数据类型&数值
JavaScript第一节
在javascript中表示一个数字,除了有我们常用的十进制11, 22,33等,还可以使用八进制、十六进制表示等。
用户3461357
2019/08/02
8330
【面试说】聊聊JavaScript中的数据类型
答:Javascript 中的数据类型包括原始类型和引用类型。其中原始类型包括 Null、Undefined、Boolean、Number、String、Symbol、BigInt。引用类型指的是 Object。
GopalFeng
2022/08/01
5800
【面试说】聊聊JavaScript中的数据类型
JavaScript的数据类型
该类型只有一个值undefined。对未声明和未初始化的变量执行typeof操作符都返回undefined
小小鱼儿小小林
2020/06/24
7760
踩坑记:当 JavaScript 遇上 UINT 64
作者:link 导语 写下这篇文章的缘由是因为在项目过程中,碰到了一个使用JavaScript处理 UINT64 类型数字的坑。 与大部分现代编程语言(包括几乎所有的脚本语言)一样,JavaScr
腾讯IVWEB团队
2017/04/12
4.8K0
JavaScript变量和数据类型
1.JavaScript变量 javascript的变量是松散类型的(弱类型),也就是说一个变量可以用来保存任何类型的数据,每个变量仅仅是用来保存值的占位符。变量的声明用var操作符来定义,如 var message;也可以多个变量一起定义,如var a,b,c;用逗号隔开每个变量。 var message ; var message;//message为初始化,值为undefined message=12;//message值为12; message="hello";//message 值为hello;
水击三千
2018/02/27
1.4K0
JavaScript 数字相关的属性方法
本文遵守创作共享CC BY-NC-SA 4.0协议 网络平台如需转载必须与本人联系确认。
前端GoGoGo
2018/08/24
5880
相关推荐
炫技!JavaScript 的花式玩法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验