详解一下 javascript 中的比较

 代码1: 

[] == [];  // false
[] === []; // false
{} == {};  // SyntaxError: Unexpected token ==
{} === {}; // SyntaxError: Unexpected token ===

代码2:

var n0 = 123;
var n1 = new Number(123);
var n2 = new Number(123);
var n3 = Number(123);
var n4 = Number(123);

n0 == n1;  // true
n0 == n3;  // true
n0 === n1; // false
n0 === n3; // true

n1 == n2;  // false
n1 === n2; // false
n1 == n3;  // true
n1 === n3; // false

n3 == n4;  // true
n3 === n4; // true

 

为什么会是这个结果?

 

我们需要仔细的阅读规范: http://ecmascript.cn/#203

11.9.3 抽象相等比较算法

比较运算 x==y, 其中 x 和 y 是值,产生 true 或者 false。这样的比较按如下方式进行:

  1. 若 Type(x) 与 Type(y) 相同, 则
    1. 若 Type(x) 为 Undefined, 返回 true。
    2. 若 Type(x) 为 Null, 返回 true。
    3. 若 Type(x) 为 Number, 则
      1. 若 x 为 NaN, 返回 false。
      2. 若 y 为 NaN, 返回 false。
      3. 若 x 与 y 为相等数值, 返回 true。
      4. 若 x 为 +0 且 y 为 −0, 返回 true。
      5. 若 x 为 −0 且 y 为 +0, 返回 true。
      6. 返回 false。
    4. 若 Type(x) 为 String, 则当 x 和 y 为完全相同的字符序列(长度相等且相同字符在相同位置)时返回 true。 否则, 返回 false。
    5. 若 Type(x) 为 Boolean, 当 x 和 y 为同为 true 或者同为 false 时返回 true。 否则, 返回false。
    6. 当 x 和 y 为引用同一对象时返回 true。否则,返回 false。
  2. 若 x 为 null 且 y 为 undefined, 返回 true。
  3. 若 x 为 undefined 且 y 为 null, 返回 true。
  4. 若 Type(x) 为 Number 且 Type(y) 为 String, 返回 comparison x == ToNumber(y) 的结果。
  5. 若 Type(x) 为 String 且 Type(y) 为 Number,
  6. 返回比较 ToNumber(x) == y 的结果。
  7. 若 Type(x) 为 Boolean, 返回比较 ToNumber(x) == y 的结果。
  8. 若 Type(y) 为 Boolean, 返回比较 x == ToNumber(y) 的结果。
  9. 若 Type(x) 为 String 或 Number,且 Type(y) 为 Object,返回比较 x == ToPrimitive(y) 的结果。
  10. 若 Type(x) 为 Object 且 Type(y) 为 String 或 Number, 返回比较 ToPrimitive(x) == y 的结果。
  11. 返回 false。

注:按以上相等之定义:

  • 字符串比较可以按这种方式强制执行: "" + a == "" + b。
  • 数值比较可以按这种方式强制执行: +a == +b。
  • 布尔值比较可以按这种方式强制执行: !a == !b。

注:等值比较操作保证以下不变:

  • A != B 等价于 !(A==B)。
  • A == B 等价于 B == A,除了 A 与 B 的执行顺序。

注:相等运算符不总是传递的。 例如,两个不同的 String 对象,都表示相同的字符串值;== 运算符认为每个 String 对象都与字符串值相等,但是两个字符串对象互不相等。例如:

  • new String("a") == "a" 和 "a" == new String("a") 皆为 true。
  • new String("a") == new String("a") 为 false。

字符串比较使用的方式是简单地检测字符编码单元序列是否相同。不会做更复杂的、基于语义的字符或者字符串相等的定义以及 Unicode 规范中定义的 collating order。所以 Unicode 标准中认为相等的 String 值可能被检测为不等。实际上这一算法认为两个字符串已经是经过规范化的形式。

11.9.6 严格等于比较算法

比较 x===y,x 和 y 为值,需要产出 true 或 false。比较过程如下:

  1. 如果 Type(x) 与 Type(y) 的结果不一致,返回 false,否则
  2. 如果 Type(x) 结果为 Undefined,返回 true
  3. 如果 Type(x) 结果为 Null,返回 true
  4. 如果 Type(x) 结果为 Number,则
    1. 如果 x 为 NaN,返回 false
    2. 如果 y 为 NaN,返回 false
    3. 如果 x 与 y 为同一个数字,返回 true
    4. 如果 x 为 +0,y 为 -0,返回 true
    5. 如果 x 为 -0,y 为 +0,返回 true
    6. 返回 false
  5. 如果 Type(x) 结果为 String,如果 x 与 y 为完全相同的字符序列(相同的长度和相同的字符对应相同的位置),返回 true,否则,返回 false
  6. 如果 Type(x) 结果为 Boolean,如果 x 与 y 都为 true 或 false,则返回 true,否则,返回false
  7. 如果 x 和 y 引用到同一个 Object 对象,返回 true,否则,返回 false

