我试图运行一个简单的javascript函数,试图学习javascript中的filter
函数:
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) && item.id !== 0){
return true;
}
invalidEntries++;
return false;
}
var arrByID = arr.filter(filterByID);
console.log("Filtered array: " ,arrByID);
上面的代码看起来很完美,但是当我将行console.log("Filtered array: " ,arrByID);
更改为console.log("Filtered array: " +arrByID);
时,它会给我带来完全不同的输出:
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) && item.id !== 0){
return true;
}
invalidEntries++;
return false;
}
var arrByID = arr.filter(filterByID);
console.log("Filtered array: " +arrByID);
我可以知道为什么会这样吗,不是两个都显示相同的输出吗?我是学习JavaScript的新手,如果这是一个愚蠢的问题,请忽略。
答案 0 :(得分:3)
String+Array
将强制数组字符串化并连接两个字符串
控制台方法允许使用多个参数(用,
分隔),并且将分别对待每个参数,因此您可以使用console.log(String, Array)
获得正确的数组输出。
答案 1 :(得分:3)
执行console.log("something" + obj)
时,实际上是在调用obj.toString()
将对象转换为字符串,然后将此字符串与第一个字符串({{1}左端的字符串)连接},例如我的示例中的+
。
但是,当您执行"something"
时,将分别记录字符串和对象。 console.log("something", obj)
不会先转换为字符串。因此,obj
确实可以以不同的方式显示它。例如。它可以让您检查物体。
对象在日志中的显示方式取决于console.log
的实现。在不同的浏览器或node.js中可能有所不同。
答案 2 :(得分:0)
“ +”连接起来是因为第一个参数(“ Filtered array:”)是一个字符串 因此它将第二个参数视为字符串。
例如,console.log(1 + 2)返回3,而console.log(“ 1” +2)返回12。