您的位置:首页 > Web前端 > JavaScript

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

2017-11-04 11:46 393 查看

前言:

接上篇文章:  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.csdn.net/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博大精深还需要我们努力探索。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript 面试 函数