JavaScript面试中遇到的几个问题详解(二)

本文通过三个构造函数P1、P2、P3的实例,深入剖析JavaScript中对象取值过程、this定义变量的特点及||操作符的用法,并结合原型对象,详细解读(new构造函数)调用后的name属性取值逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

接上篇文章:  JavaScript面试中遇到的几个问题详解(一)

题目二:

    function P1(name){
        if(name)
            this.name = name;
    }

    function P2(name){
        this.name = name; 
    }

    function P3(name){
        this.name = name || "Tom";
    }
    P1.prototype.name = 'Peter';
    P2.prototype.name = 'Peter';
    P3.prototype.name = 'Peter';    
求:
    (new P1()).name = ? 
    (new P2()).name = ? 
    (new P3()).name = ? 
考点分析:
1.考查了面试者对原型对象的理解
2.考查对象取值的过程
3.考查this定义的变量的特点
4.考查 || 操作符的特点
答题所需知识点:
1.首先我们要了解js中如果没有给定义函数的形参传入的时候,js是不会报错的,只是形参的值为undefined
2.了解js中每个对象都有一个原型对象
3.了解对象的取变量值过程:首先会在对象定义中取变量值,若找到直接返回,若没有找到则在在从原型对象中寻找,

若找到返回原型对象中的值,如没有找到返回undefined;若对象中和对象的原型中都有该属性,则返回对象中的属性值,不论对象中的值是什么。

4.this定义的变量不会被解释器提前,这一点和var定义变量不同。var定义变量会在执行之前解释器会将变量的声明提取到作用域的最前端。

5. || 操作符的使用请参考我的另一篇文章: http://blog.youkuaiyun.com/xinghuo0007/article/details/70832783
6. 在JS中 除了 null,undefined,"",0,NaN,false 以外的所有,都是true
结果分析: (如果看不懂,可以回头看 答题所需知识点)
1.首先看 (new P1()).name ;  
    new P1() 创建一个匿名对象,没有传入参数。有P1的构造函数定义可以,此时的形参name为undefined,所以 if 条件判断为false;this.name = name不会被执行,
    因此在匿名对象中就没有name属性;但是(new P1()).name,这时由我们知识点3 可知 (new P1()).name 返回的是原型对象中的name属性值: Peter 

2.现在看 (new P2()).name ; 
    P2构造函数没有if语句,因此直接将undefined 赋值给该匿名对象的name属性, 由知识点3可以,(new P2()).name 返回的是对象中的name属性的值:undefined

3.最后看:(new P3()).name ;
    P3的构造函数中的 name形参也是  undefined ,由知识点5可知 ,此时this.name = 
    "Tom", 所以有知识点3可知:,(new P3()).name 返回的是对象中的name属性的值:Tom
验证代码:
    function P1(name){
        if(name)
            this.name = name;
    }

    function P2(name){
        this.name = name; 
    }

    function P3(name){
        this.name = name || "Tom";
    }
    P1.prototype.name = 'Peter';
    P2.prototype.name = 'Peter';
    P3.prototype.name = 'Peter';    

    console.log("P1的name值为:"+ (new P1()).name) 
    console.log("P2的name值为:"+ (new P2()).name) 
    console.log("P3的name值为:"+ (new P3()).name) 

结果为:
这里写图片描述

总结:

由验证结果可知我们的结果分析是正确的。解决这个问题并不算什么,这只是js中的冰山一角,js博大精深还需要我们努力探索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值