摘要:今天在笔试题被公子给了,遂想起之前要写的一篇文章,中蛋疼的比较运算。当和为引用同一对象时返回。若为且为,返回的结果。所以标准中认为相等的值可能被检测为不等。实际上这一算法认为两个字符串已经是经过规范化的形式。
今天在 JS笔试题 被 @公子 给AT了,遂想起之前要写的一篇文章,javascript 中蛋疼的比较运算。
翻译自:http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
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 上表现不同。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/87616.html
摘要:方法可以接受一个可选的参数,比较回调函数。方法会修改原本数组输出如上,在调用方法后,自身数组被修改。对于长数组会使用快速排序,而快速排序一般是不稳定的。所以方法返回的数组永远是该方法认为的升序数组。 前几天在某公司面试的时候被问到关于这个方法的默认值的问题(然而面试官跟我说的其实是错的,当场我还不够底气去反驳)。突然发现对这个方法的了解还不够,因此回来查了资料,看了v8引擎的实现和EC...
摘要:局部变量,当定义该变量的函数调用结束时,该变量就会被垃圾回收机制回收而销毁。如果在函数中不使用匿名函数创建闭包,而是通过引用一个外部函数,也不会出现循环引用的问题。 闭包是什么 在 JavaScript 中,闭包是一个让人很难弄懂的概念。ECMAScript 中给闭包的定义是:闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量。 是不是看完这个定义感...
摘要:当和为引用同一对象时返回。若为且为,返回比较的结果。等价于,除了与的执行顺序。所以标准中认为相等的值可能被检测为不等。实际上这一算法认为两个字符串已经是经过规范化的形式。 ** 11.9.3 抽象相等比较算法 **比较运算 x==y, 其中 x 和 y 是值,产生 true 或者 false。这样的比较按如下方式进行: 若 Type(x) 与 Type(y) 相同, 则若 Type(x...
摘要:理解的函数基础要搞好深入浅出原型使用原型模型,虽然这经常被当作缺点提及,但是只要善于运用,其实基于原型的继承模型比传统的类继承还要强大。中文指南基本操作指南二继续熟悉的几对方法,包括,,。商业转载请联系作者获得授权,非商业转载请注明出处。 怎样使用 this 因为本人属于伪前端,因此文中只看懂了 8 成左右,希望能够给大家带来帮助....(据说是阿里的前端妹子写的) this 的值到底...
摘要:代码示例等号检查,类型转换后返回全等检查,由于时类型,时类型,类型不同,返回关系运算符关系运算符执行的是比较运算,通常用于判断两个变量哪个大哪个小关系运算符都返回一个布尔值。逻辑或运输符用双竖线表示。 1.运算符 JavaScript中常见的运算符包含:赋值运算符、算数运算符、等性运算符、关系运算符、条件运算符、布尔运算符、逻辑运算符…… 1.赋值运算符 = 赋值运算符=,用于给某个变...
阅读 1864·2021-11-15 11:39
阅读 1073·2020-12-03 17:06
阅读 729·2019-12-27 11:42
阅读 3267·2019-08-30 13:59
阅读 1452·2019-08-26 13:22
阅读 3281·2019-08-26 12:15
阅读 2470·2019-08-26 10:22
阅读 1557·2019-08-23 18:40