在此处的答案中,我没有阅读任何关于 equal 含义的内容。有人会说=== 的意思是相等且属于同一类型,但事实并非如此。这实际上意味着两个操作数都引用同一个对象,或者在值类型的情况下,具有相同的值。
那么,我们来看看下面的代码:
var a = [1,2,3];
var b = [1,2,3];
var c = a;
var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true
这里也一样:
var a = { x: 1, y: 2 };
var b = { x: 1, y: 2 };
var c = a;
var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true
甚至:
var a = { };
var b = { };
var c = a;
var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true
这种行为并不总是很明显。这个故事不仅仅是平等和同一类型。
规则是:
对于值类型(数字):
如果 a 和 b 具有相同的值并且属于相同的类型,则a === b 返回 true
对于引用类型:
如果 a 和 b 引用完全相同的对象,则a === b 返回 true
对于字符串:
如果a 和b 都是字符串并且包含完全相同的字符,则a === b 返回true
字符串:特殊情况...
字符串不是值类型,但在 Javascript 中它们的行为类似于值类型,因此当字符串中的字符相同且长度相同时,它们将“相等”(如第三条规则中所述)
现在变得有趣了:
var a = "12" + "3";
var b = "123";
alert(a === b); // returns true, because strings behave like value types
但是这个怎么样?:
var a = new String("123");
var b = "123";
alert(a === b); // returns false !! (but they are equal and of the same type)
我认为字符串的行为类似于值类型?好吧,这取决于你问谁......在这种情况下,a 和 b 不是同一类型。 a 是 Object 类型,而 b 是 string 类型。请记住,使用String 构造函数创建字符串对象会创建Object 类型的东西,大部分时间都表现为字符串。