详解一下 javascript 中的比较

为什么在 JS 中比较两个相似的对象时返回 false? 先看下面的例子: leta={a:1}; letb={a:1}; letc=a; console.log(a===b);//打印false,即使它们有相同的属性 console.log(a===c);//true JS 以不同的方式比较对象和基本类型。在基本类型中,JS 通过值对它们进行比较,而在对象中,JS 通过引用或存储变量的内存中的地址对它们进行比较。这就是为什么第一个console.log语句返回false,而第二个console.log语句... 阅读详情

代码1: 

  1. [] == [];  // false  
  2. [] === []; // false  
  3. {} == {};  // SyntaxError: Unexpected token ==  
  4. {} === {}; // SyntaxError: Unexpected token ===  

代码2:

  1. var n0 = 123;  
  2. var n1 = new Number(123);  
  3. var n2 = new Number(123);  
  4. var n3 = Number(123);  
  5. var n4 = Number(123);  
  6.   
  7. n0 == n1;  // true  
  8. n0 == n3;  // true  
  9. n0 === n1; // false  
  10. n0 === n3; // true  
  11.   
  12. n1 == n2;  // false  
  13. n1 === n2; // false  
  14. n1 == n3;  // true  
  15. n1 === n3; // false  
  16.   
  17. n3 == n4;  // true  
  18. 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值的特性。同时,文章详细说明了布尔运算符中的短路行为及其在避免错误、提供默认值和调用可选函数中的应用。 阅读详情

相关推荐

卫星监测“America”级#两#栖#攻#击#舰#(LHA-6)出港

卫星监测“America”级#两#栖#攻#击#舰#(LHA-6)出港 前脚刚走,后脚又来,山姆大叔又来刷存在感,2020年7月28日,USS Ronald Reagan流窜在我国东海海区被卫星拍了下来: 2020年8月1日,最新卫星图像显示USS Ronald Reagan已经返回母港日本横须贺:距离其出港(2020年6月8日)已经过去了快两个月 然而事情并没有到此结束,“America”级#两#栖#攻#击#舰#(LHA-6)选择在 “八.一” 这个特殊的日子前后出港颇具挑衅的味道。 根据2020年

qq_46071146的博客 1565

JavaScript基本类型和引用类型

JavaScript基本类型和引用类型

ll_liling的博客 518

FEniCS学习笔记01:centos7下通过conda安装FEniCSx0.7

2023年版本的Fenicsx0.7,官网推荐使用conda命令安装集成好的Python包,因此我们的安装思路是先安装Anaconda,再按照官网步骤安装Fenics。

huahua_xiao的博客 5058

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

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

weixin_33979745的博客 1033

【四季发财中线】通达信炒股指标副图指标使用图文教程,短线紫色柱线操作,与中线短柱线共振抓牛股妖股主升浪

如上图标记位置,对应的是副图指标的紫色柱线开始的位置,这个紫色柱线信号开始出现,也是短线进场做多的信号,紫色柱线的持续出现和加长,可以持股待涨,或行情继续上涨的可以在分时行情中逢低进场短线顺势做多。如上图标记部分,指标的主要部分信号,三行柱线-ZR-ZC -ZM,当出现这三行信号时,中线或波段看多做多,信号持续则中线顺势做多和持股待涨。不论是跟踪信号的出现先后进场和持股,或是在中线多头的行情中,找到短线转多信号进场做安全的短线操作机会,都是非常好的指标信号和辅助操作功能。

weixin_69760830的博客 1602

Apache-Plc4x-Modbus-Tcp学习记录(一)

Apache-Plc4x-Modbus-Tcp学习记录(一)

weixin_45325423的博客 6988

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

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

AMD23的博客 1733

4、文化遗产数字记录的伦理框架构建

本文探讨了在数字技术快速发展的背景下,如何构建一个伦理框架以指导文化遗产的数字记录工作。文章分析了遗产保护的重要性以及当前面临的挑战,包括气候变化、全球化和技术变革等。同时,结合国际古迹遗址理事会(ICOMOS)的伦理原则和加拿大遗产专业人员协会(CAHP)的行为准则,提出了六个核心伦理类别,并讨论了其在实践中的应用。文章强调,伦理框架不仅有助于提高数字记录的质量和可持续性,还能促进专家合作、保护社区利益并确保数字遗产的长期可访问性。未来需要持续完善这一框架,以应对不断变化的技术和社会环境带来的新挑战。

7h6j5k4l3的博客 96

详解 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

使用 MATLAB/Simulink + Reinforcement Learning Toolbox 构建一个基于强化学习的永磁同步电机(PMSM)自适应控制仿真系统

随着人工智能(AI)技术的快速发展,强化学习(Reinforcement Learning, RL)在控制系统中的应用日益广泛。在电机控制领域,传统的PID控制虽然成熟稳定,但在面对非线性、时变、不确定负载等复杂工况时,其控制性能可能受限。而强化学习通过与环境的交互学习,能够实现在线自适应控制策略优化,显著提升系统的鲁棒性与响应速度。本教程将带你使用构建一个基于强化学习的永磁同步电机(PMSM)自适应控制仿真系统,实现从控制策略设计、环境建模、训练到仿真的全过程。当前转速(ω)

amy_mhd的博客 407

【运动规划算法项目实战】Artificial Potential Field算法(附ROS C++代码)

在机器人行业中,路径规划是一个关键的任务,它涉及到如何让机器人在复杂的环境中安全而高效地移动。人工势场算法(Artificial Potential Field Algorithm)是一种常用的路径规划方法,它借鉴了物理学中的势能概念,通过模拟力的作用来引导机器人的移动。本文将详细介绍人工势场算法的原理、在路径规划中的应用、算法优缺点以及代码实现。人工势场算法基于两种势场:斥力场和引力场。斥力场使机器人远离障碍物,而引力场将机器人吸引到目标位置。

xiewf的博客 1万+

详解 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

LeRobot 入门教程(四)SO-101机械臂组装教程

《SO-101机器人组装与配置指南》详细介绍了旗舰机器人SO-101的完整搭建流程。从获取3D打印零件、安装LeRobot软件和FeetechSDK,到分步组装6个关节的机械臂结构(含夹爪/手柄选项),指南提供了清晰的螺丝规格和安装位置说明。重点包括:电机ID/波特率设置方法、USB端口识别技巧、领导者/跟随者臂的校准流程,以及故障排查建议。完成组装后,用户可通过配套Python脚本校准机器人,为后续的自主学习任务做好准备。文档附有视频演示和技术支持通道,确保用户顺利完成机器人部署。

2506_90492529的博客 2582

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

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

tom821023cn的博客 342

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

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

copyer_xyf的博客 826

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JavaScript比较运算

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

熊猫正尽责 791

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

风清扬的专栏 1101

Javascript比较运算符详解

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

lidiya007的博客 709

js中的 == 比较规则

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

olderandyanger的博客 709

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

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

妖怪的博客 516

JavaScript比较运算符

原始类型比较若为字符串则进行unicdoe编码比较对象类型比较,对于非相等运算符,最终转为字符串比较,而对于相等运算符比较,则最终转为number类型比较。

SUST_DOG_MASTER博客 864
上一篇: 科普帖:线程与进程
下一篇: 基于 canvas 将图片转化成字符画
迷渡
迷渡 领域专家: 前端开发技术领域 领域专家: 前端开发技术领域
博客等级 码龄19年 2405粉丝 124原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值