双等号的困惑(js的问题)

简介: 双等号的困惑(js的问题)

JavaScript 的一个便利之处在于,它会自动将布尔上下文中引用的任何值强制为布尔值。但在有些情况下,这可能会让人困惑,因为它很方便。例如,下面的一些情况对许多JavaScript开发者来说是很麻烦的。

// 下面结果都是 'true'
console.log(false == '0');
console.log(null == undefined);
console.log(" \t\r\n" == 0);
console.log('' == 0);
 
// 下面也都成立
if ({}) // ...
if ([]) // ...

关于最后两个,尽管是空的(大家可能会觉得他们是 false),{}和[]实际上都是对象,任何对象在JavaScript中都会被强制为布尔值 "true",这与ECMA-262规范一致。


正如这些例子所表明的,类型强制的规则有时非常清楚。因此,除非明确需要类型强制,否则最好使用===和!==(而不是==和!=),以避免强制类型转换的带来非预期的副作用。(== 和 != 会自动进行类型转换,而 === 和 !== 则相反)


另外需要注意的是:将NaN与任何东西(甚至是NaN)进行比较时结果都是 false。因此,不能使用双等运算符(==, ==, !=, !==)来确定一个值是否是NaN。如果需要,可以使用内置的全局 isNaN()函数。

console.log(NaN == NaN);    // False
console.log(NaN === NaN);   // False
console.log(isNaN(NaN));    // True
相关文章
|
4月前
|
JavaScript iOS开发
js常用的代码有哪些 老司机带你来看看
js常用的一些代码分享给大家
26 4
|
4月前
|
JavaScript 前端开发 Java
JS经常碰见的报错问题
JS经常碰见的报错问题
|
5月前
|
JavaScript 前端开发 Java
前端知识点03(JS)
前端知识点概览:了解JS中的this指向,包括全局、函数、new、apply/call/bind及箭头函数的规则。理解script的async和defer属性对脚本加载和执行的影响。探讨setTimeout和setInterval的用法及其在性能上的考量。ES6与ES5的区别在于新语法特性,如let/const、箭头函数、模板字符串、模块化、类和继承等。此外,ES6还引入了Symbol、解构赋值、默认参数、Map/Set和Generator等功能。别忘了点赞和支持作者哦!
43 1
|
5月前
|
存储 JavaScript 前端开发
js必备知识小结(一)
js必备知识小结(一)
30 0
|
5月前
|
存储 JSON JavaScript
js必备知识小结(二)
js必备知识小结(二)
32 0
|
JavaScript 前端开发 算法
js基础,我来帮你
js基础,我来帮你
83 0
js基础,我来帮你
|
存储 JavaScript 前端开发
重温js——js语法基础
在变量声明这里,大家肯定还记得。所有的js 在使用的时候需要进行声明。也就是在内存地址中开辟一个空间。然后等待数据的"入住"
重温js——js语法基础
|
JavaScript
JS查漏补缺——神奇的this
JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来理解一下面试题常考的this的指向
127 0
|
JavaScript
一道有趣Js面试题,你有几种办法解决?
引子: 今天写了手撕instanceof,以我的风格来说,再写一篇今天已经算是高产了~但是,我真的忍不住想把这个题给大家分享一下,特别有意思,e.g. 说 var 一个 a 等于什么的时候,它即1,又2,还==3 ?
80 0