当前位置: 首页 > 面试题库 >

为什么javascript对象在Chrome,Firefox,Safari中的控制台中显示不同的值?[重复]

景靖琪
2023-03-14
问题内容

考虑这个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带有对象参数的调用会记录一个对象引用。一旦单击并打开了对象选项卡,内部将保持不变(可能是各种缓存),并且不再与最初引用的对象相关(因此,如果在稍后阶段对象发生更改,则不会反映出来)。但是,在此之前,对象保持“未缓存”状态。因此,当您多次记录一个对象然后打开每个记录的对象时,它们都指向内存中的同一对象,其值是最新的对象。

这是一个众所周知的“问题”,尽管行为是设计决定的结果(请参阅第一个链接的评论),因此开发团队不认为这是一个错误。

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

https://bugs.webkit.org/show_bug.cgi?id=35801


http://code.google.com/p/chromium/issues/detail?id=44720


http://code.google.com/p/铬/问题/细节?id =
50316



 类似资料:
  • 我正在试图理解为什么下面的代码会像它那样运行。具体而言,为什么第一个表达式会输出的完整和最终版本?我意识到这和吊装有关(也许?)或者其他一些我没有完全理解的概念。只是在网上搜索这个是很有挑战性的,因为我没有合适的词库来搜索我想知道的东西。 我在为自己编写代码时发现了这一点,其中我希望通过for-loop看到对象在每次迭代时的状态。我很惊讶地看到输出到控制台的对象在每一个回合都是一样的;该状态是整个

  • 问题内容: 我今天注意到,当您输入控制台时,Chrome 49不再输出。而是输出字符串。 为什么是这样?语言改变了吗? 问题答案: 现在,Chromedevtools会自动在隐含的一对括号中包装所有以开头和结尾的内容,以强制将其评估为表达式。这样,现在创建一个空对象。如果您回顾历史记录(),则会看到此内容,前一行将包含在中。 为什么? 我不知道,但是 我可以猜到它减少了对于不了解block-vs-

  • 问题内容: 当我在Chrome JavaScript Console中键入简单对象时,会得到如下输出: 等等。 但是当我键入对象时发生语法错误: 虽然我确定可以在初始化对象时正确使用此表达式,因为: 也许这是一个愚蠢的问题,但我真的想知道为什么会这样吗? 问题答案: 因为您的语句被视为一个 block ,而不是对象文字声明。 请注意,ExpressionStatement不能以大括号开头,因为这可

  • 我最近开始做react native,不明白如何调试,以便在控制台中得到结果。这是我在控制台得到的结果。

  • 我正在使用lowagie/iTextPDF生成Java的PDF,并且在Firefox和Chrome中显示输出有问题,但是IE8显示得很好。 Firefox和Chrome显示混乱,如下所示: %PDF-1.4%���� 20 obj 下面是servlet代码的一部分: 我已经尝试过更新Firefox,更新PDF插件,并确保它设置为使用Adobe的PDF查看器而不是Firefox的查看器。 作为测试,

  • 问题内容: 我希望这不是重复的。 我试图用来在单独的控制台中打开脚本。我尝试设置参数,但是没有成功。 我在64位Windows 7上使用32位Python 2.7。 问题答案: 如果不使用,则必须提供列表而不是命令字符串,例如: 然后将其打开而没有外壳。 这是您可以从Python调用子流程的最手动,最灵活的方式。如果只需要输出,请执行以下操作: