资讯专栏INFORMATION COLUMN

详解一下 javascript 中==与===的比较

wwq0327 / 1985人阅读

摘要:当和为引用同一对象时返回。若为且为,返回比较的结果。等价于,除了与的执行顺序。所以标准中认为相等的值可能被检测为不等。实际上这一算法认为两个字符串已经是经过规范化的形式。

**

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 上表现不同。

参考:http://www.ecma-international...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92366.html

相关文章

  • 详解一下 javascript 比较

    摘要:今天在笔试题被公子给了,遂想起之前要写的一篇文章,中蛋疼的比较运算。当和为引用同一对象时返回。若为且为,返回的结果。所以标准中认为相等的值可能被检测为不等。实际上这一算法认为两个字符串已经是经过规范化的形式。 今天在 JS笔试题 被 @公子 给AT了,遂想起之前要写的一篇文章,javascript 中蛋疼的比较运算。 翻译自:http://www.ecma-international....

    Pluser 评论0 收藏0
  • javascript变量运算符详解

    摘要:代码示例等号检查,类型转换后返回全等检查,由于时类型,时类型,类型不同,返回关系运算符关系运算符执行的是比较运算,通常用于判断两个变量哪个大哪个小关系运算符都返回一个布尔值。逻辑或运输符用双竖线表示。 1.运算符 JavaScript中常见的运算符包含:赋值运算符、算数运算符、等性运算符、关系运算符、条件运算符、布尔运算符、逻辑运算符…… 1.赋值运算符 = 赋值运算符=,用于给某个变...

    Sourcelink 评论0 收藏0
  • JavaScript深入浅出

    摘要:理解的函数基础要搞好深入浅出原型使用原型模型,虽然这经常被当作缺点提及,但是只要善于运用,其实基于原型的继承模型比传统的类继承还要强大。中文指南基本操作指南二继续熟悉的几对方法,包括,,。商业转载请联系作者获得授权,非商业转载请注明出处。 怎样使用 this 因为本人属于伪前端,因此文中只看懂了 8 成左右,希望能够给大家带来帮助....(据说是阿里的前端妹子写的) this 的值到底...

    blair 评论0 收藏0
  • 浏览器事件模型捕获阶段、目标阶段、冒泡阶段实例详解

    摘要:目标阶段真正点击的元素的事件发生了两次,因为在上面的代码中,既在捕获阶段绑定了事件,又在冒泡阶段绑定了事件,所以发生了两次。所以很明显用直接绑定的事件发生在了冒泡阶段。 如果对事件大概了解,可能知道有事件冒泡这回事,但是冒泡、捕获、传播这些机制可能还没有深入的研究实践一下,我抽时间整理了一下相关的知识。 本文主要对事件机制一些细节进行讨论,过于基础的事件绑定知识方法没有介绍。 特别少...

    mylxsw 评论0 收藏0
  • javascript对象原型成员详解

    摘要:和的作用一样,区别在于写法语法对象对象作用判断对象是否在对象的原型链上语法对象构造函数作用判断构造函数的属性是否在对象的原型链上,如果在,就返回属性是否可枚举用于检查给定的属性是否能够使用语句。 ## javascript对象原型成员详解 ## ECMAScript 中的对象就是一组数据和功能的集合,对象可以通过 new 操作符后跟要创建的对象名称来...

    zhkai 评论0 收藏0

发表评论

0条评论

wwq0327

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<