首页 > 试题广场 >

下面代码的输出是: function func(sourc

[单选题]
下面代码的输出是:
function func(source) { 
    var target = {}; 
    for (var key in source) { 
        if (Object.prototype.hasOwnProperty.call(source, key)) {
             if (typeof source[key] === 'object') { 
                target[key] = func(source[key]); 
             } else { 
                target[key] = source[key]; 
             }
        } 
    } 
    return target; 
}
var a = { a1: "a1", a2: { b1: "b1", b2: "b2" }, a3: undefined, a4: null, a5: 1 };
var b = func(a); 
console.log(b);

  • {a1: "a1", a2: {b1: "b1", b2: "b2"}, a3: undefined, a4: {}, a5: 1}
  • {a1: "a1", a2: {b1: "b1", b2: "b2"}, a3: null, a4: null, a5: 1}
  • {a1: "a1", a2: {b1: "b1", b2: "b2"}, a3: undefined, a4: undefined, a5: 1}
  • {a1: "a1", a2: {b1: "b1", b2: "b2"}, a3: undefined, a4: null, a5: 1}
解决这种分析题目的关键在于清楚整个代码的执行过程,执行过程如下:
  1. 定义了一个func,将函数的定义分配给他;
  2. 定义了一个变量a,将对象赋值给a;
  3. 定义了一个变量b,当我们看到一个变量后面加一个()的时候,那么便是调用这个函数,不管函数最终返回什么结果,都是将最终的结果赋值给b;
  4. 将func()函数推送到执行栈中,函数的执行环境由全局上下文交给函数上下文;
  5. func()函数中,首先将对象a传入;
  6. 定义一个target对象;
  7. 遍历对象a,使用Object的原型上的prototype属性来判断a中是否拥有该属性;
  8. 如果该属性是一个对象,继续递归循环以上步骤;
  9. 否则将该属性赋值给target对象;
  10. 将target对象返回,赋值给b;
  11. 最后将b输出。

注意点

  • hasOwnProperty:表示对象中是否拥有该属性,返回的是一个布尔值;此处使用Object.prototype.hasOwnProperty.call(source, key)表示的是使用的原型链中真正的hasOwnProperty方法来判断source对象中是否拥有key这个属性,也可以写成({}).hasOwnProperty.call(source, key);  JavaScript 并没有保护 hasOwnProperty 这个属性名,因此,当某个对象可能自有一个占用该属性名的属性时,就需要使用Object.prototype.hasOwnProperty.call(source, key)或者({}).hasOwnProperty.call(source, key)获得正确的结果
  • 因为typeof无法判断object的具体类型,当判断array、object、null时结果都为object对象,所以a4为 {}
发表于 2020-04-11 09:56:03 回复(0)
            function func(source) { 
                var target = {}; 
                for (var key in source) { 
                    // key==a1,
                    if (Object.prototype.hasOwnProperty.call(source, key)) {
                        // 判断是否有a1该属性
                        // console.log(source[key]) 键的值
                        // console.log(typeof null);//object
                         if (typeof source[key] === 'object') { 
                             // 若有则键的值是对象,则返回函数之后的数据
                             // 但是由于js的一个bug,typeof null==object,所以还会调用func(null)返回的是初始的target,{}
                            target[key] = func(source[key]); 
                         } else { 
                            target[key] = source[key]; 
                         }
                    } 
                } 
                return target; 
            }
            var a = { a1: "a1", a2: { b1: "b1", b2: "b2" }, a3: undefined, a4: null, a5: 1 };
            var b = func(a); 
            console.log(b);
发表于 2019-12-29 22:50:59 回复(0)
深拷贝,其中typeof 判断null时结果为object对象,所以
a4: {}
发表于 2020-04-07 16:37:46 回复(0)
这勉强算是一个深拷贝吧😂
发表于 2020-03-02 20:51:36 回复(0)