热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

详解一下javascript中的比较

代码1:[][];false[][];false{}{};SyntaxError:Unexpectedtoken{}{};SyntaxError:Unexpectedtoken代码2:varn0123;varn
代码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。这样的比较按如下方式进行:
 
若 Type(x) 与 Type(y) 相同, 则
若 Type(x) 为 Undefined, 返回 true。
若 Type(x) 为 Null, 返回 true。
若 Type(x) 为 Number, 则
若 x 为 NaN, 返回 false。
若 y 为 NaN, 返回 false。
若 x 与 y 为相等数值, 返回 true。
若 x 为 +0 且 y 为 −0, 返回 true。
若 x 为 −0 且 y 为 +0, 返回 true。
返回 false。
若 Type(x) 为 String, 则当 x 和 y 为完全相同的字符序列(长度相等且相同字符在相同位置)时返回 true。 否则, 返回 false。
若 Type(x) 为 Boolean, 当 x 和 y 为同为 true 或者同为 false 时返回 true。 否则, 返回false。
当 x 和 y 为引用同一对象时返回 true。否则,返回 false。
若 x 为 null 且 y 为 undefined, 返回 true。
若 x 为 undefined 且 y 为 null, 返回 true。
若 Type(x) 为 Number 且 Type(y) 为 String, 返回 comparison x == ToNumber(y) 的结果。
若 Type(x) 为 String 且 Type(y) 为 Number,
返回比较 ToNumber(x) == y 的结果。
若 Type(x) 为 Boolean, 返回比较 ToNumber(x) == y 的结果。
若 Type(y) 为 Boolean, 返回比较 x == ToNumber(y) 的结果。
若 Type(x) 为 String 或 Number,且 Type(y) 为 Object,返回比较 x
 == ToPrimitive(y) 的结果。
若 Type(x) 为 Object 且 Type(y) 为 String 或 Number, 返回比较 ToPrimitive(x) == y 的结果。
返回 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。比较过程如下:
 
如果 Type(x) 与 Type(y) 的结果不一致,返回 false,否则
如果 Type(x) 结果为 Undefined,返回 true
如果 Type(x) 结果为 Null,返回 true
如果 Type(x) 结果为 Number,则
如果 x 为 NaN,返回 false
如果 y 为 NaN,返回 false
如果 x 与 y 为同一个数字,返回 true
如果 x 为 +0,y 为 -0,返回 true
如果 x 为 -0,y 为 +0,返回 true
返回 false
如果 Type(x) 结果为 String,如果 x 与 y 为完全相同的字符序列(相同的长度和相同的字符对应相同的位置),返回 true,否则,返回 false
如果 Type(x) 结果为 Boolean,如果 x 与 y 都为 true 或 false,则返回 true,否则,返回false
如果 x 和 y 引用到同一个 Object 对象,返回 true,否则,返回 false
注:此算法与 SameValue 算法在对待有符号的零和 NaN 上表现不同。

