资讯专栏INFORMATION COLUMN

详解一下 javascript 中的比较

Pluser / 2353人阅读

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

今天在 JS笔试题 被 @公子 给AT了,遂想起之前要写的一篇文章,javascript 中蛋疼的比较运算。

翻译自:http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

11.9.3 抽象相等比较算法

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

Type(x)Type(y) 相同, 则

Type(x)Undefined, 返回 true

Type(x)Null, 返回 true

Type(x)Number, 则

xNaN, 返回 false

yNaN, 返回 false

xy 为相等数值, 返回 true

x+0y−0, 返回 true

x−0y+0, 返回 true

返回 false

Type(x)String, 则当 xy 为完全相同的字符序列(长度相等且相同字符在相同位置)时返回 true。 否则, 返回 false

Type(x)Boolean, 当 xy 为同为 true 或者同为 false 时返回 true。 否则, 返回 false

xy 为引用同一对象时返回 true。否则,返回 false

xnullyundefined, 返回 true

xundefinedynull, 返回 true

Type(x)NumberType(y)String, 返回 comparison x == ToNumber(y) 的结果。

Type(x)StringType(y)Number

返回比较 ToNumber(x) == y 的结果。

Type(x)Boolean, 返回比较 ToNumber(x) == y 的结果。

Type(y)Boolean, 返回比较 x == ToNumber(y) 的结果。

Type(x)StringNumber,且 Type(y)Object,返回比较 x == ToPrimitive(y) 的结果。

Type(x)ObjectType(y)StringNumber, 返回比较 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===yxy 为值,需要产出 truefalse。比较过程如下:

如果 Type(x)Type(y) 的结果不一致,返回 false,否则

如果 Type(x) 结果为 Undefined,返回 true

如果 Type(x) 结果为 Null,返回 true

如果 Type(x) 结果为 Number,则

如果 xNaN,返回 false

如果 yNaN,返回 false

如果 xy 为同一个数字,返回 true

如果 x+0y-0,返回 true

如果 x-0y+0,返回 true

返回 false

如果 Type(x) 结果为 String,如果 xy 为完全相同的字符序列(相同的长度和相同的字符对应相同的位置),返回 true,否则,返回 false

如果 Type(x) 结果为 Boolean,如果 xy 都为 truefalse,则返回 true,否则,返回 false

如果 xy 引用到同一个 Object 对象,返回 true,否则,返回 false

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

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

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

相关文章

  • JavaScript中的Array.prototype.sort方法详解

    摘要:方法可以接受一个可选的参数,比较回调函数。方法会修改原本数组输出如上,在调用方法后,自身数组被修改。对于长数组会使用快速排序,而快速排序一般是不稳定的。所以方法返回的数组永远是该方法认为的升序数组。 前几天在某公司面试的时候被问到关于这个方法的默认值的问题(然而面试官跟我说的其实是错的,当场我还不够底气去反驳)。突然发现对这个方法的了解还不够,因此回来查了资料,看了v8引擎的实现和EC...

    Snailclimb 评论0 收藏0
  • JavaScript 中 闭包 的详解

    摘要:局部变量,当定义该变量的函数调用结束时,该变量就会被垃圾回收机制回收而销毁。如果在函数中不使用匿名函数创建闭包,而是通过引用一个外部函数,也不会出现循环引用的问题。 闭包是什么 在 JavaScript 中,闭包是一个让人很难弄懂的概念。ECMAScript 中给闭包的定义是:闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量。 是不是看完这个定义感...

    longshengwang 评论0 收藏0
  • 详解一下 javascript 中==与===的比较

    摘要:当和为引用同一对象时返回。若为且为,返回比较的结果。等价于,除了与的执行顺序。所以标准中认为相等的值可能被检测为不等。实际上这一算法认为两个字符串已经是经过规范化的形式。 ** 11.9.3 抽象相等比较算法 **比较运算 x==y, 其中 x 和 y 是值,产生 true 或者 false。这样的比较按如下方式进行: 若 Type(x) 与 Type(y) 相同, 则若 Type(x...

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

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

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

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

    Sourcelink 评论0 收藏0

发表评论

0条评论

Pluser

|高级讲师

TA的文章

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