一起来看看JavaScript中==和===有何不同
在JavaScript中还有一个另外一个运算符===
。那么这两者有何不一样呢?这篇文章就一起来看看JavaScript中==
和===
有何不同。
关系表达式
==
和===
都是JavaScript中的关系表达式运算符,与对应的还有!=
和!==
。
==
和===
运算符主要用于比较两个值是否相等。当然它们对相等的定义不尽相同。两个运算符允许任意类型的操作数,如果操作数相等则返回true
,否则返回false
。
==和===定义
==
和===
虽然都是关系表达式运算符,但它们的定义是有所不同的:
==
:称作相等运算符(Equality Operator),它用来检测两个操作是否相等,这里的相等的定义非常宽松,可以允许类型的转换===
:称作严格相等运算符(Strict Equality),也被称之为恒等运算符(Identity Operator)或全等运算符,它用来检测两个操作数是否严格相等
== 和 ===运算规则
JavaScript中==
和===
运算符,它们的运算都具有自己的运算规则。
==运算规则
==
运算符对于两个数比较并不严格。如果两个操作数不是同一类型,那么相等运算符会尝试进行一些类型转换,然后进行比较。
在转换不同的数据类型时,其会遵循下列基本原则:
如果两个操作数的类型相同,则会按照严格相等的比较规则一样,如果严格相等,那么比较结果为相等。如果它们不严格相等,则比较结果为不相等。
如果两个操作数的类型不同,==
相等操作符也可能会认为它们相等。检测相等将会遵守下面的规则和类型转换:
如果一个值是null
, 另一个是undefined
,则它们是相等:
null == undefined; // => true
如果一个值是数字,另一个是字符串,先将字符串转换为数值,然后使用转换后的值进行比较:
1 == '1'; // => true
如果其中一个值是true
,则将其转换为1
再进行比较。如果其中一个值是false
,则将其转换为0
再进行比较:
true == 0; // => false false == 1; // => false true == 1; // => true false == 0; // => true true == '1'; // => true false == '0';// => true
如果一个值是对象,另一个值是数字或字符串,将会先使用toString()
和valueOf()
将对象转换为原始值,然后再进行比较。
两个操作数在进行比较时则要遵循下列规则:
null
和undefined
是相等的- 要比较相等性之前,不能将
null
和undefined
转换成其他任何值 - 如果有一个操作是
NaN
,则相等操作符返回false
,而不相等操作符返回true
。重要提示: 即使两个操作数都是NaN
,相等操作符也返回false
,因为按照规则 ,NaN
不等于NaN
- 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回
true
,否则返回false
来看一下对象的比较:
var a = [1,2,3]; var b = [1,2,3]; var c = { x: 1, y: 2 }; var d = { x: 1, y: 2 }; var e = "text"; var f = "te" + "xt"; a == b // =>false c == d // =>false e == f // =>true
对于两个操作数var1==var2
,下图能表达的很清楚:
图中绿色的方框表示返回的值为true
,其它的表示返回的值为false
。同样可以使用另一张图来表述:
图中橙色的方框表示返回的值为true
,其它的表示返回的值为false
。
===运算规则
严格相等运算符===
首先要计算其操作数的值,然后比较这两个值,比较过程没有任何类型转换。其运算规则遵循下面的规则:
如果两个值类型不相同,则它们不相等
true === '1'; // => false
其中操作数true
是布尔值,而'1'
是字符串值。
如果两个者都是null
或者都是undefined
,则它们相等:
null === null; // => true undefined === undefined; // => true null === undefined; // =>false
如果两个值都是布尔值true
或false
,则它们相等:
true === true; // =>true false === false; // =>true true === 1; // =>false true === '1'; // =>false false === 0; // =>false false === '0'; // =>false
如果其中一个值是NaN
,或者两个值都是NaN
,则它们不相等。NaN
和其他任何值都是不相等的,包括它本身。通过x !== x
来判断x
是否为NaN
,只有在x
为NaN
的时候,这个表达式的值才为true
。
如果两个值为数字且数值相等,则它们相等。如果一个值为0
,另一个值为-0
,则它们同样的相等。
如果两个值为字符串,且所含的对应位上的16
位数完全相等,则它们相等。如果它们的长度或内容不同,则它们不等。两个字符串可能含义完全一样且所显示出的字符也一样,但且有不同编码的16
位值。JavaScript并不对Unicode进行标准化的转换,因此像这样的字符串通过===
和==
运算符的比较结果也不相等。在JavaScript中字符串的比较提供了一个String.localeCompare()
方法。
如果两个引用值指向同一个对象,数组或函数,则它们是相等的。如果指向不同的对象,则它们是不等的,尽管两个对象具有完全一样的属性。
var a = [1,2,3]; var b = [1,2,3]; var c = a; var ab_eq = (a === b); // false (even though a and b are the same type) var ac_eq = (a === c); // true var a = { x: 1, y: 2 }; var b = { x: 1, y: 2 }; var c = a; var ab_eq = (a === b); // false (even though a and b are the same type) var ac_eq = (a === c); // true var a = { }; var b = { }; var c = a; var ab_eq = (a === b); // false (even though a and b are the same type) var ac_eq = (a === c); // true
同样对于var1 === var2
也可以用图来表达:
上图中绿色的方框表示返回的值为true
,白色的方框表示返回的值为false
。除了上图之外,下面这张图也表达的是同样的意思:
上图中橙色的方框表示返回的值为true
,白色的方框表示返回的值为false
。
在JavaScript中比较运算符不仅仅是==
和===
。还有其它的比较运算符,比如<=
、>=
。综合起来,也可以使用一张图表述:
- 红色:
===
- 橙色:
==
- 黄色:
<=
和>=
同时成立,==
不成立 - 蓝色:只有
>=
- 绿色:只有
<=
有关于JavaScript中==
和===
更多的讨论,可以点击这里和这里。
!= 和 !==
在JavaScript中还有两个运算符和==
、===
类似,它们是!=
和!===
。在JavaScript中,!=
和!==
运算符的检测是==
和===
运算符的求反。如果两个值通过==
的比较结果为true
,那么通过!=
的比较结果则为false
。如果两个值通过===
的比较结果为true
,那么通过!==
的比较结果则为false
。
总结
这篇文章简单的总结了JavaScript中的==
和===
运算符的规则,以前这两个运算符中不同之处。简单的只需要记住==
表示两个操作数相同,===
表示来格相等(恒等或全等),!=
称为不相等,!==
表示不严格相等。
一起来看看JavaScript中==和===有何不同的更多相关文章
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- javascript中的this与函数讲解
前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...
- JavaScript 中的数据类型
Javascript中的数据类型有以下几种情况: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Function,Date,Ar ...
- javascript中的操作符详解1
好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...
- 掌握javascript中的最基础数据结构-----数组
这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...
- javascript中变量提升的理解
网上找了两个经典的例子 var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); // 10 var ...
- 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型
前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...
- 简单分析JavaScript中的面向对象
初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...
- Javascript中的valueOf与toString
基本上,javascript中所有数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题,本文将详细介绍,有需要的朋友可以参考下. t ...
- 关于javascript中的this关键字
this是非常强大的一个关键字,但是如果你不了解它,可能很难正确的使用它. 下面我解释一下如果在事件处理中使用this. 首先我们讨论一下下面这个函数中的this关联到什么. function doS ...
随机推荐
- re模块 模块
import re findall() 烦的奥 import re # 1. findall 查找所有结果,数据不是特别庞大 lst = re.findall('a','abcsdfasdfa') ...
- ping端口是否开放(windows,macos,linux)
windows中ping端口:tcping命令 1. tcping 非自带命令,首先安装tcping命令,也可以去官网:http://www.elifulkerson.com/projects/tcp ...
- win10关机之后自动重启(系统更新之后出现这个问题)
最近更新了一把win10之后出现无法关机,关机之后直接又开机,无限循环状态.最近几天没空处理一直是强关笔记本下班的. 今天打了一把命令: shutdown /s /t 0 发现关机正常,本来打算整个脚 ...
- C#编程任务: 把工作交给别人并等待其执行完成
生活中有这样的场景: 我有一件事情需要别人帮忙去办, 但是别人也很忙呀, 所以我只能把任务记载他的任务清单上, 等他一个个扫下来扫到我的并且完成之后再来告诉我. 这其实是一个多线程的问题. 我是线程A ...
- MVC3学习:实现简单的相册管理和图片管理
相册管理说白了就是文件夹管理,因此要用到命名空间using System.IO; 一.先来做相册管理,添加相册我就不做了,就是添加文件夹,这里主要做一下相册的显示.相册在页面上显示,需要一张图片,可以 ...
- Apache Oltu 实现 OAuth2.0 服务端【授权码模式(Authorization Code)】
要实现OAuth服务端,就得先理解客户端的调用流程,服务提供商实现可能也有些区别,实现OAuth服务端的方式很多,具体可能看 http://oauth.net/code/ 各语言的实现有(我使用了Ap ...
- mybatis 关联映射
一对一 创建数据表 CREATE TABLE `tb_card` ( `id` int NOT NULL AUTO_INCREMENT , `code` varchar() NULL , PRIMAR ...
- getFields和getDeclaredFields
getFields()获得某个类的所有的公共(public)的字段,包括父类. getDeclaredFields()获得某个类的所有申明的字段,即包括public.private和proteced, ...
- javascript 获取当前浏览器窗口宽高
获取当前浏览器窗口宽度:document.documentElement.clientWidth;获取当前浏览器窗口高度:document.documentElement.clientHeight; ...
- JavaScript -- Anchor
-----052-Anchor.html----- <!DOCTYPE html> <html> <head> <meta http-equiv=" ...