热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript相等运算符匹配规则

JavaScript的等号有=,==,===三个运算符虽然都读成“等于”,但概念是不一样的,=指的是赋值;==称为相等运算符,比较的是两个操作数值是否相等;===称为严格相等运算符,比较的是

Javascript的等号有=,==,===三个运算符虽然都读成“等于”,但概念是不一样的,=指的是赋值;==称为相等运算符,比较的是两个操作数值是否相等;===称为严格相等运算符,比较的是两个操作数是否是“完全相同”。

一般情况下我们尽量使用“===”来精确判断,在判断对象属性和函数参数是否存在时可以使用“==”。

用于判断对象的属性是否存在 let obj = {}; if( obj.a == null ) { //这里相对于:obj.a === null || obj.a === undefined 的简写形式,jquery源码的推荐写法 } 用于判断函数的参数是否存在 function fn( a, b ) { if( a == null ) { //这里也相当于 a === null || a === undefined 的简写 } }

严格相等运算符

说明: 严格匹配,不会类型转换,必须要数据类型和值完全一致。

先判断类型,如果类型不是同一类型的话直接为false; 1 对于基本数据类型(值类型): Number,String,Boolean,Null和Undefined:两边的值要一致,才相等 console.log(null === null) // true console.log(undefined === undefined) // true 注意: NaN: 不会等于任何数,包括它自己 console.log(NaN === NaN) // false 2 对于复杂数据类型(引用类型): Object,Array,Function等:两边的引用地址如果一致的话,是相等的 arr1 = [1,2,3]; arr2 = arr1; console.log(arr1 === arr2) // true

相等运算符

相等运算符(“==”)操作结果参照表
Javascript相等运算符匹配规则
image.png

比较规则:

1. 值的类型相同

应用严格相等运算符转换规则的值类型相同规则(除:操作数类型不同)。

2.不同原始类型值(string,boolean,number)

规则:如果是不同原始类型值(数字、字符串、布尔值)进行比较,有隐式类型转换,会将不是number类型的数据转成number

0 == undefined //false // 等同于 0 == Number(undefined) // 等同于0 == NAN 0 == null //false // 等同于 0 == Number(null) 1 == true // true // 等同于 1 == Number(true) 'true' == true // false // 等同于 Number('true') == Number(true) // 等同于 NaN === 1 '' == 0 // true // 等同于 Number('') == 0 // 等同于 0 == 0 '1' == true // true // 等同于 Number('1') == Number(true) // 等同于 1 == 1 'n 123 t' == 123 // true // 因为字符串转为数字时,省略前置和后置的空格 1 == ! "true" //false (1) 1 == !Boolean('true') (2) 1 == !true (3) 1 == false (4)1 ==Number(false) 0 == ! "true" //true

3. 对象和原始类型值

如果其中一个操作数是对象,另外一个是原始类型值(数字、字符串、布尔值),按如下规则:

将对象转换成原始类型值:先调用valueOf方法,然后调用toString方法
转换后的原始类型值与另一个操作数的类型一样,使用值类型相同的规则
如果不一样,将非数字类型转换成数字再进行比较。

valueOf:一般默认返回自身
数组的toString:默认会调用join方法拼接每个元素并且返回拼接后的字符串

例1:对象对比数字 [1] == 1 //true 解析: a. [1]先转换成原始值"1"; b. 转换后与右边的操作数1类型不一样,将"1"转换成1; c. 1 == 1 结果是true 例2:对象对比字符串 [1] == "1" 解析: a. [1]先转换成原始值"1"; b. 转换后与右边的操作数"1"类型一样,"1"=="1",结果是true; 例3:对象对比布尔值 [1] == true 解析: a. [1]先转换成原始值"1"; b. 转换后与右边的操作数true类型不一样,将右边的操作数true转换成1; c. 1 == 1 结果是true [].toString () ;//空字符串 {}.toString () ;//[object Object] 注意: 空数组的toString()方法会得到空字符串, 而空对象的toString()方法会得到字符串[object Object] (注意第一个小写o,第二个大写O哟) {} == '[object Object]';//true [ 1, 2, 3 ].valueOf().toString();//‘1,2,3’ [ 1, 2, 3 ] == "1,2,3" ;//true //(1)[1,2,3].toString() == '1,2,3' (2)'1,2,3' == '1,2,3'

4.都是复杂数据类型 :

只比较地址,如果地址一致则返回true,否则返回false

var arr1 = [10,20,30]; var arr2 = [10,20,30]; var arr3 = arr1;//将arr1的地址拷贝给arr3 console.log ( arr1 == arr2 );//虽然arr1与arr2中的数据是一样,但是它们两个不同的地址 console.log ( arr3 == arr1 );//true 两者地址是一样 console.log ( [] == [] );//false console.log ( {} == {} );//false

5. null和undefined

如果其中一个值是null,另外一个是undefined,结果是相等

console.log ( null == undefined );//true console.log ( null == null );//true console.log ( undefined == undefined );//true

6.NaN : NaN与任何数字都不等

规则:没有隐式类型转换,无条件返回false

console.log ( NaN == NaN );//false

总结

严格相等运算符的比较是不对操作数进行类型转换的,只要操作数类型不一致,返回就是false;
null和undefined是严格相等的,而NaN和任何类型的操作数都不会相等包括它自己。

相等运算符是会对操作数是不同的原始值类型,都转换成数字再进行比较;
如果是原始值类型和对象的比较,先调用valueOf方法转换为自身,然后调用toString方法转换成字符串,如果还是不同,都转换成数字再进行比较;

面试题

注意:八种情况转boolean得到false: 0 -0 NaN undefined null '' false document.all() [] == 0; //true (1) [].valueOf().toString() == 0 (2) Number('') == 0 (3) false == 0 (4) 0 == 0 console.log(![] == 0); //true // 逻辑非优先级高于关系运算符 ![] = false (空数组转布尔值得到true) [] == []; //false // [] 与右边逻辑非表达式结果比较 (1) [] == !Boolean([]) (2) [] == !true (3) [] == false (4) [].toString() == false (5)'' == false (6)Number('0') == Number(false) console.log([] == ![]); //true {} == {}; //false // {} 与右边逻辑非表达式结果比较 (1){} == !{} (2){} == !true (3){} == false (4){}.toString() == false (5)'[object Object]' == false (6)Number('[object Object]') == false console.log({} == !{}); //false

参考:
JS比较运算符(“===”和“==”)的匹配规则以及if()条件的判断结果
Javascript相等运算符的9条规则


推荐阅读
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
author-avatar
2012-随意_544
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有