【问题标题】:Javascript object initialized with strange values用奇怪的值初始化的 Javascript 对象
【发布时间】:2012-06-27 02:11:55
【问题描述】:

我实际上已经尝试调试它一整天,这完全令人困惑。寻找一些提示。

我在 javascript 命名空间中有这些函数:

var ZZ = {
  bar: function(data) {
    console.log(data);
  },
  foo: function() {
    $.ajax({
      'url':'/test',
      'type':'GET',
      'dataType':'jsonp',
      'success':function(ret_json, status) {
        console.log(ret_json);   // SUCCESS_1
        console.log(ret_json[1].title);   //SUCCESS_2
        bar(ret_json);
      }
    });
  },
...
}

所以我查看了开发人员工具的“网络”选项卡,返回的 json 是正确的......类似于:

[{'id':1, 'url':'http://a.com', 'title':'hi'}, {'id':2, 'url':'http://b.com', 'title':'hi2'}]

现在我查看控制台并看到在 SUCCESS_1 处,它打印出如下内容:

[{'id':1, 'url':'http://c.com', 'title':'hi3'}, {'id':2, 'url':'http://c.com', 'title':'hi3'}]

如您所见,id 是正确的,但 url 和 title 不正确。 (我也可以更改数据库中的id,它们将被正确执行)

然后在 SUCCESS_2 的下一行,它获取了正确的标题! 'hi2'

接下来我将调试器语句放入成功函数中: ret_json 看起来完全正确,但是当我进入 bar() 函数时.. 数据又看起来不对了。

接下来我补充:

var hi = {};
console.log(hi);

进入成功函数..它打印出来..(不是开玩笑)

{'url':'http://c.com', 'title':'hi3'}

所以基本上,这个“默认”会覆盖实际存在的内容。

我在 ajax 调用中添加了 cache:false,我尝试过 json 和 jsonp,我尝试过清除缓存,我尝试过使用 chrome/safari/firefox.. 但什么也没做,我怀疑这是什么东西太明显了……真的是真的被搞砸了。

我可以尝试什么其他想法?


UPDATE:将此命名空间添加到不同的 html 页面。 最令人震惊的例子

var hi = {}
console.log(hi)

打印的东西不见了 但是 ret_json 具有错误数据的原始问题仍然存在。 (我仍然无法访问上一个 html 页面的工作版本)

【问题讨论】:

  • console.log(hi) 的东西肯定很奇怪,不能马上说什么,但是您是否尝试过删除除 jquery 和示例脚本之外的所有外部脚本?另外,尝试在控制台中运行相同的短代码...
  • 是的,如果我将它自己移动到一个页面,这个 ajax 调用就可以正常工作。在我当前的 javascript 环境中,这肯定是与其他东西的一些奇怪的交互......只是不确定我应该看哪里。
  • 这是否与 JSON 中的单引号有关?
  • 清除浏览器缓存,并确保 jQuery 也没有缓存服务器数据。
  • @veritasetratio 无法想象它与引号相关.. 不知道如何强制 json 对字符串使用双引号

标签: javascript jquery


【解决方案1】:

@ggez44,这是因为 console.log 不是 Chrome/Firefox/Safari 中的同步调用。通常会有几毫秒的延迟。

在我的机器上看起来延迟不是恒定的,在 Chrome 中介于 4ms 和 16ms 之间,在 Safari 中约为 2ms。

http://techblog.appnexus.com/2011/webkit-chrome-safari-console-log-bug/

Bizarre console.log behaviour in Chrome Developer Tools

我对此的推测性解决方案是执行“console.log(a.toJSON());”之类的操作。然后你最终得到一个指向传入的字符串对象的指针,它与原始对象无关。

更新:显然这是一个“功能,而不是错误”。在 webkit 邮件列表中有一些相当不错的门票链接。 Why does javascript object show different values in console in Chrome, Firefox, Safari?

【讨论】:

  • 哇,是的,我完全将它设置为“栏”功能中的那些“默认”值。 (生成所以 grep 没有命中).. 但由于它是在我的 console.log 调用之后,我什至没有费心去看。此外,它也不能完全在 Firefox 中运行。控制台会记录正确的对象,但如果您单击这些对象的详细信息,数据会再次按时间转发
  • 伟大的发现!谢谢,亚历克斯,我也很好奇!
【解决方案2】:

您是否在代码中的任何位置添加了以下内容?

Object.prototype.url = "http://c.com";
Object.prototype.title = "hi3";

这是创建空对象时显示这些属性的唯一原因。

【讨论】:

  • +1; @ggez44 要验证这一点,请运行 console.log(Object.prototype) 并查看这些属性是否存在。
  • 谢谢,我对有问题的数据进行了 greps,但没有找到任何东西,但我会尝试打印出对象原型......现在我的分支中有其他东西坏了,但会回来结果很快。非常感谢!
  • 不.. 原型没有什么特别之处。检查 Object.prototype 以及查看实例的原型(具有奇怪值的实例)
猜你喜欢
  • 1970-01-01
  • 2013-11-24
  • 2011-02-22
  • 2012-11-10
  • 2021-12-06
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
相关资源
最近更新 更多