在一个代码库中,我看到了一行代码。
var foo = JSON.parse(JSON.stringify(foo));
我认为这段代码试图从对象中剥离任何方法。我并没有看到它做其他事情的迹象。有更有效的方法来尝试这个吗?Node 是否会优化它?
var foo = JSON.parse(JSON.stringify(foo));
我认为这段代码试图从对象中剥离任何方法。我并没有看到它做其他事情的迹象。有更有效的方法来尝试这个吗?Node 是否会优化它?
// route reply/error
this.connection.on('message', function(msg) {
var msg = JSON.parse(JSON.stringify(msg));
var handler;
if (msg.type == constants.messageType.methodReturn || msg.type == constants.messageType.error) {
handler = self.cookies[msg.replySerial];
if (msg.type == constants.messageType.methodReturn && msg.body)
msg.body.unshift(null); // first argument - no errors, null
if (handler) {
delete self.cookies[msg.replySerial];
var props = {
connection: self.connection,
bus: self,
message: msg,
signature: msg.signature
};
if (msg.type == constants.messageType.methodReturn)
handler.apply(props, msg.body); // body as array of arguments
else
handler.call(props, msg.body); // body as first argument
}
msg.body.unshift(null)
的那一行。如果没有进行复制,它将修改原始对象。var msg
实际上并没有定义一个新变量。由于在此作用域中已经将msg
定义为函数参数,因此var msg
不会重新声明(在代码中使用var
是技术上的错误)。
var obj = {
list: [1,2,3],
items: [{language: "English", greeting: "hello"},
{language: "Spanish", greeting: "hola"},
{language: "French", greeting: "bonjour"}]
}
// make a completely independent copy of obj
var copy = JSON.parse(JSON.stringify(obj));
copy.items[0].greeting = "Yo";
console.log(obj.items[0].greeting); // "hello"
console.log(copy.items[0].greeting); // "Yo"
JSON.stringify()
不支持循环引用或自引用,因此您不能拥有任何这些东西。如果您有多个对同一对象的引用,则每个引用都将被复制到一个新的单独对象中。而且,JSON.stringify()
和JSON.parse()
的组合不支持除Object
以外的其他对象,如RegExp
、Date
或任何您自己的自定义对象(它们会转换为普通对象)。因此,这种方法存在一些限制,但对于大多数情况来说,它非常简单易行。
根据Matt(在评论中)所说,可以在这里看到一个自定义函数,它可以创建一个支持循环引用和某些类型的自定义对象的克隆对象。
如果有人不知道,JavaScript中将一个对象赋给另一个变量,并不会复制对象。在JavaScript中,赋值类似于将指针引用设置为同一对象。然后每个变量都指向相同的基础对象,因此通过任何一个变量修改对象都会导致两种情况下都修改相同的对象,就像这样:
var obj = {
list: [1,2,3],
items: [{language: "English", greeting: "hello"},
{language: "Spanish", greeting: "hola"},
{language: "French", greeting: "bonjour"}]
}
var copy = obj;
// modify copy
copy.items[0].greeting = "Yo";
// both obj and copy refer to the exact same object
console.log(obj.items[0].greeting); // "Yo"
console.log(copy.items[0].greeting); // "Yo"
for(key in ob)
{
if(typeof ob[key] === 'function')
{
delete ob[key];
}
}
或许你希望实现的是两者的结合。