js中==和===的区别以及总结
js中==和===的区别以及总结
学习js时我们会遇到 == 和 === 两种符号,现做总结如下
两种符号的定义
"==" 叫做相等运算符
"===" 叫做严格相等运算符(全等运算符)
它们之间的区别
"==" 只判断等号两边的值是否相等,而不判断类型是否相同。值相同则返回 true
"===" 既要判断值是否相等,也要判断类型是否相同,即全等才能返回 true
总结:
(分析 ==)
先把等号两侧的值转化为基本数据类型,如果两侧的值基本数据类型不同,转化为数字再进行比较,如果相同,直接比较
1、undefined 和 null 互相比较返回 true,和自身比较也返回 true,其他情况返回 false
2、Infinity 只和自身比较返回 true
3、NaN,{} 和任意值比较都是返回 false
4、如果其中一个值是 true,则将其转换为 1 再进行比较。如果其中一个值是 false,则将其转换为 0 再进行比较
5、要比较相等性之前,不能将 null 和 undefined 转换成其他任何值
6、 如果一个值是数字,另一个是字符串,先将字符串转换为数值,然后使用转换后的值进行比较
7、如果等号两侧都是对象,则比较它们是否为同一个对象。如果指向同一个对象,则返回 true,否则返回 false
较为复杂的情况:
8、如果等号一侧是Number,String,Boolean这三种类型中的一种,而另一侧是对象类型时, 则对对象执行ToPrimitive操作(这步是JS解释器执行的,ToPrimitive方法的实现,正是依次去调用对象的valueOf,toString方法,直到其中一个方法返回一个基本值,然后比较返回的基本值和另一侧那三中类型的值。如果这两个方法没有返回基本值 ,那就认定不相等 )
(分析 ===)
1、先分析是否为相同类型,如果类型不同直接返回 false,
如果类型相同,
基本类型,直接比较值是否相同,
对象类型,由于对象类型保存的是对象(包括数组,函数)的地址值,所以地址值不同的,返回的都是 false。地址值相同,返回 true
上面说的有些抽象,下面我们来结合具体的实例来分析一下
== 详解(有隐式转换)
一、等号两侧是基本数据类型,且类型不同时
1. 字符串与数字比较 (等号两侧转化为数字,再比较)
100 == "100" ==> 100 == 100 // true
100 == "99" ==> 100 == 99 // false
100 == "abc" ==> 100 == NaN // false
1 == "abc" ==> 1 == NaN // false
1 == "" ==> 1 == 0 // false
2.字符串与布尔值比较(等号两侧转换为数字,再比较)
"abc" == true ==> NaN == 1 // false
"abc" == false ==> NaN == 0 // false
"" == true ==> 0 == 1 // false
"" == false ==> 0 == 0 // true
3.数字与布尔值比较(等号两侧转换为数字,再比较)
1 == true ==> 1 == 1 // true
0 == true ==> 0 == 1 // false
100 == true ==> 100 == 1 // false
1 == false ==> 1 == 0 // false
0 == false ==> 0 == 0 // true
100 == false ==> 100 == 0 // false
4. undefined 和 null
undefined 与 null 比较特殊 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值
undefined 和 null 互相比较返回 true,和自身比较也返回 true,其他情况返回 false
undefiend == undefined // true
undefined == null // true
null == null // true
undefined == 其他值 // false
null == 其他值 // false
5. NaN
NaN(非数值)也很特殊,NaN 和任何值(包括自己)比较都是返回 false
NaN == NaN // false
NaN == 其他值 // false
二、等号两侧有复杂数据类型(引用类型)时,且类型不同时
(特殊:{} 和任何值比较返回都是false )
1.等号两侧都为引用类型时
(由于引用类型保存的是对象(包括数组,函数)的地址值,所以地址值不同的,返回的都是 false)
等号两侧为相同的引用数据类型时
实例
[1,2] == [1,2] // false
[1,2] == [2,3] // false
{x:1} == {x:1} // false
{x:1} == {y:1} // false
等号两侧为不同的引用数据类型时
实例
[1,2] == {y:1} // false
2.有且只有一侧为引用数据类型时
实例
[1,2] == 1 ==> NaN == 1 // false
[1,2] == true ==> NaN == 1 // false
[ 1 ] == 1 ==> 1 == 1 // true
[1] == '1' ==> '1' == '1' // true
[] == 0 ==> 0 == 0 // true
[] == '0' ==> '' == '0' // false
[] == '' ==> '' == '' // true
{x:1} == 1 ==> NaN == 1 // false
{x:1} == '1' ==> NaN == 1 // false
true == {x:1} ==> 1 == NaN // false
=== 详解(无隐式转换)
实例
100 == "100" // false
100 == 100 // true
"100" == "100" // true
{x:1} == {y:1} // false
js中==和===的区别以及总结的更多相关文章
- js中==, !==, === ,!=的区别
在讨论比较符的时候我们先要来讨论哈js的类型,这样有助于我们从本质上了解原理. 下面是我找的资料加上个人的总结: js中有5种数据类型:Undefined.Null.Boolean.Number和St ...
- js 中null,undefined区别
首先摘自阮一峰先生的文章: 大多数计算机语言,有且仅有一个表示"无"的值,比如,C语言的NULL,Java语言的null,Python语言的None,Ruby语言的nil. 有点奇 ...
- js 中 == 和 === 的区别
js中的 ==和===的区别 简单理解 js 是弱类型的语言,其中 == 可以理解为 是值是否相等,而===不仅比较值是否相等,还比较类型是否相等. 简单案例: var str = "1&q ...
- js中!和!!的区别及用法
js中!的用法是比较灵活的,它除了做逻辑运算常常会用!做类型判断,可以用!与上对象来求得一个布尔值,1.!可将变量转换成boolean类型,null.undefined和空字符串取反都为false,其 ...
- jq中$(function(){})和js中window.onload区别
先看下执行代码: $(function(){ console.log("jq");}) $(function(){ console.log("jq1") ...
- 在js中==和===的区别
“==”:叫相等运算符 “===”:叫严格运算符 它们两有什么区别呢? == :表示值相等则都为true ===:表示 不仅要值相等,双方类型也要相等才为true 例子如下: js代码如下: // “ ...
- js中“==”与"==="的区别
首先,== equality 等同,=== identity 恒等. ==, 两边值类型不同的时候,要先进行类型转换,再比较. ===,不做类型转换,类型不同的一定不等. 一言以蔽之:==先转换类型再 ...
- Js 中 == 与 === 的区别
1.对于string,number等基础类型,==和===是有区别的 1)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等 2)同类型比较,直接进 ...
- js中[]、{}、()区别
一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数体 {}表示对象.[]表示对象的属性.方法,()如果用在方法名后面,代表调用 如:var LangShen = {&quo ...
随机推荐
- 【NX二次开发】Block UI 分割线
设置控件可见 this->separator0->GetProperties()->SetLogical("Show",true);
- 【NX二次开发】获取尺寸信息UF_DRF_ask_draft_aid_text_info
获取尺寸信息UF_DRF_ask_draft_aid_text_info 例如获取下面这三个的尺寸信息. 图1 输出结果: 10 <T+0.1!-0.1> 图2 输出结果: 10 < ...
- 飞(fly)(数学推导,liu_runda的神题)
大概看了两三个小时的题解,思考量很大,实现简单........ 20分: 明显看出,每个点的贡献是x*(x-1)/2;即组合数C(x,2),从x个线段中选出2个的方案数,显然每次相交贡献为1,n^2枚 ...
- 【单调栈】【前缀和】【二分查找】8.28题解-long
long 题目描述 AP神牛准备给自己盖一座很华丽的宫殿.于是,他看中了一块N*M的矩形空地.空地中每个格子都有自己的海拔高度.AP想让他的宫殿的平均海拔在海平面之上(假设海平面的高度是0,平均数都会 ...
- 关于 Windows 下 Qt 开发,这个问题必须要搞清楚!
小伙伴们,大家好,小北师兄又来喂饭啦,从上次写完<一个例子让你秒懂 Qt Creator 编译原理>后,师兄对于 Qt 的一些环境配置有了更深的理解,这对师兄进行 Qt 的后续学习起到了很 ...
- mapboxgl绘制3D线
最近遇到个需求,使用mapboxgl绘制行政区划图层,要求把行政区划拔高做出立体效果,以便突出显示. 拿到这个需求后,感觉很简单呀,只需要用fill-extrusion方式绘制就可以啦,实现出来是这个 ...
- 40、如何获取yum安装时的rpm包
1.先清除之前下载的数据包: [root@slave-db ~]#yum clean all 2.修改yum配置文件: [root@master-db ~]#vim /etc/yum.conf [ma ...
- POJ 2084 Game of Connections 卡特兰数
看了下大牛们的,原来这题是卡特兰数,顺便练练java.递归式子:h(0)=1,h(1)=1 h(n)= h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)h(0) ( ...
- CentOS-配置YUM源加速(阿里云、Nexus3)
备份本地源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 配置CentOS6(aliyun ...
- linux 之sed用法
sed:Stream Editor文本流编辑,sed是一个"非交互式的"面向字符流的编辑器.在使用sed处理时,它把当前处理的行存储在临时缓冲区中,称为"模式空间&quo ...