【发布时间】:2014-12-01 05:29:55
【问题描述】:
我正在尝试学习单元测试,我发现了 Ben Alman 的 overview。在幻灯片23 上,他展示了一个名为actual 的变量如何包含对象{a: 1} 不等于对象本身。这意味着什么?它们的价值不一样吗?对象怎么可能不同?
test("deepEqual", 7, function() {
var actual = {a: 1};
equal( actual, {a: 1}, "fails because objects are different");
deepEqual(actual, {a: 1}, "passes because objects are equivalent");
deepEqual(actual, {a: "1"}, "fails because '1' !== 1");
var a = $("body > *");
var b = $("body").children();
equal( a, b, "fails because jQuery objects are different");
deepEqual(a, b, "fails because jQuery objects are not equivalent");
equal( a.get(), b.get(), "fails because element arrays are different");
deepEqual(a.get(), b.get(), "passes because element arrays are equivalent");
});
【问题讨论】:
-
你熟悉
==是如何比较 JS(实际上是大多数语言)中的对象吗?答案随即而来。 -
如果这听起来很愚蠢,我很抱歉,但我真的不明白。我正在阅读有关
==与===的信息,并且我了解new String("String")== "String"` 为真而new String("String")=== "String"` 为假。但是对于对象,这对我来说毫无意义。我什至做了console.log(typeof actual);来查看我是否缺少该类型,但它们是同一类型。在另一个 SO 响应中,有人将这些对象与 2 张白纸进行了比较。它们都是纸(===),但它们不是同一张纸(==),因为另一个 {a: 1} 是新创建对象的另一个实例。 -
我应该这样想吗?
-
这基本上是正确的思考方式。
==询问“这些是同一个对象”,而不是“这两个对象看起来是否相同”。就像刚出生的同卵双胞胎不是同一个人一样,尽管具有所有相同的属性,但两个对象即使包含相同的属性也不相等。
标签: javascript unit-testing qunit