几道前端比较绕的前端面试题
2017-03-14 17:56
253 查看
第一题
第二题
1,2题考察的是构造函数的返回值的问题。
每个函数都有返回值,如果使用了
特别的,如果这个函数是构造函数,则默认返回
所以1题中的
第三题(涉及到get了)
第四题
第五题 (只有set)
关于第五题的理解:
给某个对象设置一个属性的时候,是不涉及访问该属性的。
给a设置name属性时,只会检查这个属性是否存在(此时在这个对象上),如果这个属性存在,不会去访问它的值,直接用新值覆盖,如果不存在,则直接添加。整个过程不存在值的访问,也就没有查找原型链的过程。
第六题
3, 4, 5, 6题都是考察
以下内容我假设你知道一些面向对象的概念。
js里面,一个实例(以下都用p)的[[proto]]属性指向这个类(以下用fun)的原型,如果用等号表示指向的话就是
然后另一条规则就是,当访问一个对象a的属性时,会先检查a是否有这个属性,如果有,则返回这个属性的值,如果没有则检查a的[[proto]]是否有该属性,有则返回,无则继续检查a的[[proto]]的[[proto]]直到检查到或者[[proto]]为null为止。
注:[[proto]]是ECMAScript标准里的属性,浏览器实现的时候使用的是
所以第3题:
他们是属于引用相等,所以更改a.info.name的值时,b.info.name, fun.prototype.info的值也会跟着改变。 4,5,6 题不再累述。
不过第五个和第三个理解上有点问题。
//请问a.info.name和b.info.name分别是:
jack , 123
b.info.name = 'tom'; 赋值的时候并不能在b下 找到b.info 所以只能去fun.prototype中把tom赋值给fun.prototype中的name值了。
而如果b.info已经存在的情况,他就不需要去fun.prototype下去寻找和赋值了。
以上摘抄网上的内容,作为自己的笔记
1 var fun = function(){ 2 this.name = 'peter'; 3 return { 4 name: 'jack' 5 }; 6 } 7 var p = new fun(); 8 //请问p.name是:jack
第二题
1 var fun = function(){ 2 this.name = 'peter'; 3 4 return'jack'; 5 } 6 7 var p = new fun(); 8 //请问p.name是:peter
1,2题考察的是构造函数的返回值的问题。
每个函数都有返回值,如果使用了
return语句,则返回
return后跟的值,如果没有使用
return,则默认返回
undefined.
特别的,如果这个函数是构造函数,则默认返回
this对象,如果构造函数内使用了
return语句,并且
return后跟的是一个对象,则这个构造函数返回的是这个对象,否则返回
this.
所以1题中的
p = {name: 'jack'},而2题中的
p = {name: 'peter'}.
第三题(涉及到get了)
1 var fun = function(){} 2 3 fun.prototype = { 4 info : { 5 name : 'peter', 6 age : 25 7 } 8 } 9 10 var a = new fun(); 11 var b = new fun(); 12 13 a.info.name = 'jack'; 14 b.info.name = 'tom'; 15 16 //请问a.info.name和b.info.name分别是:tom tom
第四题
1 var fun = function(){ 2 this.info = { 3 name : 'peter', 4 age : 25 5 } 6 } 7 8 var a = new fun(); 9 var b = new fun(); 10 11 a.info.name = 'jack'; 12 b.info.name = 'tom'; 13 //请问a.info.name和b.info.name分别是:jack tom
第五题 (只有set)
1 var fun = function(){} 2 3 fun.prototype = { 4 name : 'peter', 5 age : 25 6 } 7 8 var a = new fun(); 9 var b = new fun(); 10 11 a.name = 'jack'; 12 b.name = 'tom'; 13 //请问a.name和b.name分别是:jack tom
关于第五题的理解:
给某个对象设置一个属性的时候,是不涉及访问该属性的。
给a设置name属性时,只会检查这个属性是否存在(此时在这个对象上),如果这个属性存在,不会去访问它的值,直接用新值覆盖,如果不存在,则直接添加。整个过程不存在值的访问,也就没有查找原型链的过程。
第六题
1 var fun = function(){ 2 this.info = { 3 name : 'peter', 4 age : 25 5 } 6 } 7 8 fun.prototype = { 9 info : { 10 name : 'peter', 11 age : 25 12 } 13 } 14 15 var a = new fun(); 16 var b = new fun(); 17 18 a.info.name = 'jack'; 19 b.info.name = 'tom'; 20 //请问a.info.name和b.info.name分别是:jack tom
3, 4, 5, 6题都是考察
prototype的知识。
以下内容我假设你知道一些面向对象的概念。
js里面,一个实例(以下都用p)的[[proto]]属性指向这个类(以下用fun)的原型,如果用等号表示指向的话就是
p.[[proto]] = fun.prototype
然后另一条规则就是,当访问一个对象a的属性时,会先检查a是否有这个属性,如果有,则返回这个属性的值,如果没有则检查a的[[proto]]是否有该属性,有则返回,无则继续检查a的[[proto]]的[[proto]]直到检查到或者[[proto]]为null为止。
注:[[proto]]是ECMAScript标准里的属性,浏览器实现的时候使用的是
__proto__
所以第3题:
a.info = a.__proto__.info = b.info = b.__proto__.info = fun.prototype.info = {name: 'peter', age: 25}
他们是属于引用相等,所以更改a.info.name的值时,b.info.name, fun.prototype.info的值也会跟着改变。 4,5,6 题不再累述。
不过第五个和第三个理解上有点问题。
1 var fun = function(){} 2 3 fun.prototype = { 4 info : { 5 name : 'peter', 6 age : 25 7 } 8 } 9 10 var a = new fun(); 11 var b = new fun(); 12 13 a.info.name = 'jack'; 14 b.info.name = 'tom';//这句如果改成 b.info = {};b.info.name='123';这样就和第五个一样的效果了。
//请问a.info.name和b.info.name分别是:
jack , 123
b.info.name = 'tom'; 赋值的时候并不能在b下 找到b.info 所以只能去fun.prototype中把tom赋值给fun.prototype中的name值了。
而如果b.info已经存在的情况,他就不需要去fun.prototype下去寻找和赋值了。
以上摘抄网上的内容,作为自己的笔记
相关文章推荐
- 几道前端面试题
- JavaScript比较新的前端面试题
- 【web前端面试题整理05】做几道前端面试题休息休息吧
- 几道常考的前端面试题(蘑菇街)系列一
- 几道比较基础的Java面试题 .
- 几道前端的面试题
- github上比较有名的一个前端面试题,随便做做(2)
- 几道比较基础的Java面试题
- github上比较有名的一个前端面试题,随便做做(5)
- github上比较有名的一个前端面试题,随便做做(3)
- github上比较有名的一个前端面试题,随便做做(4)
- github上比较有名的一个前端面试题,随便做做(6)
- 前端程序员经常忽视的一个JavaScript面试题
- 前端开发面试题集锦(二)
- BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
- BAT及各大互联网公司2014前端笔试面试题--Html,Css篇
- 稍微比较全的面试题,还在总结中!
- web前端面试题
- 比较难的sql面试题--记录下来晚上做
- js前端面试题及答案整理(一)