JavaScript中相等==和严格相等===的区别
在JavaScipt中==(相等)和===(严格相等,strick equality 也有译作“恒等”、“全等”)用于比较两个值是否相等,两个运算符允许任意类型的操作数。如果操作数相等则返回true,否则返回false。===也称作严格相等运算符,它用来检测两个操作数是否严格相等。==运算符称作相等运算符,它用来检测两个操作数是否相等,这里“相等”的定义非常宽松,可以允许进行类型转换。
=赋值
==相等
===严格相等
!=(不相等)和!==(不严格相等)运算符的检测是==和===运算符的求反。如果两个值通过==的比较结果是true,那么通过!=的比较结果就是false。如果两个值通过===的比较结果是true,那么通过!==的比较结果为false。
JavaScript对象的比较是引用的比较,而不是值的比较。对象和其本身是相等的,但是和其他任何对象都不相等。如果两个不同的对象具有相同数量的属性,相同的属性名和值,它们依然是不相等的。相应位置的数组元素是相等的两个数组也是不相等的。
对象
var objA = { a: 1, b: 2, b: 3 };
var objB = { a: 1, b: 2, b: 3 };
objA == objB;//=>false,数组arrA和数组arrB不相等
数组
var a=[1,2,3,4,5];
var b=[1,2,3,4,5];
a==b;//=>false,数组a和数组b不相等。
严格相等运算符===首先计算其操作数的值,然后比较这两个值,比较过程中没有任何类型转换:
(1)如果两个值的类型不同,则它们不严格相等(即严格相等不成立)。
(2)如果两个值都是null或是undefined,则它们不严格相等。
(3)如果两个值都是布尔值true或者都是布尔值false,则它们严格相等。
(4)如果其中一个值是NaN,或者两个值都是NaN,则它们不严格相等。NaN和其他任何值都是不相等的,包括它本身!通过x!==x来判断X是否为NaN,只有在x为NaN的时候,这个表达式的值才为true。
(5)如果两个值为字符串,且所含的对应位上的16位数完全相等,则它们相等。如果它们长度或内容不同,则它们不等。两个字符串可能含义完全一样且所显示出的字符也一样,但是具有不同编码的16位值。JavaScript并不对Unicode进行标准化的转换,因此像这样的字符串通过===和==元素安抚的比较结果也不相等。
[相关阅读:JavaScript中什么是16位数?]
(6)如果两个引用值指向同一个对象、数组和函数,则它们是严格相等的,如果指向不同的对象,则它们是不严格相等,尽管两个对象具有完全一样的属性。
相等运算符==和恒等运算符相似,但相等运算符的比较并不严格。如果两个操作数不是同一类型,那么相等运算符会尝试进行一些类型转换,然后进行比较:
(1)如果两个操作数的类型相同,则和上文所述的严格相等比较规则一样。如果严格相等,那么比较结果为相等。
(2)如果两个操作数类型不同,==相等操作符也可能会认为他们相等。检测相等将会遵循如下规则和类型转换:
Ⅰ如果一个值是null,另一个是undefined,则它们相等。
Ⅱ如果一个值是数字,另一个是字符串,先将字符串转换为数字,然后使用转换后的值进行比较。
Ⅲ如果其中一个值是true,则将其转换为1再进行比较。如果其中一个值是false,则将其转换为0再进行比较。
Ⅳ如果其中一个值是对象,另一个值是数字或字符串,则通过转换规则将对象转换为原始值,然后再进行比较。对象通过toString()方法或者valueOf()方法转换为原始值。JavaScript语言核心的内置类首先尝试使用valueOf(),再尝试使用toString(),除了日期类、日期类只使用toString()转换。那些不是JavaScript语言核心中的对象则是通过各自的实现中定义的方法转换为原始值。
[相关阅读:JavaScript对象转换为原始值的规则]
Ⅴ其他不同类型之间的比较均不相等。
"1"==true;//=>true,相等成立
这个表达式的结果是true,这表明完全不同类型的值比较结果为相等。布尔值true首先转换为数字1,然后再执行比较。接下来字符串"1"也转换成了数字1,因为两个数字的值相等,因此比较结果为true。
JavaScript中相等==和严格相等===的区别的更多相关文章
- JavaScript中const、var和let区别浅析
在JavaScript中有三种声明变量的方式:var.let.const.下文给大家介绍js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始 ...
- JavaScript中值类型和引用类型的区别
JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null和undefined,它们既不是数字也不 ...
- JavaScript中=、==、===以及!=、!==的区别与联系
JavaScript中=.==.===以及!=.!==的区别与联系 在JavaScript中,“=”代表赋值操作:“==”先转换类型再比较,“===”先判断类型,如果不是同一类型直接为false. ...
- JavaScript中object和Object有什么区别
JavaScript中object和Object有什么区别,为什么用typeof检测对象,返回object,而用instanceof 必须要接Object呢 ————————————————————— ...
- 深入理解Javascript中构造函数和原型对象的区别
在 Javascript中prototype属性的详解 这篇文章中,详细介绍了构造函数的缺点以及原型(prototype),原型链(prototype chain),构造函数(constructor) ...
- 关于javascript中apply()和call()方法的区别
如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻.如果在学JavaScript这自由而变幻无穷的语 ...
- javascript 中 offsetWidth,clientWidth;offsetHeight,clientHeight的区别
javascript 中 offsetWidth 是对象的可见宽度,包滚动条等边线,会随窗口的显示大小改变 clientWidth.offsetWidth.clientHeight区别IE6.0.FF ...
- 在 JavaScript 中 prototype 和 __proto__ 有什么区别
本文主要讲三个 问题 prototype 和 proto function 和 object new 到底发生了什么 prototype 和 proto 首先我们说下在 JS 中,常常让我们感到困惑的 ...
- javascript中的undefined与null的区别
一.相似性 在JavaScript中,将一个变量赋值为undefined或null,老实说,几乎没区别. var a = undefined; var a = null; 上面代码中,a变量分别被赋值 ...
- javascript中常见undefined与defined的区别
在JavaScript中相信“undefined”与“defined”对大家来说都肯定不陌生,但是又不是很清楚它们的区别,先看两个demo我们再说, 例1. console.log(parms); / ...
随机推荐
- [Python数据结构] 使用List实现Stack
[Python数据结构] 使用List实现Stack 1. Stack 堆栈(Stack)又称为栈或堆叠,是计算机科学中一种特殊的串列形式的抽象数据类型(ADT),其特殊之处在于只能允许在阵列的一端进 ...
- NFV
转载: NFV介绍定义:NFV,即网络功能虚拟化,Network Function Virtualization.通过使用x86等通用性硬件以及虚拟化技术,来承载很多功能的软件处理.从而降低网络昂贵的 ...
- Django-报错解决方法
无法使用Django新建项目:'django-admin.py’不是内部或外部命令找到site-packages/django/bin(如 D:\Program Files\Anaconda3\Lib ...
- [bzoj1042][HAOI2008][硬币购物] (容斥原理+递推)
Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. Input 第一 ...
- vue axios请求超时,设置重新请求的完美解决方法
//在main.js设置全局的请求次数,请求的间隙 axios.defaults.retry = 4; axios.defaults.retryDelay = 1000; axios.intercep ...
- uestc 1903
#include<stdio.h> int main() { int n,m,i,t; scanf("%d",&t); while(t--){ scanf(&q ...
- 最小生成树 E - QS Network
Sunny Cup 2003 - Preliminary Round April 20th, 12:00 - 17:00 Problem E: QS Network In the planet w-5 ...
- iOS 的单例模式 dispatch_once
iOS 的单例模式 dispatch_once 有些变量仅仅须要初始化一次(如从文件里读取配置參数.读取设备型号等等),能够使用dispatch_once来进行读取优化.保证仅仅调用API一次,以后就 ...
- window+nginx+php-cgi的php-cgi线程/子进程问题
见bbs http://bbs.csdn.net/topics/390803643/close 正常的配置情况下,window的php-cgi是不会出现多线程/子进程的,例如以下配置 fastcgi_ ...
- CentOS7安装MariaDB成功的实践
前言 在自己的VPS的CentOS7安装Oracle的Mysql失败以后,我又开始找CentOS7上面安装MariaDB的方法,于是我找打了这篇文章:http://blog.csdn.net/defa ...