你一定不知道的JavaScript等号运算符( `==和===` )
来源:互联网 发布:开战传奇网站源码 编辑:程序博客网 时间:2024/06/18 16:26
你不知道的JavaScript等号运算符( ==和===
)
JavaScript中共有2个个判断相等的运算符
== 和 ===
。这2个运算符的差别在于
==
在判断相等的时候会进行类型的转换,而===
则不会进行类型转换。
一、===
运算符
===
一般称之为严格相等。用来判断两个操作数是否严格相等。
判断规则:
- 首先判断两个操作数的类型是否一致,如果不一致就直接认为不等。
- 如果两个操作数的类型一致,则再判断内容是否相等。
"true" === true // 类型不一致, false"0" === 0 //类型不一致 false"1" === "1" //类型一致,并且内容也一致。 true
注意:
- 如果使用
===
判断2个对象类型的数据,则直接判断这 2 个对象是否为同一个对象。- 如果一边是对象类型,一边是基本类型则一定不等。
{} === {} // 两边都是对象,但是不是同一个对象,所以 false[] === [] // 两边都是对象,但是不是同一个对象,所以 false[] === "" // 一变是对象类型,一边是基本类型,所以false
二、==
运算符
==
运算符判断相等,由于涉及到类型的强制转换,所以最为复杂。
需要从4个方面来进行分析:
- 两边都是基本类型,且类型相同
- 两边都是对象
- 两边都是基本类型,但是类型不同
- 一边是基本类型,一边是对象
2.1 两边都是基本类型,且类型相同
这个最简单,就看内容是否相等即可。
2.2 两边都是对象
这个也简单,规则和 ===
一样,也是判断两个对象是否为同一个对象。
2.3 两边都是基本类型,但是类型不同
这个规则比较复杂,很多人也记不住那么多的规则。
经过我的分析和总结,其实这个规则只有一条:
两边基本类型不等时,会把两边的数据都转向number之后再进行比较
看下面的代码:
"" == 0 // true . 空字符串转换为数字 0"10" == 10 // true 字符串 "10" 转换为数字 10"1" == true // true 字符串 "1" 转换为数字 1 ,布尔值true转换为数字 1"false" == false // false 字符串 "false"转换为NaN false转换为数字0undefined == "0" // false undefined 转换为 NaN2 == true // false "2" == true // false2 == false // false
注意:有2个特殊情况,需要特别注意。
null == 0 // false . null并没有转换为0null == undefined // true
2.4 一边是基本类型,一边是对象
这个规则也比较复杂,需要以2.3的规则为基础。
经过我的分析和总结,其实规则只有 2 条:
这种情况比较的时候,都是先把对象转换成基本类型再去比较!
- 先调用对象的
valueOf
方法,如果返回值值是基本类型的数据,就用这个返回的基本类型的数据去比较。- 如果
valueOf
方法的返回值不是基本类型的数据,则调用toString
方法,然后使用toString
的返回值进行比较。
注意:关于valueOf
和toString
方法的说明:
- 这个两个方法是在
Object.prototype
对象中定义的,所以所有的对象都会继承这两个方法。 - 默认情况下
valueOf
是返回的这个对象的本身(内部其实是返回的this)。 - 默认情况下
toString
返回的是字符串: [object Object] - 但是有些内置对象 覆写 了这2个方法。
console.log([1, 2].toString()); // "1,2" 返回的是数组的元素用,连接起来的字符串console.log(/a/gi.toString()); // "/a/gi" 正则表达式的字面量字符串console.log((function(){//注释}).toString()); // "function(){//注释}" 返回函数源码console.log(new Number(10).toString()); // "10" 返回对应的基本类型的字面量形式console.log(({}).toString()); // "[object Object]"
看下面的代码:
var obj1 = { name : "李四"}/* true: 解析: 一边是对象,一边是字符串。则会把对象转换成基本类型。 先看valueOf ,默认返回的是 对象,所以再看toString 默认返回的是 "[object Object]" 所以是true */console.log(obj1 == "[object Object]"); // true
var obj1 = { name : "李四", valueOf : function (){ return 1; }}/* true: 解析: 一边是对象,一边是number。则会把对象转换成基本类型。 先看valueOf ,返回的是 number类型 1,所以用这个返回值去比较。 */console.log(obj1 == 1); // true
var obj1 = { name : "李四", valueOf : function (){ //覆写 return {}; }, toString : function (){ // 覆写 return this.name; }}/* true: 解析: 一边是对象,一边是String。则会把对象转换成基本类型。 先看valueOf ,返回的是 对象,所以调用toString,返回的是字符串 "李四"。 */console.log(obj1 == "李四"); // true
var arr = [1, 2];/* true: 解析: 一边是对象,一边是字符串。则会把对象转换成基本类型。 先看valueOf ,默认返回的是 对象,所以调用toString,返回的是字符串 "1,2"。 */console.log(arr == "1,2"); // true
var arr = [1, 2];arr.valueOf = function (){ return true;}/* true: 解析: 一边是对象,一边是字符串。则会把对象转换成基本类型。 先看valueOf ,默认返回的是 布尔值 true,然后把true转换成number 1, 右边是字符串,然后把字符串转换number 1 所以true */console.log(arr == "1");
三、总结
===
一句话总结:先看类型,类型相同再比较内容。类型不同,直接false
==
一句话总结:不同基本类型,则都向numbe方向转,然后比较。 一边对象一边基本类型,则对象先调用valueOf,再调用toString来转成基本类型,再比较。
阅读全文
4 0
- 你一定不知道的JavaScript等号运算符( `==和===` )
- JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
- JavaScript中两个等号(“==”)和三个等号(“===”)的区别
- JS/JavaScript中两个等号 == 和 三个等号 === 的区别
- 赋值运算符“=”与等号运算符“==”
- 浅析JavaScript和PHP中三个等号(===)和两个等号(==)的区别
- 浅析JavaScript和PHP中三个等号(===)和两个等号(==)的区别
- 浅析JavaScript和PHP中三个等号(===)和两个等号(==)的区别
- JavaScript 中 的等号(==)/不等号(!=) 和全等号(===)/非全等号(!==) 的用法
- 浅析JavaScript中三个等号(===)和两个等号(==)的区别
- javascript中的两等号(==)和三等号(===)区别
- 得载等号=运算符在什么时候调用
- 等号(==)和全等号(===)及非全等号(!==)的区别
- JavaScript quirk 3: 标准的等号(==)
- javascript中的“=”等号个数问题的讨论
- 你知道不 实体类的名称一定一定一定要和数据库中表的名字一致!
- 三个等号和两个等号的区别(“===”与“==”的区别)
- js中两个等号(==)和三个等号(===)的区别
- TJU1188Tian Ji -- The Horse Racing田忌赛马
- 验证码之字符分割&GUI显示
- 模拟实现库函数
- PAT-A-1079. Total Sales of Supply Chain (25)
- ztree刷新后依然保持之前的选中节点状态
- 你一定不知道的JavaScript等号运算符( `==和===` )
- Robot Framework自动化测试-定位动态元素
- LeetCode 121. Best Time to Buy and Sell Stock
- MySQL5.6 首次使用更新密码
- java字符串常量池
- Javascript做的贪食蛇
- 游戏开发实习生的面试总结
- Jquery高级编程(二)【性能优化篇】
- 【React Native】React Native的bind方法