zoukankan      html  css  js  c++  java
  • 几道前端比较绕的前端面试题

    第一题
    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下去寻找和赋值了。

    以上摘抄网上的内容,作为自己的笔记

  • 相关阅读:
    Red Hat Enterprise Linux Server 5.5新增功能简介
    DNS Flood Detector让DNS更安全
    iPad之Linux平台实践
    Fedora 10下应用网络模拟器NS心得
    深入了解Linux远程桌面
    Linux下基于LDAP统一用户认证的研究
    Linux架设Jsp环境
    Fedora 13 Alpha测试手记横空出世
    高層タワー [MISSION LEVEL: B]
    機械の総合病院 [MISSION LEVEL: C]
  • 原文地址:https://www.cnblogs.com/alinh/p/6549821.html
Copyright © 2011-2022 走看看