资讯专栏INFORMATION COLUMN

关于js中的 “==” 与 “===”

hizengzeng / 1928人阅读

摘要:在中,和运算符用来比较两个值是否相等,但是他们对于相等的定义是不同的。如果不是正常值比如抛出一个错误,中断执行。如果不是正常值,中断执行。如果与相同,执行严格相等运算。如果为,或,为,则返回比较的结果。

在js中,"==" 和 "==="运算符用来比较两个值是否相等,但是他们对于相等的定义是不同的。两个运算符都可以用来比较任意类型的操作数,如果两个操作数相等,返回true,否则,返回false。"===" 严格相等运算符,用来比较两个操作数是否严格相等。"==" 相等运算符,用来比较两个操作数是否相等。
详细信息可参照ECMA标准(戳这里)。

Abstract Equality Comparison ==

== 相等操作符,在比较前会把比较的两个数转换成相同的数据类型之后,然后对两个数进行比较。转换后,比较方式与 === 相同。

ECMA中比较规则如下:

The comparison x == y, where x and y are values, produces true or false.

1. ReturnIfAbrupt(x).
2. ReturnIfAbrupt(y).
3. If Type(x) is the same as Type(y), then
    Return the result of performing Strict Equality Comparison x === y.
4. If x is null and y is undefined, return true.
5. If x is undefined and y is null, return true.
6. If Type(x) is Number and Type(y) is String,
    return the result of the comparison x == ToNumber(y).
7. If Type(x) is String and Type(y) is Number,
    return the result of the comparison ToNumber(x) == y.
8. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
9. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
10. If Type(x) is either String, Number, or Symbol and Type(y) is Object, then
    return the result of the comparison x == ToPrimitive(y).
11. If Type(x) is Object and Type(y) is either String, Number, or Symbol, then
    return the result of the comparison ToPrimitive(x) == y.
12. Return false.

翻译如下:

比较 x == y,当x 和 y是正常值时,返回 true 或者 false。

如果x不是正常值(比如抛出一个错误),中断执行。

如果y不是正常值,中断执行。

如果Type(x)与Type(y)相同,执行严格相等运算x === y。

如果x为null且y为undefined,则返回true。

如果x为undefined,y为null,则返回true。

如果Type(x)是Number,Type(y)是String,返回比较结果 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或Symbol,Type(y)为Object,则返回比较的结果x == ToPrimitive(y)。

如果Type(x)是Object,Type(y)是String,Number或Symbol,那么
返回比较结果ToPrimitive(x)== y。

返回假。

简化一下 ,可以理解为:

如果两个操作数类型相同,则进行 x===y。

如果一个为null,另一个为undefined,则返回true。

如果两个操作数均为基本数据类型,则把操作数转换为Number类型进行比较。

如果其中有一个操作数为Object,则调用对象的 toString 或者 valueOf 方法,将对象转化为原始值进行比较。

如果不满足上述任何情况,则返回 false。

Strict Equality Comparison "==="

"===" 严格相等操作符,用来比较两个操作数是否严格相等。

ECMA中比较规则如下:

1. If Type(x) is different from Type(y), return false.
2. If Type(x) is Undefined, return true.
3. If Type(x) is Null, return true.
4. If Type(x) is Number, then
    a. If x is NaN, return false.
    b. If y is NaN, return false.
    c. If x is the same Number value as y, return true.
    d. If x is +0 and y is −0, return true.
    e. If x is −0 and y is +0, return true.
    f. Return false.
5. If Type(x) is String, then
    a. If x and y are exactly the same sequence of code units (same length and same code           units at corresponding indices), return true.
    b. Else, return false.
6. If Type(x) is Boolean, then
    a. If x and y are both true or both false, return true.
    b. Else, return false.
7. If x and y are the same Symbol value, return true.
8. If x and y are the same Object value, return true.
9. Return 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的Number值相同,则返回true。

如果x为+0且y为-0,则返回true。

如果x是-0而y是+0,则返回true。

返回假。

如果Type(x)是String,那么

如果x和y是完全相同的代码单元序列(相同长度和相应索引处的相同代码单位),则返回true。

否则返回假。

如果Type(x)为Boolean,则
a.如果x和y都为true或都为false,则返回true。
b.否则返回假。

如果x和y是相同的符号值,则返回true。

如果x和y是相同的Object值,则返回true。

返回假。

简化一下,可以理解为:

如果两个操作数类型不相同,返回false。

undefined === undefined => true

null === null => true

如果操作数的数据类型都为Number,当两个数的值相同时,返回true, 否则返回 false。

注: -0 === +0   => true     +0 === -0 => true
    NaN 与任何值都不相等,包括他自己。 所以要判断一个数值是否为NaN, 可采用 x !== x ,只有NaN 返回true

如果操作数的数据类型都为String或Boolean时,只有x和y完全相同,返回ture。

如果操作数的数据类型都为Object,只有两个操作数指向的地址完全相同时,返回true,否则返回false。

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

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

相关文章

  • JavaScript深入浅出

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

    blair 评论0 收藏0
  • 正在失业中的《课多周刊》(第3期)

    摘要:正在失业中的课多周刊第期我们的微信公众号,更多精彩内容皆在微信公众号,欢迎关注。若有帮助,请把课多周刊推荐给你的朋友,你的支持是我们最大的动力。是一种祸害译本文浅谈了在中关于的不好之处。浅谈超时一运维的排查方式。 正在失业中的《课多周刊》(第3期) 我们的微信公众号:fed-talk,更多精彩内容皆在微信公众号,欢迎关注。 若有帮助,请把 课多周刊 推荐给你的朋友,你的支持是我们最大的...

    robin 评论0 收藏0
  • 正在失业中的《课多周刊》(第3期)

    摘要:正在失业中的课多周刊第期我们的微信公众号,更多精彩内容皆在微信公众号,欢迎关注。若有帮助,请把课多周刊推荐给你的朋友,你的支持是我们最大的动力。是一种祸害译本文浅谈了在中关于的不好之处。浅谈超时一运维的排查方式。 正在失业中的《课多周刊》(第3期) 我们的微信公众号:fed-talk,更多精彩内容皆在微信公众号,欢迎关注。 若有帮助,请把 课多周刊 推荐给你的朋友,你的支持是我们最大的...

    Joyven 评论0 收藏0
  • 关于 Glob (gulp)的学习

    摘要:参考资料下文是关于的方法的第一个参数的学习。因此,会展开为和。获取目录下所有文件名长度为字符的文件。匹配该路径段中在指定范围内的一个字符。匹配完全且精确地匹配,且不可组合不符合任何模型之一的字符。可通过在设置,让将视为普通字符。 参考资料:https://github.com/isaacs/nod... 下文是关于 Gulp 的 gulp.src(globs[, options]) 方...

    ThreeWords 评论0 收藏0
  • Node.js 指南(关于Node.js

    摘要:如果不熟悉这种语言,有一篇关于阻塞与非阻塞的完整文章。在设计上与的或的等系统类似,并受其影响,进一步采用事件模型。它将事件循环呈现为运行时构造而不是库,在其他系统中,始终存在阻塞调用以启动事件循环。上一篇指南目录下一篇入门指南 关于Node.js 作为异步事件驱动的JavaScript运行时,Node旨在构建可伸缩的网络应用程序,在下面的hello world示例中,可以同时处理许多连...

    Java_oldboy 评论0 收藏0

发表评论

0条评论

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