在JavaScript中比较对象的最佳方法是什么?
例:
var user1 = {name : "nerd", org: "dev"};
var user2 = {name : "nerd", org: "dev"};
var eq = user1 == user2;
alert(eq); // gives false
Run Code Online (Sandbox Code Playgroud)
我知道如果它们引用完全相同的对象,则两个对象是相等的,但有没有办法检查它们是否具有相同的属性值?
以下方式对我有用,但这是唯一的可能性吗?
var eq = Object.toJSON(user1) == Object.toJSON(user2);
alert(eq); // gives true
Run Code Online (Sandbox Code Playgroud) 严格的相等运算符将告诉您两个对象类型是否相等.但是,有没有办法判断两个对象是否相等,就像 Java中的哈希码值一样?
Stack Overflow问题JavaScript中是否有任何类型的hashCode函数?类似于这个问题,但需要更多的学术答案.上面的场景说明了为什么需要有一个,我想知道是否有任何等效的解决方案.
在Chrome的JavaScript控制台中:
> function create(proto) {
function Created() {}
Created.prototype = proto
return new Created
}
undefined
> cc = create()
Created {}
> cc
Created {}
Run Code Online (Sandbox Code Playgroud)
Created是函数私有的create函数; create完成后,没有(我知道)引用Created.然而,Chrome可以随时显示该功能的名称,从它创建的对象开始.
Chrome没有通过遵循"天真"方法实现这一目标:
> cc.constructor
function Object() { [native code] }
> cc.toString()
"object [Object]"
Run Code Online (Sandbox Code Playgroud)
无论如何,我没有constructor把proto争论传递给create:
> cc.__proto__.hasOwnProperty("constructor")
false
Run Code Online (Sandbox Code Playgroud)
我猜测的是,Created为了instanceof机制,JavaScript VM仍然存在.有人说instanceof
测试一个对象在其原型链中是否具有构造函数的prototype属性.
但是在我输入的上面的代码中create(),有效地传递undefined了原型; 因此Created甚至没有prototype设置到实际cc.__proto__.如果我们破解create公开Created …
为方便起见,我编写了一个简单的toJSON原型,用于处理我知道安全的JSON:
String.prototype.toJSON = function () {
return JSON.parse(this.valueOf());
};
Run Code Online (Sandbox Code Playgroud)
我在测试我的网络服务时使用它.不幸的是,即使这个简单的测试
var v0 = '{"echo":"hello_world"}'.toJSON(), v1 = {"echo": "hello_world"};
Run Code Online (Sandbox Code Playgroud)
它失败:
console.log(v0 == v1); // false
console.log(v0 === v1); // false
console.log(v0.echo == v1.echo); // true
console.log(v0.echo === v1.echo); // true
Run Code Online (Sandbox Code Playgroud)
我不知道导致这个问题的JavaScript是什么?
这是一个涉及更复杂的比较方式的问题,因此它不是重复的
我创建了一个JqTree,当用户更改其树结构时,应该比较"旧" JSON和"新" JSON结构,并且应该仅显示JSON已更改的值.
例如:
[{"name":"node1","id":1,"is_open":true,"children":
[
{"name":"child1","id":2},
{"name":"child2","id":3}
]
}]
Run Code Online (Sandbox Code Playgroud)

之后,客户端已经把child1下child2
[{"name":"node1","id":1,"is_open":true,"children":
[
{"name":"child2","id":3},
{"name":"child1","id":2}
]
}]
Run Code Online (Sandbox Code Playgroud)

我只想比较它们并检查哪些值已更改并用a显示它们alert,在这种情况下,它将是:
{"name":"child2","id":3},
{"name":"child1","id":2}
到目前为止,我有这个比较它们的小代码:
JSON.stringify(object1)=== JSON.stringify(object2); //我知道它不太可靠
但我正在寻找能够检查"差异"并从JSON中提取它的东西.
提前致谢.
我继承了一个项目,看起来有很多变量污染了全局范围,我想找到所有这些。查找用户引入的全局变量的最佳方法是什么?我想排除默认情况下存在的 window 对象上的属性,只过滤到我们的代码引入的属性。是否有工具或 IDE 插件可以让我轻松识别这些?谢谢
javascript ×6
json ×2
object ×2
comparison ×1
constructor ×1
equals ×1
global ×1
hashcode ×1
jquery ×1
scope ×1
to-json ×1