2017-03-05 27 views
6

工作时在此示例在MDN站点解释滤波器方法:两个不同的输出使用+ VS,级联方法

var arr = [ 
    { id: 15 }, 
    { id: -1 }, 
    { id: 0 }, 
    { id: 3 }, 
    { id: 12.2 }, 
    { }, 
    { id: null }, 
    { id: NaN }, 
    { id: 'undefined' } 
]; 

var invalidEntries = 0; 

function isNumber(obj) { 
    return obj!== undefined && typeof(obj) === 'number' && !isNaN(obj); 
} 

function filterByID(item) { 
    if (isNumber(item.id)) { 
    return true; 
    } 
    invalidEntries++; 
    return false; 
} 

var arrByID = arr.filter(filterByID); 

console.log('Filtered Array\n', arrByID); 
// Filtered Array 
// [{ id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 12.2 }] 

console.log('Number of Invalid Entries = ', invalidEntries); 
// Number of Invalid Entries = 4 

这得到在萤火输出,正如所料:

Filtered array 

[Object { id=15}, Object { id=-1}, Object { id=0}, Object { id=3}, Object { id=12.2}] 
Number of Invalid Entries: 4 

但我最初,错误地但是故意键入第一个console.log();声明如下:

console.log('Filtered array\n' + arrById); 

,并得到这个萤火输出:

Filtered array 
[object Object],[object Object],[object Object],[object Object],[object Object] 

Number of Invalid Entries: 4 

为什么不同的输出?

回答

4

+ Concatting呼吁OBJ toString方法等返回字符串“对象”而不是返回obj属性(名称:值)作为使用,通过的console.log()输出到Concat的返回。

1

采取这种简单的对象:

var obj = { 
    test: 5, 
    another: 'hello' 
} 

如果你这样做console.log(obj),你问萤火虫要做的就是登录你的对象。它知道如何以一种很好的方式处理一个对象,向你展示所有的属性和值。

但是,如果你这样做console.log(obj.toString()),你问javascript在你问Firebug如何显示它之前将你的对象转换为一个字符串。作为一个字符串,萤火虫将会直接显示它。所以真正的问题是,为什么JavaScript将对象转换为像[object Object] ...这样的字符串?。你可以看到一个解释here

在你的问题,通过使用+,您强制将对象转换为字符串,以便它可以与'Filtered array\n'位来串联。


如果你想要做你放什么在你的问题,但还是有几分有用的输出,你可以尝试JSON.stringify()。例如:console.log('Filtered array\n' + JSON.stringify(arrById));

+0

+1这是一个更完整的答案,有一个更详细的解释,在objs上调用toSting()。 – commnux