`

详解一下 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===yx 和 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 为 +0y 为 -0,返回 true
    5. 如果 x 为 -0y 为 +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 上表现不同。

 

 

25
17
分享到:
评论
2 楼 artdialog 2013-09-22  
表示从来没有看过规范。
1 楼 redis 2013-09-22  
太强大了,又涨姿势了。

相关推荐

    JavaScript基础与案例开发详解

    资源名称:Javascript基础与案例开发详解内容简介:《Java script基础与案例开发详解》根据Javascript在各种类型的应用开发中(如B2B、B2C、C2C)的使用情况,有针对性地安排了丰富的案例,从基本的...

    JavaScript动态网页开发详解——JavaScript特效

    在“JavaScript动态网页开发详解——JavaScript特效”这一主题中,我们将深入探讨JavaScript如何实现各种炫酷的网页效果。 一、JavaScript基础 在讨论特效之前,我们需要了解JavaScript的基础。JavaScript语法与...

    javascript详解(很详细,很简单)

    javascript详解(很详细,很简单)javascript详解(很详细,很简单)javascript详解(很详细,很简单)javascript详解(很详细,很简单)javascript详解(很详细,很简单)javascript详解(很详细,很简单)...

    JavaScript中this关键字使用方法详解

    在JavaScript编程语言中,`this`关键字是一个至关重要的概念,它常常引发初学者的困惑,因为它的值在不同的上下文中可能会有所不同。`this`关键字主要用来引用对象的上下文,或者说是当前执行环境中的对象。在本文中...

    详解Javascript 中的this指针

    ### 详解Javascript中的`this`指针 在深入探讨`this`指针之前,我们首先应当明确`this`在JavaScript中的基本概念与作用。`this`关键字在JavaScript中扮演了一个非常核心的角色,它是一个特殊的变量,用于引用调用...

    JavaScript详解[参照].pdf

    JavaScript详解 JavaScript是一种轻量级的解释型编程语言,主要用于增强网页的交互性和动态功能。它的特点在于能够直接在浏览器中执行,无需预编译,为网页提供了实时响应用户操作的能力。JavaScript允许开发者创建...

    JavaScript基础与案例开发详解pdf

    JavaScript基础与案例开发详解根据javascript在各种类型的应用开发中(如b2b、b2c、c2c)的使用情况,有针对性地安排了丰富的案例,从基本的表格操作、表单操作,到构建浏览器端的富文本编辑器,再到实现像windows那样...

    JavaScript Array对象详解-javascript技巧.pdf

    JavaScript Array对象详解_javascript技巧

    JavaScript基础与案例开发详解/于坤, 周大庆编著

    《JavaScript基础与案例开发详解》根据JavaScript在各种类型的应用开发中(如B2B、B2C、C2C)的使用情况,有针对性地安排了丰富的案例,从基本的表格操作、表单操作,到构建浏览器端的富文本编辑器,再到实现像Windows...

    JavaScript 使用详解下载

    以上只是JavaScript使用详解的一部分内容,实际的学习过程中,还需要深入理解JavaScript的内存管理、性能优化、错误处理以及与最新Web技术(如WebAssembly、Web Components)的结合等。通过不断学习和实践,你将能够...

    JavaScript动态网页开发详解

    JavaScript动态网页开发详解 非常适合做动态网页的开发

    JavaScript使用详解,javascript入门教程

    JavaScript是一种广泛应用于网页和网络应用的编程语言,它在网页开发中扮演着至关重要的角色,主要负责实现动态交互效果和处理用户输入。本教程旨在帮助初学者深入理解JavaScript的基础概念和核心特性,以便快速入门...

    javascript事件详解

    JavaScript事件详解 JavaScript是一种基于浏览器的脚本语言,它的事件机制是实现动态交互的重要部分。在JavaScript中,事件是用户或浏览器对网页进行操作时触发的特定动作,比如点击按钮、鼠标移动等。本文将详细...

    JavaScript 中常见排序算法详解.pdf

    JavaScript 中常见排序算法详解

    javascript闭包详解中文word版

    资源名称:javascript闭包详解 中文word版   内容简介: Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C 的程序员来说是一个新的...

    JavaScript详解.doc

    另一种是将JavaScript代码编写在独立的`.js`文件中,然后通过`<script>`标签的`src`属性引用。这种方式有利于代码的组织和重用。需要注意的是,如果`<script>`标签设置了`src`属性,那么标签内部的代码将不会被执行...

    javaScript使用详解.pdf

    JavaScript,是一种广泛应用于Web开发的轻量级编程语言,它主要负责实现客户端的动态...总结,《JavaScript使用详解》这本书将深入讲解这些内容,帮助读者从基础到进阶全面掌握JavaScript,为Web开发打下坚实的基础。

    JavaScript凌厉开发——Ext详解与实践 源码 源代码 part3

    JavaScript凌厉开发——Ext详解与实践 源码 源代码 part3 因为源代码比较大,压缩后76M左右 所以分为四个包上传

    《JavaScript+DHTML语法与范例详解词典》源码

    此为《JavaScript+DHTML语法与范例详解词典》一书的源码. 内容简介 《JavaScript+DHTML语法与范例详解词典》词条包含的主要内容有JavaScript的全局函数和基础对象的函数和属性;如何通过JavaScript DOM对象来动态地...

    《JavaScript基础与案例开发详解》

    由于提供的文件信息不包含实质性的内容描述,而是反复提及《JavaScript基础与案例开发详解》这本书以及一个网址***,这导致无法从中抽取具体的知识点。为了满足您的要求,我将基于“JavaScript基础与案例开发”这一...

Global site tag (gtag.js) - Google Analytics