javascript==和 ===

代码1:

[] == [];
[] === [];
{} == {};
{} === {};

代码2:

var n0 = 123;
var n1 = new Number(123);
var n2 = new Number(123);
var n3 = Number(123);
var n4 = Number(123);

n0 == n1;
n0 == n3;
n0 === n1;
n0 === n3

n1 == n2;
n1 === n2
n1 == n3;
n1 === n3;

n3 == n4;
n3 === n4;

问:比较结果是什么?以及为什么会是这个结果?

6 个回答

17
采纳

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

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,返回比较 x == ToNumber(y) 的结果。
  5. 若 Type(x) 为 String 且 Type(y) 为 Number,返回比较 ToNumber(x) == y 的结果。
  6. 若 Type(x) 为 Boolean, 返回比较 ToNumber(x) == y 的结果。
  7. 若 Type(y) 为 Boolean, 返回比较 x == ToNumber(y) 的结果。
  8. 若 Type(x) 为 String 或 Number,且 Type(y) 为 Object,返回比较 x == ToPrimitive(y) 的结果。
  9. 若 Type(x) 为 Object 且 Type(y) 为 String 或 Number, 返回比较 ToPrimitive(x) == y 的结果。
  10. 返回 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
阅读更多
想对作者说点什么? 我来说一句

javascript javascript

2008年09月02日 22.56MB 下载

JavaScript

2010年04月01日 162B 下载

随便东东 js 游戏

2009年01月02日 40KB 下载

javascript.rar

2010年08月19日 17.34MB 下载

JavaScript入门篇.txt

2018年05月15日 695B 下载

javascript 完全手册

2009年04月29日 148KB 下载

Javascript 开发指南

2009年09月12日 194KB 下载

javascript函数 javascript函数

2008年12月28日 12KB 下载

没有更多推荐了,返回首页

不良信息举报

javascript==和 ===

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