js之你意想不到的输出结果

本文探讨JavaScript中布尔值与数组转换的规则,例如true+false的结果,稀疏数组的length属性,以及浮点数精度问题。通过实例解析了数组连接、数字与布尔值转换的细节,并介绍了如何利用Number.EPSILON解决浮点数比较问题。同时,文章幽默地提出了一些不寻常的数组转换技巧。
摘要由CSDN通过智能技术生成

前言: 因为无意中看到了这个神奇的网站,题目都很有意思,也可以对js的知识点查漏补缺

1. true + false

 console.log(true + false)   // 1

解析:两个布尔值相加,会先转成数字,再相加
转数字规则: true为 1, false为 0,
补充一下其他的转数字规则: null为 0, undefined为 NaN,symbol会报错,字符串看内容,如果是数字或者进度制就正常转,否则就NaN

2. [,,,].length (此时[ ]内为三个英文逗号,用英文写,只有显示了1个“,”,所以用中文逗号代替啦)

 console.log([,,,].length)  // 3

解析:[,]称之为稀疏数组,“,”之间的元素为empty
详细知识点:

  1. 尾后逗号 (有时叫做“终止逗号”)在向 JavaScript 代码添加元素、参数、属性时十分有用。如果你想要添加新的属性,并且上一行已经使用了尾后逗号,你可以仅仅添加新的一行,而不需要修改上一行。
  2. 如果使用了多于一个尾后逗号,会产生省略(elision,或者间隙 hole)。 带有间隙的数组叫做稀疏数组。

3. [1,2,3] + [4,5,6]

 console.log([1,2,3] + [4,5,6])   // 1,2,34,5,6

解析:把数组转成字符串再拼接,这题蛮好理解啦

但是,我想,如果您真的想将数组转换为逗号分隔的字符串并将它们组合起来,您可以编写如下愚蠢的代码(此处网站原话,笑到俺啦~):

 console.log([1,2,3] + [,4,5,6])    // 1,2,3,4,5,6
 console.log([1,2,3,""] + [4,5,6])  // 1,2,3,4,5,6

4. 0.1 + 0.2 === 0.3

 console.log(0.1 + 0.2 === 0.3)   // false

俺们先看一下0.1 + 0.2的输出结果:0.30000000000000004
怎么不是0.3呢?是不是很疑惑,反正俺这个菜鸡还蛮疑惑的!?

解析:js的number类型是浮点型,浮点型是用二进制表示的,但是二进制浮点数表示法并不能精确的表示类似 0.1 这样 的简单的数字,会有舍入误差。
不过ES6新增了Number.EPSILON来解决这个问题
Number.EPSILON: 表示 1 与大于 1 的最小浮点数之间的差。

Number.EPSILON测试是否相等:

 let x = 0.2
 let y = 0.3
 let z = 0.1
 // Math.abs: 返回数字的绝对值
 let equal = (Math.abs(x - y + z) < Number.EPSILON)
 console.log(equal)  // true

如果你想让他们相等:可以使用toFixed(1),进行四舍五入啦

5. !!""

 console.log(!!"")  // false

解析:首先明白!的作用: ! 的用法是比较灵活的,它除了做逻辑运算常常会用!做类型判断,可以用!与上对象来求得一个布尔值
转布尔值规则: undefined、null、false、NaN、" "、 0、-0都转为false,其他所有值转为true, 包括所有对象
所以 !""取反,输出为true,!!""再取反,最后结果为false

6. =!![ ]

console.log(+!![])  // 1

解析:[ ]先转布尔值,再转数字

  1. 转布尔,[ ] 转为true,![ ] 为false, !![ ] 为true
  2. 转数字,true 转数字为 1

结语:此文乃菜鸟的成长之路,哈哈哈,其中有写得不对的地方,还望多多指教交流哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值