Js中==与===

Js中==与===

JavaScript中提供==相等运算符与===严格相等运算符,建议是只要变量的数据类型能够确定,一律使用===

==相等运算符

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

  1. 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值,即是调用Number()方法
  2. 如果一个操作数是字符串,另一个是数值,在比较相等性之前先将字符串转换为数值,同样调用Number()方法
  3. 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()toString()方法把对象转换成基础类型的值再比较,除Date对象外,会优先尝试使用valueOf()方法,用得到的基本类型按照前面的规则进行比较。
  4. 以及null == undefined,此外任何其他组合,都不相等。
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

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

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

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

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

===严格相等运算符

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

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

if

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

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");

参考

https://www.zhihu.com/question/31442029
https://dorey.github.io/JavaScript-Equality-Table/#three-equals

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • more命令

    more命令类似less,以分页的形式浏览文件内容,在more命令退出后会在shell上留下操作的内容,在分页浏览时使用h键输出说明文件。

    WindrunnerMax
  • Js获取数据类型

    JavaScript有着七种基本类型String、Number、Boolean、Null、Undefined、Symbol、Object,前六种为基本数据类型,...

    WindrunnerMax
  • Vue中$nextTick的理解

    Vue中$nextTick方法将回调延迟到下次DOM更新循环之后执行,也就是在下次DOM更新循环结束之后执行延迟回调,在修改数据之后立即使用这个方法,能够获取更...

    WindrunnerMax
  • 《你不知道的JavaScript》 (中) 阅读摘要

    本书属于基础类书籍,会有比较多的基础知识,所以这里仅记录平常不怎么容易注意到的知识点,不会全记,供大家和自己翻阅;

    前端下午茶
  • 数据类型判断Object.prototype.toString.call

    越学习越觉得基础的不牢固,不懂的,摸棱两可的,学了忘了的,在从入门到放弃的路上一直走着。今天分享一下数据类型判断的方法。

    wade
  • 前端面试题 原

    我们在js的学习中,往往很多东西看过之后,一段时间不用,就忘记了。或者当时就没有深入的理解,能促使我们不断深入学习的动力最好的办法往往参加些面试,能找到自己的不...

    tianyawhl
  • 执行上下文

    解析: a)先填充参数,x:undefined;y:undefined;z:undefined; b)函数申明,在vo对象里有了function fn(){};...

    天天_哥
  • JS的数据类型/判断方法/栈与堆/深浅拷贝

    用来检测:undefined、string、number、boolean、symbol、object、function 无法检测引用类型里的Array

    杨肆月
  • 从零开始学 Web 之 ES6(六)ES6基础语法四

    在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享一些好玩的项目。现在就让我们一起进入 Web 前端学习的冒险之旅吧!

    Daotin
  • Fork/Join框架原理和使用探秘 顶

    Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。也是当前...

    算法之名

扫码关注云+社区

领取腾讯云代金券