注:此算法与 SameValue 算法在对待有符号的零和 NaN 上表现不同。

 

 

JavaScript中的类型比较与短路操作详解 本文深入探讨了JavaScript中的类型比较规则,特别是抽象相等(==)与严格相等(===)运算符的使用,以及NaN值的特性。同时,文章详细说明了布尔运算符中的短路行为及其在避免错误、提供默认值和调用可选函数中的应用。 阅读详情

相关推荐

Linux 之 supervisor安装和使用

运行Supervisor的后台服务,它用来启动和管理那些你需要Supervisor管理的子进程,响应客户端发来的请求,重启意外退出的子进程,将子进程的stdout和stderr写入日志,响应事件等。它是Supervisor最核心的部分。

chang995196962的博客 5545

JavaScript基本类型和引用类型

JavaScript基本类型和引用类型

ll_liling的博客 518

YOLOv5添加注意力机制的具体步骤

本文主要介绍了 本文在此篇博客的基础上向YOLOv5-5.0版 本文主要包括以下内容一、CBAM注意力机制添加(1)修改yolov5s主干网络(2)在common.py中添加可调用的CBAM模块(3)向yolo.py文件添加CBAMC3判断语句二、SE注意力机制添加 本文以yolov5s网络为例 一、CBAM注意力机制添加 注意力机制可以添加在backbone,Neck,Head等部分,接下来本文以backbone主干网络为例 (1)修改yolov5s主干网络 1.在yolov5-5.0工程文件夹下,找到m

thy0000的博客 2万+

37个JavaScript基本面试问题和解答

1、使用typeof bar ===“object”来确定bar是否是一个对象时有什么潜在的缺陷?这个陷阱如何避免? 尽管typeof bar ===“object”是检查bar是否是对象的可靠方法,但JavaScript中令人惊讶的问题是_null_也被认为是一个对象! 因此,下面的代码打印到控制台的是true而不是false: var...

weixin_33979745的博客 1033

利用HFSS仿真优化圆极化微带天线的耦合馈电设计

本文深入探讨了利用HFSS仿真软件优化圆极化微带天线性能的关键方法。通过对比传统直接馈电与耦合馈电方式,详细阐述了耦合馈电在提升阻抗匹配、改善轴比带宽及增强设计鲁棒性方面的显著优势。文章结合FR4板材的实战案例,逐步演示了在HFSS中建立模型、进行参数扫描与圆极化性能优化的完整流程,为设计高性能、高纯度的圆极化天线提供了实用指南。

weixin_29233333的博客 547

单目标跟踪算法及其复现过程---SiamFC(一)

在test.py文件中,就是利用训练出来的模型进行测试,需要更改预训练模型的路径,测试集的路径,以OTB100为例,最后输出的是对每一帧目标位置的坐标点。代码如下:首先需要下载got10k官方库,只需要在终端输入(注意:在终端安装各种库的时候不能使用网络代理),在环境已经配置到的情况下,只需要该其中的路径和就可以运行。这个系列博客仅为了记录各目标跟踪算法的复现(大多为跑通大佬们实现的代码),包括其中出现的很多问题和错误,学到的新知识等等。解决,而且只使用在线的方法,限制了他们可以学习的模型的丰富性。

weixin_58244117的博客 4760

TypeScript描述JS代码中常见值的方法

本文中,小编将介绍一些在 JavaScript 代码中最常见的值类型,并解释在 TypeScript 中描述这些类型的相应方法。 1.基元类型string,number, 和boolean JavaScript有三个非常常用的类型:string,number,和boolean。每个在 TypeScript 中都有对应的类型。我们发现,这些名称与我们在 JavaScript 应用typeof返回的类型的名称相同: string 表示字符串值,如 "Hello, world" nu...

AMD23的博客 1732

QUIC 协议域名封堵:核心原理、关键技术与实现路径(C/C++代码实现)

随着 QUIC 协议在互联网领域的广泛应用,其基于 UDP 的传输特性与加密设计,打破了传统 TCP 协议下的域名封堵逻辑,给网络合规管理与安全防护带来新的技术难题。本文将脱离具体代码实现,聚焦 QUIC 协议域名封堵的核心原理、关键技术环节与实际落地路径,从协议特性本质出发,解析如何在遵循 RFC 9000、RFC 9001 等规范的前提下,实现对 QUIC 流量的精准域名封堵。

chen1415886044的博客 1465

JavaScript知识点总结

type属性不是必需的。JavaScript是HTML默认的脚本语言。 脚本放置的位置 脚本可被放置在HTML页面的<body>或<head>部分中,或兼而有之。 提示:把脚本置于<body>元素的底部,可改善显示速度,因为脚本编译会拖慢显示 脚本可放置在外部文件中 如需使用外部脚本,请在<script>标签的src属性中设置脚本的名称。 <script src="myscript.js"></script> 注意...

