我遇到的js中一些容易忽视的“陷阱”

今天遇到了两个问题,自己觉得挺有意思也比较容易忽视所以记录下来当做学习笔记,题目是这样的:

(一)这段代码片段的输出结果    

          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是时候是有输出的,输出结果如下:

         

            还没弄清楚为什么foo[f]会是NaN,明天查查资料再补上。


<----------------------------------------------------------------------------------------------------------------->

           

            今天百度了下明白了,JavaScript在进行相加操作的时候会把值的类型进行转换比如1+undefined,那么

undefined将被转换为数字类型,undefined在javascript中表示“未定义,将它强制转换成数值会返回

            NaN,所以1+undefined也会返回NaN

            在这个题中  console.log(i,+foo[i]); 我认为应该理解为  console.log(i,0+foo[i]);所以undefined被转换成NaN
            假如把题目改成这样console.log(i+foo[i]);因为 i是字符串类型则undefined不需要转换。实验证明确实是这样。

             



猜你喜欢

转载自blog.csdn.net/qq_37126322/article/details/80275234