JavaScript:console.log() 给出的结果与 alert() 不同

标签 javascript

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(obj) 不记录字符串表示形式,它记录对内存中实际 javascript 对象的引用。因此,对该对象所做的任何更改都会反射(reflect)在记录的实例中。

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

此外,您没有将 params 用作数组,而是将其用作 map 。所以将 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

关于JavaScript:console.log() 给出的结果与 alert() 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15528322/

相关文章:

javascript - 如何在同一页面上异步显示表单发布数据(不刷新页面)?

javascript - 拆分 RxJS 可观察输出

javascript - 在 Rails 3 + dygraphs 上作图

javascript - jPlayer 不播放播放列表对象的全局声明中的歌曲

javascript - 自动从客户站点预填写网络表单

javascript - 单击功能可显示悬停叠加层 - 单击时显示,但第二次单击时不会消失

javascript - Highcharts Highmap 世界 - 为大陆内的所有国家着色

javascript - 在 Javascript 中检测特定的 iPhone/iPod touch 型号

javascript - Ajax POST 数据未发送到 ASP.NET 中的 Page_Load 方法

javascript - jQuery slideToggle 一次切换多个 Div