Js中==与===

Js中==与===

JavaScript中提供==相等运算符与===严格相等运算符,建议是只要变量的数据类型能够确定,一律使用===,各种类型的值的比较可以参考Js真值表

==相等运算符#

==在判断相等时会进行隐式的类型转换, 其比较遵循一些原则,即先转换类型再比较。

  • 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值,即是调用Number()方法。
  • 如果一个操作数是字符串,另一个是数值,在比较相等性之前先将字符串转换为数值,同样调用Number()方法。
  • 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()toString()方法把对象转换成基础类型的值再比较,除Date对象外,会优先尝试使用valueOf()方法,用得到的基本类型按照前面的规则进行比较。
  • 以及null == undefined,此外任何其他组合,都不相等。
Copy
1 == true //true // Number Boolean 2 == true //false 1 == "1" //true // Number String [] == "" //true // Object String [] == false // true // Object Boolean [] == 0 //true // Object Number [] == {} //false [] == [] //false {} == {} //false null == undefined //true

在使用的时候可能会出现一些问题。

Copy
0 == "0" //true 0 == [] //true "0" == [] // false

如果是直接实现了valueOf()toString()的方法,而不是调用原型链上的Object.prototype.valueOf()Object.prototype.toString()方法,甚至能够产生异常。

Copy
var obj = {valueOf: function(){ return {} }, toString: function(){ return {}}} console.log(obj == 0) // Uncaught TypeError: Cannot convert object to primitive value

===严格相等运算符#

===先判断类型再比较,类型不同直接不相等。
ES6数据类型有NumberStringBooleanObjectSymbolnullundefined

Copy
1 === true //false 1 === "1" //false [] === "" //false null === undefined //false

if#

if()也可以看作是一个单独的运算符类别。

Copy
if(true) console.log("exec"); //exec if(false) console.log("exec"); if(1) console.log("exec"); //exec if(0) console.log("exec"); if(-1) console.log("exec"); //exec if("true") console.log("exec"); //exec if("1") console.log("exec"); //exec if("0") console.log("exec"); //exec if("") console.log("exec"); if(null) console.log("exec"); if(undefined) console.log("exec"); if("null") console.log("exec"); //exec if("undefined") console.log("exec"); //exec if([]) console.log("exec"); //exec if({}) console.log("exec"); //exec if([0]) console.log("exec"); //exec if(NaN) console.log("exec");

每日一题#

Copy
https://github.com/WindrunnerMax/EveryDay

参考#

Copy
https://www.zhihu.com/question/31442029 https://thomas-yang.me/projects/oh-my-dear-js/ https://dorey.github.io/JavaScript-Equality-Table/#three-equals
posted @   WindRunnerMax  阅读(3673)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
CONTENTS