Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.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 为什么在操作JSON对象之前会更改它?_Javascript_Jquery_Json_Parsing_Typeof - Fatal编程技术网

Javascript 为什么在操作JSON对象之前会更改它?

Javascript 为什么在操作JSON对象之前会更改它?,javascript,jquery,json,parsing,typeof,Javascript,Jquery,Json,Parsing,Typeof,这是我的密码: var data = $.parseJSON('[{"Date":"2014-02-19","Count":"963"},{"Date":"2014-02-20","Count":"2638"}]'); console.log(data); console.log(typeof data[0].Count); data.forEach(function(d) { d.Count = +d.Count; }); console.log(typeof data[0].Coun

这是我的密码:

var data = $.parseJSON('[{"Date":"2014-02-19","Count":"963"},{"Date":"2014-02-20","Count":"2638"}]');
console.log(data);
console.log(typeof data[0].Count);
data.forEach(function(d) {
    d.Count = +d.Count;
});
console.log(typeof data[0].Count);
第一个控制台日志将我的计数视为每个对象内部的数字

第二个控制台日志是string

最后一个console.log是数字

有人能向我解释一下,当我在将Count操作成一个带有d.Count=+d.Count代码行的数字之前记录数据对象时,为什么第一个控制台日志会将每个计数视为一个数字


这里有一些代码:

我认为这与控制台输出对象的时间有关。看看这些:

如果您使用的是Chrome/webkit,您可能会在公开三角形(“twistie”)附近看到一个“小蓝色i”,其工具提示显示,数据是在开发人员首次展开twistie时填充的。我稍微修改了您的JSFIDLE示例,您可以看到输出是您所期望的:

var data = $.parseJSON('[{"Date":"2014-02-19","Count":"963"},{"Date":"2014-02-20","Count":"2638"},{"Date":"2014-02-21","Count":"1962"},{"Date":"2014-02-22","Count":"1122"},{"Date":"2014-02-23","Count":"1192"},{"Date":"2014-02-24","Count":"2204"},{"Date":"2014-02-25","Count":"1906"},{"Date":"2014-02-26","Count":"1362"}]');
console.log(data);                  // (twistie) [Object, Object, Object, Object, Object, Object, Object, Object]
$.each(data, function () {
    console.log(this);              // Object {Date: "2014-02-19", Count: "963"}, Object {Date: "2014-02-20", Count: "2638"}, ... 
});
console.log(typeof data[0].Count);  // string
data.forEach(function (d) {
    d.Count = +d.Count;
});
console.log(typeof data[0].Count);  // number
试一试

var data = $.parseJSON('[{"Date":"2014-02-19","Count":"963"},{"Date":"2014-02-20","Count":"2638"},{"Date":"2014-02-21","Count":"1962"},{"Date":"2014-02-22","Count":"1122"},{"Date":"2014-02-23","Count":"1192"},{"Date":"2014-02-24","Count":"2204"},{"Date":"2014-02-25","Count":"1906"},{"Date":"2014-02-26","Count":"1362"}]');
data.forEach( function (d) {
    Object.keys(d).forEach (function (e) {
        document.write(e + ' ' + typeof e + ' ');
    })
    document.writeln("<br>");
});
document.writeln("<br>"+typeof data[0].Count);
data.forEach(function(d) {
    d.Count = +d.Count;
});
document.writeln("<br>"+typeof data[0].Count);

Date string Count string 
Date string Count string 
Date string Count string 
Date string Count string 
Date string Count string 
Date string Count string 
Date string Count string 
Date string Count string 

string 
number 
var data=$.parseJSON('[{“日期”:“2014-02-19”,“计数”:“963”},{“日期”:“2014-02-20”,“计数”:“2638”},{“日期”:“2014-02-21”,“计数”:“1962”},{“日期”:“2014-02-22”,“计数”:“1122”},{“日期”:“2014-02-23”,“计数”:“1192”},{“日期”:“2014-02-24”,“计数”:“2204”},{“日期”:“2014-02-25”,“计数”:“1906”},{“日期”:“2014-02-26”},{;
data.forEach(函数(d){
对象。键(d)。forEach(函数(e){
文件。书写(e+“”+类型e+“”);
})
书面文件(“
”); }); document.writeln(“
”+数据类型[0]。计数); data.forEach(函数(d){ d、 计数=+d.Count; }); document.writeln(“
”+数据类型[0]。计数); 日期字符串计数字符串 日期字符串计数字符串 日期字符串计数字符串 日期字符串计数字符串 日期字符串计数字符串 日期字符串计数字符串 日期字符串计数字符串 日期字符串计数字符串 一串 数
您将看到,这可能是一个console.log错误,正如注释所建议的那样。

当您console.log(data)时,数据对象在所有修改后都有值,这意味着应用了forEach,因此它将计数显示为数字

让我举例说明

var data = $.parseJSON('[{"Date":"2014-02-19","Count":"963"},{"Date":"2014-02- 20","Count":"2638"}]');
    console.log(data);                  //The log will show you 20 rather than 963.
    data[0].Count = 20;                 //Modify the object
在本例中,我们首先控制台数据,我们希望计数的值为963,但它的值为20


因此,第一个控制台日志将计数视为数字,因为您可以在foreach中对其进行修改。

.google chrome magic。首先尝试记录它,添加延迟,并在延迟结束之前在控制台中展开对象。魔法消失了。如果在延迟完成之前不展开对象,它将显示一个数字。我不知道它背后的细节,但在我看来,chrome在需要显示之前不会查看对象的属性。这实际上不是一个bug,而是对
console.log
实际功能的常见误解。它在执行对象时捕获对象的引用,但不一定保存当时的状态副本。因此,您在控制台中实际看到的不一定是调用
console.log
时对象所持有的内容。