今天遇到了两个问题,自己觉得挺有意思也比较容易忽视所以记录下来当做学习笔记,题目是这样的:
(一)这段代码片段的输出结果
function foo(){
console.log("aaa");
return function(){console.log("bbb");};
}
console.log(foo()());
我自己的思路是foo函数返回的是一个匿名函数,所以foo()输出aaa和function(){console.log("bbb");},
而foo()()是执行了匿名函数所以我认为输出的应该是aaa,bbb;
然而,在控制台跑了一下发现输出的是aaa,bbb,undefined;后来反应过来最后执行的语句应该是
console.log(console.log("bbb"));所以输出了一个undefined。以后自己应该更加细心的审题,分析
逻辑。
(二)这段代码片段的输出结果
var foo = {
f:1,
s:2,
t:3
};
foo.f = undefined;
delete foo.t;
for(var i in foo){
if(foo.hasOwnProperty(i)){
console.log(i,+foo[i]);
}
}
我简单的以为输出的是f undefined s 2。。。。。
想要解决这个问题首先要明确hasOwnProperty这个方法的定义。
hasOwnProperty是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是,此方法无
法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。
那么当i为f和s是时候是有输出的,输出结果如下:
今天百度了下明白了,JavaScript在进行相加操作的时候会把值的类型进行转换,比如1+undefined,那么
undefined将被转换为数字类型,undefined在javascript中表示“未定义,将它强制转换成数值会返回
在这个题中 console.log(i,+foo[i]); 我认为应该理解为 console.log(i,0+foo[i]);所以undefined被转换成NaN
假如把题目改成这样console.log(i+foo[i]);因为 i是字符串类型则undefined不需要转换。实验证明确实是这样。