首页 > 编程语言 >JavaScript--_==_和_===_

JavaScript--_==_和_===_

时间:2022-10-28 20:14:11浏览次数:46  
标签:类型转换 --_ false Type JavaScript 42 null true

一、""和"="简单介绍

1)宽松相等(loose equals)== 和严格相等(strict equals)=== 都用来判断两个值是否“相等”,但是它们之间有一个很重要的区别,特别是在判断条件上。

2)正确的解释是:“== 允许在相等比较中进行强制类型转换,而 === 不允许。”

二、相等比较操作的性能

1)实际上虽然强制类型转换确实要多花点时间,但仅仅是微秒级(百万分之一秒)的差别而已。

2)如果进行比较的两个值类型相同,则 == 和 === 使用相同的算法,所以除了 JavaScript 引擎实现上的细微差别之外,它们之间并没有什么不同。

3)如果两个值的类型不同,我们就需要考虑有没有强制类型转换的必要,有就用 ==,没有就用 ===,不用在乎性能。

注意:== 和 === 都会检查操作数的类型。区别在于操作数类型不同时它们的处理方
式不同。

三、字符串和数字之间的相等比较

var a = 42;
var b = "42";
a === b; // false
a == b; // true

a == b 是宽松相等,即如果两个值的类型不同,则对其中之一或两者都进行强制类型转换。

具体怎么转换?是 a 从 42 转换为字符串,还是 b 从 "42" 转换为数字?

ES5 规范 11.9.3.4-5 这样定义
(1) 如果 Type(x) 是数字,Type(y) 是字符串,则返回 x == ToNumber(y) 的结果。
(2) 如果 Type(x) 是字符串,Type(y) 是数字,则返回 ToNumber(x) == y 的结果。

四、其他类型和布尔类型之间的相等比较

== 最容易出错的一个地方是 true 和 false 与其他类型之间的相等比较。
例如:

var a = "42";
var b = true;
a == b; // false

规范 11.9.3.6-7 是这样说的:
(1) 如果 Type(x) 是布尔类型,则返回 ToNumber(x) == y 的结果;
(2) 如果 Type(y) 是布尔类型,则返回 x == ToNumber(y) 的结果。

仔细分析例子:
Type(x) 是布尔值,所以 ToNumber(x) 将 true 强制类型转换为 1,变成 1 == "42",二者的类型仍然不同,"42" 根据规则被强制类型转换为 42,最后变成 1 == 42,结果为 false。反过来也一样。

var x = "42";
var y = false;
x == y; // false

Type(y) 是布尔值,所以 ToNumber(y) 将 false 强制类型转换为 0,然后 "42" == 0 再变成42 == 0,结果为 false。

也就是说,字符串 "42" 既不等于 true,也不等于 false。一个值怎么可以既非真值也非假值,这也太奇怪了吧?

这个问题本身就是错误的,我们被自己的大脑欺骗了。

"42" 是一个真值没错,但 "42" == true 中并没有发生布尔值的比较和强制类型转换。这里不是 "42" 转换为布尔值(true),而是 true 转换为 1,"42" 转换为 42。

重点是我们要搞清楚 == 对不同的类型组合怎样处理。== 两边的布尔值会被强制类型转换为数字。

建议无论什么情况下都不要使用 == true 和 == false。

五、 null 和 undefined 之间的相等比较

null 和 undefined 之间的 == 也涉及隐式强制类型转换。
ES5 规范 11.9.3.2-3 规定:
(1) 如果 x 为 null,y 为 undefined,则结果为 true。
(2) 如果 x 为 undefined,y 为 null,则结果为 true。

在 == 中 null 和 undefined 相等(它们也与其自身相等),除此之外其他值都不存在这种情况。这也就是说在 == 中 null 和 undefined 是一回事,可以相互进行隐式强制类型转换:

var a = null;
var b;
a == b; // true
a == null; // true
b == null; // true
a == false; // false
b == false; // false
a == ""; // false
b == ""; // false
a == 0; // false
b == 0; // false

六、技巧

1)如果两边的值中有 true 或者 false,千万不要使用 ==。
2)如果两边的值中有 []、"" 或者 0,尽量不要使用 ==。

标签:类型转换,--_,false,Type,JavaScript,42,null,true
From: https://www.cnblogs.com/zhouwying/p/16837205.html

相关文章

  • JavaScript--AJXS
    协议(基于tcp/ip)超文本传输协议(HyperTextTransferProtocol,HTTP)是用于从WWW服务器传输超文本到本地浏览器的传输协议(transport)。它可以使浏览器更加高效,使网络传输减少。......
  • blog_02
    第二次博客作业目录第二次博客作业1.前言2.设计与分析(1)题目集47-2点线形系列4-凸四边形的计算(2)题目集57-1点线形系列5-凸五边形的计算-1(3)题目集57-2点线形系......
  • 读《OpenFlow:Enabling Innovation in Campus Networks》有感
    OpenFlow:南向接口协议最初是运用于校园网建设一、可编程网络的必要性巨量的已安装设备和协议不愿尝试在真实流量中展开实验以上两点导致网络创新难度大,高准入门槛......
  • JavaScript--BOM
    一、BOM的概述虽然ECMAScript把浏览器对象模型(BOM,BrowserObjectModel)描述为JavaScript的核心,但实际上BOM是使用JavaScript开发Web应用程序的核心。BOM提供了......
  • 实验6:开源控制器实践
    实验6:开源控制器实践——RYU一、实验目的能够独立部署RYU控制器;能够理解RYU控制器实现软件定义的集线器原理;能够理解RYU控制器实现软件定义的交换机原理。二、实验环......
  • 社死事件
    今天下午去拿方老师没有给我退的作业(为什么不退呢?)。借此机会又和hyj&wzq聊天,突然发现我们下节课都是化学?好巧。于是一直聊到打预备铃才回班(反正在我们这边的老师都忙得要死......
  • [学习笔记] 差分约束系统
    解决问题解不等式方程。形如\(x_i\lex_j+w\)ps.等式可以化为两个不等式解决方法。相当于每条有向边松弛后的柿子。所以跑最短路即可。但有可能负权,而且要判无解(有......
  • Javascrip内置函数--计时器
    延时执行:setTimeout()  setTimeout的三种写法:console.log(1);/***第一个参数是代码,注意代码需用引号包裹,否则会立即执行代码*第二个参数是1000,即1000ms......
  • Codeforces Round #830 (Div. 2)(持续更新)
    PrefaceAB很水,C一般难度,D1很简单但D2确实巧妙没有现场打有点可惜,后面补的时候都是1A(结果每次比赛的时候都要莫名WA上好久)A.Bestie我刚开始没咋想,感觉操作步数不会很......
  • Python-一个傻瓜可视化的神库Streamlit
    1.如何安装?和安装其他包一样,安装streamlit非常简单,一条命令即可➜pipinstallstreamlit考虑到streamlit会附带安装比较多的工具依赖包,为了不污染当前的主要环境,......