推荐阅读
  • 在深入研究 React 项目的过程中,特别是在探索 react-router 源码时,我发现了其中蕴含的中间件概念。这激发了我对中间件的进一步思考与整理。本文将详细探讨 Redux 中间件的原理及其在实际项目中的应用,帮助读者更好地理解和使用这一强大工具。通过具体示例和代码解析,我们将揭示中间件如何提升应用的状态管理和异步操作处理能力。 ... [详细]
  • 利用CSS技术实现文本的上标和下标效果
    通过运用CSS中的`vertical-align`属性,可以实现文本的上标和下标效果。该属性通常用于调整行内元素的垂直对齐方式,例如在化学公式中表示二氧化碳(CO₂)时,可以将数字“2”设置为下标。此外,`vertical-align`还支持多种值,如`super`、`sub`等,以满足不同的排版需求。 ... [详细]
  • 如何快速掌握日柱推算技巧?解读大运、小运、流年与命宫的精准方法
    大运是指人生各阶段的运势变化,通过命理学分析,可以预测个人在不同时间段的吉凶祸福。本文将详细介绍如何快速掌握日柱推算技巧,解读大运、小运、流年与命宫的精准方法,帮助读者更好地理解并运用这些命理知识,从而在关键时刻做出明智决策。 ... [详细]
  • 哈希表(Hash Table)是一种高效的查找算法,与传统的链表和树结构相比,其在查找过程中无需进行逐个元素的比较。本文将深入探讨哈希表的基本原理、应用场景以及优化策略,帮助读者全面理解其在实际开发中的优势和局限性。通过实例分析和代码示例,我们将展示如何有效利用哈希表提高数据处理效率,并解决常见的冲突问题。 ... [详细]
  • 题目要求在给定的 m×n 矩阵中,计算并返回所有完全由 1 组成的正方形子矩阵的数量。矩阵中的每个元素只能是 0 或 1。通过动态规划的方法,可以高效地解决这一问题。示例中,输入矩阵包含多个由 1 组成的正方形子矩阵,需要统计这些子矩阵的总数。 ... [详细]
  • 在 Python 中,列表(list)是一种内置的数据类型,属于有序且可变的集合,支持随时添加或删除元素。此外,Python 还提供了多种独特的数据结构,如字典(dict)、集合(set)和元组(tuple),每种数据结构都有其特定的应用场景和优势。了解这些数值类型和数据结构对于高效编程至关重要。 ... [详细]
  • 深入探讨:Java 8 中 HashMap 链表为何选择红黑树而非 AVL 树
    深入探讨:Java 8 中 HashMap 链表为何选择红黑树而非 AVL 树 ... [详细]
  • 在SWUSTOJ #1063中,题目要求对带权重的有向图进行算法计算与分析。假设图G使用邻接矩阵存储,任务是计算图中的最大权值和最小权值,并确定对应的有向边。输入数据的第一行包含一个整数n,表示图中节点的数量。随后的输入将提供图的边及其权重信息。通过该算法,可以有效地找出图中的关键路径和最短路径,为图论问题的解决提供重要参考。 ... [详细]
  • PHP 数组逆序排列方法及常用排序函数详解 ... [详细]
  • 本文深入探讨了二叉树路径和问题的算法优化方法。具体而言,给定一棵二叉树,需要找出所有从根节点到叶节点的路径,其中各节点值的总和等于指定的目标值。通过详细分析和优化,提出了一种高效的解决方案,并通过多个样例验证了其有效性和性能。 ... [详细]
  • 本文详细解析了高性能通信库 NanoMsg 的框架及其应用场景。其中,BUS模式支持多对多的简单通信方式,消息会传递给所有直接连接的节点。REQREP模式则适用于构建无状态的服务集群,用于处理用户的请求,每个请求都需要一个相应的响应。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 二叉树的直径是指树中任意两个叶节点之间最长路径上的节点数量。本文深入解析了计算二叉树直径的算法,并提出了一种优化方法,以提高计算效率和准确性。通过详细的案例分析和性能对比,展示了该优化算法在实际应用中的优势。 ... [详细]
  • 本文详细探讨了YOLO目标检测技术在实际应用中的实践与优化。通过一系列实战案例,展示了如何在不同场景下高效部署和调优YOLO模型。验证环境包括Ubuntu 18.04、NVIDIA驱动450、CUDA 11.0、cuDNN 8.0.5和OpenCV 4.4.0,确保了模型的稳定性和高性能表现。文章将持续更新,提供最新的技术进展和实践经验。 ... [详细]
  • vtkGlyph3D 是一种强大的符号化可视化工具,能够将三维数据集中的每个点用预定义的几何图形(如球体或箭头)进行表示。该工具不仅支持自定义符号的方向和缩放比例,还能够在复杂的数据场中突出显示关键特征,从而提高数据的可解释性和可视化效果。通过这种方式,用户可以更直观地理解和分析三维数据集中的重要信息。 ... [详细]
author-avatar
爱你宝贝胡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有