Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么javascript对象在Chrome、Firefox和Safari的控制台中显示不同的值?_Javascript - Fatal编程技术网

为什么javascript对象在Chrome、Firefox和Safari的控制台中显示不同的值?

为什么javascript对象在Chrome、Firefox和Safari的控制台中显示不同的值?,javascript,Javascript,可能重复: 考虑以下javascript: var foo = {bar : 1111}; console.log(foo); console.log(foo.bar); foo.bar = 2222; console.log(foo); console.log(foo.bar); 在Firefox的firebug中,这显示了我的预期: Object { bar=1111} 1111 Object { bar=2222} 2222 然而,在Safari和Chrome的控制台中,它显示:

可能重复:

考虑以下javascript:

var foo = {bar : 1111};
console.log(foo);
console.log(foo.bar);

foo.bar = 2222;
console.log(foo);
console.log(foo.bar);
在Firefox的firebug中,这显示了我的预期:

Object { bar=1111}
1111

Object { bar=2222}
2222
然而,在Safari和Chrome的控制台中,它显示:

Object { bar=2222}
1111

Object { bar=2222}
2222
换句话说,当打印转储时,对象在控制台中显示错误的属性,但如果打印特定属性,则显示正确的值

这是浏览器的一个怪癖吗?或者是我缺少的面向对象javascript的一个基本方面?

在Chrome(WebKit,也包括Safari)中,
console.log
使用对象参数调用记录对象引用。单击并打开“对象”选项卡后,内部保持不变(可能是某种缓存),并且不再与最初引用的对象相关(因此,如果在稍后阶段对象发生更改,则不会反映这一点)。但是,在这一点之前,对象保持“未缓存”。因此,当您多次记录一个对象,然后打开每个记录的对象时,它们都指向内存中的同一个对象,其值是最新更新的对象

这是一个众所周知的“问题”,尽管这种行为是设计决策的结果(参见第一个链接上的注释),因此开发团队并不认为它是一个bug

简单的解决方法是获取对象的非对象值的任何方法,因此任何序列化方法(例如
console.log(JSON.stringify(foo));



在Chrome(WebKit,也包括Safari)中,
console.log
使用对象参数调用记录对象引用。单击并打开“对象”选项卡后,内部保持不变(可能是某种缓存),并且不再与最初引用的对象相关(因此,如果在稍后阶段对象发生更改,则不会反映这一点)。但是,在这一点之前,对象保持“未缓存”。因此,当您多次记录一个对象,然后打开每个记录的对象时,它们都指向内存中的同一个对象,其值是最新更新的对象

这是一个众所周知的“问题”,尽管这种行为是设计决策的结果(参见第一个链接上的注释),因此开发团队并不认为它是一个bug

简单的解决方法是获取对象的非对象值的任何方法,因此任何序列化方法(例如
console.log(JSON.stringify(foo));




如果我不得不猜测的话,我会说调试器在内存中存储了第一个对象的引用,第二个对象的值本身。由于代码更新了引用,因此监视的调试器中的值也会更新。不过完全是胡乱猜测。最好的猜测是Safari和Chrome正在优化JavaScript,并将foo.bar的赋值与原始对象定义相结合,然后将foo.bar的预期值内联到两个console.log语句中。谢谢Mike和John。看来情况的确如此,不是吗。我不得不说,在我看来,这意味着Safari和Chrome在我调试代码时对我撒谎!如果我想在执行期间在代码的两个点上快速查看对象包含的内容,那么Safari和Chrome并没有给我一个真正的表示。也许我的调试例程不够复杂,我不应该依赖代码中的manual console.log行?这是以前出现过的,我将尝试找到它。@OskarSmith我怀疑您给出的示例也太琐碎,无法真正测试行为。我怀疑正在进行优化,因为在创建和重新分配
foo.bar
之间,他们没有对对象进行“工作”。如果有一些工作,比如方法调用,我会怀疑你会得到你想要的行为。如果我不得不猜测,我会说调试器在内存中为第一个对象存储一个引用,为第二个对象存储一个值本身。由于代码更新了引用,因此监视的调试器中的值也会更新。不过完全是胡乱猜测。最好的猜测是Safari和Chrome正在优化JavaScript,并将foo.bar的赋值与原始对象定义相结合,然后将foo.bar的预期值内联到两个console.log语句中。谢谢Mike和John。看来情况的确如此,不是吗。我不得不说,在我看来,这意味着Safari和Chrome在我调试代码时对我撒谎!如果我想在执行期间在代码的两个点上快速查看对象包含的内容,那么Safari和Chrome并没有给我一个真正的表示。也许我的调试例程不够复杂,我不应该依赖代码中的manual console.log行?这是以前出现过的,我将尝试找到它。@OskarSmith我怀疑您给出的示例也太琐碎,无法真正测试行为。我怀疑正在进行优化,因为在创建和重新分配
foo.bar
之间,他们没有对对象进行“工作”。如果有一些工作,比如方法调用,我会怀疑你会得到你想要的行为。我想我不用Firebug是对的!是的,我得承认这有点蹩脚。。它使得
console.log
对跟踪完全无用。但是我想你可以使用传统的调试器来处理这些东西应该可以调试。我收回这个。调用没有延迟,日志机制是基于引用的,但是调用看起来完全同步。我想我不用Firebug是对的!是的,我得承认这有点蹩脚。。它使得
console.log
对跟踪完全无用。但是我想你可以使用传统的调试器来处理这些东西应该可以调试。我接受这个