【发布时间】:2017-09-08 12:17:25
【问题描述】:
免责声明:我是 JS 的初学者
我正在阅读 Eloquent Javascript,其中一项练习是深入比较 JS 中的对象。
有一些对象定义如下:
var obj = {here: {is: "an"}, object: 2};
你应该检查它们的内容是否相等。 然后是3个测试:
console.log(deepEqual(obj, obj)); // supposed to return true
console.log(deepEqual(obj, {here: 1, object: 2})); // supposed to return false
console.log(deepEqual(obj, {here: {is: "an"}, object: 2})); // supposed to return true
这是我对深度相等方法的实现。为了简化,我假设比较的对象具有相同的结构,它们在现实生活中不会,但我的方法应该返回 false(我认为)
function deepEqual(obj1,obj2)
{
console.log("========");
for(prop in obj1)
{
console.log(prop);
if (typeof(prop)=="object" && prop!=null)
{
console.log("Inspecting object ", obj1[prop],obj2[prop]);
if (!deepEqual(obj1[prop],obj2[prop]))
{
return false;
}
}
else
{
console.log("Inspecting property ",prop,'[',obj1[prop],'][',obj2[prop],']');
if (obj1[prop]!=obj2[prop])
{
console.log("Different property");
return false;
}
}
}
return true;
}
var obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
// → true
console.log(deepEqual(obj, {here: 1, object: 2}));
// → false
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// → true
分别返回真、假和……假!
这是输出:
========
here
Inspecting property here [ {is: "an"} ][ {is: "an"} ]
object
Inspecting property object [ 2 ][ 2 ]
true
========
here
Inspecting property here [ {is: "an"} ][ 1 ]
Different property
false
========
here
Inspecting property here [ {is: "an"} ][ {is: "an"} ]
Different property
false
有两点我不明白:
- 为什么总是转到“检查属性”而不是“检查对象”? {is: "an"} 不是一个对象吗?
- 为什么表达式 "obj1[prop]!=obj2[prop]" 为真,尽管根据日志,它们都等于:{is: "an"}?
仅供参考,书中的参考实现是:
function deepEqual(a, b) {
if (a === b) return true;
if (a == null || typeof a != "object" ||
b == null || typeof b != "object")
return false;
var propsInA = 0, propsInB = 0;
for (var prop in a)
propsInA += 1;
for (var prop in b) {
propsInB += 1;
if (!(prop in a) || !deepEqual(a[prop], b[prop]))
return false;
}
return propsInA == propsInB;
}
对我来说,第一个 for 循环只计算 A 中有多少属性对吗? 我完全被第二个 for 循环( for (var prop in b) )弄糊涂了……
编辑:非常感谢各位的回答!我不知道该接受哪一个,因为两者都对我有很大帮助:-/
【问题讨论】:
标签: javascript