【问题标题】:JavaScript: console.log() gives different results than alert()JavaScript:console.log() 给出的结果与 alert() 不同
【发布时间】:2013-03-20 15:47:30
【问题描述】:

console.log() 是否应该在 JavaScript 中调用变量时打印出变量的值?这是我的假设,但是当我在 Firefox(使用 Firebug)或 Google Chrome(并使用内置的开发工具)中运行下面的代码时,我似乎得到了数组的“最终”值而不是当时的阵列。如果我使用 alert() 语句,它们会打印出我所期望的 - 调用 alert() 语句时数组的值。

var params = new Array();
var tmp = new Array('apple', 'banana', 'cat');

for (var i=0; i < tmp.length; i++) {
    params[tmp[i]] = [];
}

console.log(params);
/*
SHOWS IN CONSOLE:

- []
+ apple             ["jan", "feb", "mar", "apr"]
+ banana            ["jan", "feb", "mar", "apr"]
+ apple             ["jan", "feb", "mar", "apr"]
*/

alert( print_arr(params) );
/* 
ALERT BOX TEXT:

[apple]:
[banana]:
[cat]:
*/

console.log('===========================================');

var tmp2 = new Array('jan', 'feb', 'mar', 'apr');
for (var i=0; i < tmp.length; i++) {
    for (var j=0; j < tmp2.length; j++) {
        params[tmp[i]].push(tmp2[j]);
    }
}           

console.log(params);
/*
SHOWS IN CONSOLE:

- []
+ apple             ["jan", "feb", "mar", "apr"]
+ banana            ["jan", "feb", "mar", "apr"]
+ apple             ["jan", "feb", "mar", "apr"]
*/

alert( print_arr(params) );
/* 
ALERT BOX TEXT:

[apple]:jan,feb,mar,apr
[banana]:jan,feb,mar,apr
[cat]:jan,feb,mar,apr
*/

function print_arr(arr) {
    var str = '';
    for (var k in arr) {
        str += '[' + k + ']:' + arr[k].toString() + "\n";

    }

    return str;
}

【问题讨论】:

  • 控制台记录对象,因此对对象所做的任何更改都会反映在记录的对象中
  • console.log(JSON.stringify(yourObj)); - 试试吧。
  • 为什么要创建一个数组并用属性而不是值填充它?为什么不使用 Object 呢?
  • 对您的编码风格的一个小评论:不要使用新的Array(a,b,c),而是使用[a,b,c]。眼睛更容易,标识符不必查找。

标签: javascript


【解决方案1】:

正如我在 cmets console.log(obj) 中所说的那样,它不会记录字符串表示形式,它会记录对内存中实际 javascript 对象的引用。因此,对对象所做的任何更改都会反映在记录的实例中。

如果要跟踪所做的渐进式更改,请将对象转换为字符串并打印为console.log(JSON.stringify(params))

此外,您没有将params 用作数组,而是将其用作地图。所以把params改成对象var params = {}

params 更改为一个对象并使用JSON.stringify 记录它

var params = {};
var tmp = new Array('apple', 'banana', 'cat');

for (var i=0; i < tmp.length; i++) {
    params[tmp[i]] = [];
}

console.log(JSON.stringify(params));
/*
SHOWS IN CONSOLE:

- []
+ apple             ["jan", "feb", "mar", "apr"]
+ banana            ["jan", "feb", "mar", "apr"]
+ apple             ["jan", "feb", "mar", "apr"]
*/

alert( print_arr(params) );
/* 
ALERT BOX TEXT:

[apple]:
[banana]:
[cat]:
*/

console.log('===========================================');

var tmp2 = new Array('jan', 'feb', 'mar', 'apr');
for (var i=0; i < tmp.length; i++) {
    for (var j=0; j < tmp2.length; j++) {
        params[tmp[i]].push(tmp2[j]);
    }
}           

console.log(JSON.stringify(params));
/*
SHOWS IN CONSOLE:

- []
+ apple             ["jan", "feb", "mar", "apr"]
+ banana            ["jan", "feb", "mar", "apr"]
+ apple             ["jan", "feb", "mar", "apr"]
*/

alert( print_arr(params) );
/* 
ALERT BOX TEXT:

[apple]:jan,feb,mar,apr
[banana]:jan,feb,mar,apr
[cat]:jan,feb,mar,apr
*/

function print_arr(arr) {
    var str = '';
    for (var k in arr) {
        str += '[' + k + ']:' + arr[k].toString() + "\n";

    }

    return str;
}

演示:Fiddle

【讨论】:

  • 这太棒了。谢谢你的提示!几个月来,我一直在努力克服console.log 由于引用更新而发生变化的事实!这将改变一切!
猜你喜欢
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多