氧小氢的博客 1204

aubo i5 + realsense D435i识别抓取实践二

aubo i5 + realsense D435i识别抓取实践二前言一、手眼标定是什么?二、标定软件安装1.aruco_ros安装2.vision_visp安装3.easy_handeye安装4.realsense驱动安装5.安装realsense ROS软件包三、配置1.launch文件修改2.打印二维码四、手眼标定1.启动launch文件2.标定步骤3.发布tf关系 前言 前面配置好了aubo机械臂的ROS软件包,机械臂可以正常运行后,接下来我们进行机械臂与相机的手眼标定。手眼标定分为eye_on_ha

转角 6373

AutoLISP 学习 (一)

AutoLISP基本语法结构、语法 以括号组成表达式,左右括号一定要成对,单、双引号也要成对,例如: (defun c:hello() (princ "\nHello world!") (prin1) ) 表达式格式:(函数名 操作数 操作数 …),例如: (setq p1 (list 0 0)) (setq p2 (list 10 10)) (setq p3 (list 20 20)) ;;; CAD中画直线,经过p1 p2 p3 (command "LINE" p1 p2 p3 ""

m0_54575622的博客 2122

详解 javascript 中的比较

11.9.3 抽象相等比较算法 比较运算 x==y, 其中 x 和 y 是值,产生 true 或者 false。这样的比较按如下方式进行: 若 Type(x) 与 Type(y) 相同, 则 若 Type(x) 为 Undefined, 返回 true。 若 Type(x) 为 Null, 返回 true。 若 Type(x) 为 Number,

xxmeng2012的专栏 493

SMPLify-x-master | 复现记录

由于毕业设计中将会用到smpl模型,而smplify方法的各环境依赖版本比较老,复现不太容易,因此便进行了smplifyx方法使用smplx的方法。由于在过程中遇到较多坑,因此进行记录和分享。

qq_44916003的博客 5100

详解 javascript 中的比较(==和===)

抽象相等比较算法 比较运算x==y, 其中x和y是值,产生true或者false。这样的比较按如下方式进行: 若Type(x)与Type(y)相同, 则 若Type(x)为Undefined, 返回true。 若Type(x)为Null, 返回true。 若Type(x)为Number, 则 若x为NaN, 返回false。 ...

weixin_30437337的博客 84

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

JS sort排序详解:数字排序的坑,如何用比较函数解决?

对数组进行排序是JavaScript开发中的常见需求,sort()方法是实现这一功能的核心工具。它看似简单,但如果不理解其默认行为和比较函数的机制,很容易在实际编码中埋下隐患

tom821023cn的博客 342

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

理解JS中的深比较跟浅比较

每天对自己多问几个为什么,总是有着想象不到的收获。 一个菜鸟小白的成长之路(copyer) 在理解浅比较跟深比较之前,我们需要先回顾一下==和===的区别 == 和 ===的区别 ==代表相同;===代表严格相同 ==先检查两个操作数据的类型,如果类型相同,就会===比较;如果不相同,转化为相同的类型,然后再次比较 ===先检查类型,如果类型不相同,直接返回false;如果相同,再比较 简单看下===的比较几种情况 (1)如果类型不同,就一定不相等 (2)如果两个都是数值.

copyer_xyf的博客 826

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JavaScript比较运算

等值检测 等值检测的目的在于判断两个变量是否相同或相等。我们说相同与不相同,是指运算符“===”和“!==”的运算效果;说相等与不相等,是指运算符“==”和“!=”的运算效果。 我们可以用个表格来表示: 比较运算中的等值检测 名称 运算符 说明 相等 == 比较两个表达式,看是否相等 不等 != 比较两个表达式,看是否不相等

熊猫正尽责 791

总结JavaScript中的条件判断与比较运算

1、使用关系运算符(>,=,

风清扬的专栏 1101

Javascript比较运算符详解

本文和大家分享的主要是javascript比较运算符相关内容,一起来看看吧,希望对大家学习javascript有所帮助。   比较运算符 >、>=、、、==、!=、===、!==   注意 比较运算符的结果为布尔类型 ==只比较值是否相等、===比较值和类型   实例 //字符串连接符+ document.write('hello'+' mai

lidiya007的博客 709

js中的 == 比较规则

在 js 中,== 是一种宽松相等运算符,它会在比较两个操作数时,尝试进行类型转换,以便比较它们的值如果类型不同是,两边的值都尽量转成number。

olderandyanger的博客 708

JavaScript 的运算符【二】(比较运算符)

运算符是处理数据的基本方法,用来从现有的值得到新的值。JavaScript 提供了多种运算符,覆盖了所有主要的运算

妖怪的博客 516
上一篇: 科普帖:线程与进程
下一篇: 基于 canvas 将图片转化成字符画
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值