zoukankan      html  css  js  c++  java
  • 所在实习公司的JS笔试题

    在班上无聊的时候看到了一份JS笔试题(我是电面进去的,没做过这份题~~),开始还觉得蛮简单。。。。。。后来觉得还是很有意思的,贴出来一起看看。

    题目一:

    if(!("a" in window)){
        var a = 1;
    }
     alert(a);

    题目二:

    var a=1,
         b= function a(x){
             x&&a(-xx);
         };
     
    alert(a);

    题目三:

     function a(x){ 
    ..     return x*2; 
    .. }
       var a;
       alert (a);
        

    题目四:

    function b(x,y,a){ 
    ..   arguments[2] = 10; 
    ..   alert(a); 
    .. }
       b(1,2,3);
        

    题目五:

    function a() {
        alert(this);
    }
    a.call(null);

    题目六:
    写深度克隆的代码。

    答案和分析:

    题目一,有人认为a没有存在window里面,所以输出a=1,还有人认为a在私有作用域,alert访问不到。是undefined。

    首先结果的确是undefined。先说第二种情况,所谓私有作用域一般都是写在function里面的,在这些判断语句里面有赋值操作,就要看这些判断语句所处的作用域,这里很明显全局的。所以a不是私有变量。

    下面可以尝试输入以下代码试试:

    alert(“a” in window);
    var a;

    首先所有的全局变量都可以作为window的属性,window.a,所以可以用上述方法查看a是否存在window中。上面的输出是true,因为Js中所有的变量声明都会在作用域的顶部(有点类似函数声明的预编译)。js引擎会首先搜索所有的变量声明然后提到作用域的顶部,但是变量的赋值却不会提前(如果是的话,可以想像会发生很多不可预知的错误),var a=1;是等价于var a; a=1;的。
    所以这道题,因为变量a会在作用域顶部存在window中,所以跳过赋值操作,输出结果是undefined。

    题目二:

    function a(){
        return 1;
    }
    var a;
    alert(typeof  a);    //"function"

    这个题有点意思,上面说过函数声明会提前,变量声明也会提前,现在var a;要提前,function a也要提前。。。。。。到底谁会覆盖谁呢?

    function a(){
        return 1;
    }
    var a;
    alert(typeof  a);    //"function"

    很明显上面上面中函数声明会覆盖变量声明,优先级较高一点。但是改成var a=1;之后结果却是截然相反的。

    
    
    function a(){
        return 1;
    }
    var a =1;
    alert(typeof a);    //“number”
    当变量申明遇到VO中已经有同名的时候,不会影响已经存在的属性。var a;只是一个变量声明,不会影响已经存在的function  a 的值。
    而当赋值的时候,就会相当于重写a。但要记住函数声明会比变量声明提前,所以一般会是被赋值重写。
    也许有人或说,a被重写,在用a(--)岂不是会出现错误。在这里a没有被执行,一般 函数没有被执行 内部没有明显语法错误 可以看成黑盒


    题目三:

    题目二中有涉及,所以答案是function。。。。。。。。。。。。

    题目四:

    深入理解JavaScript系列(12):变量对象(Variable Object)》中的函数上下文中的变量对象一节就可以清楚地知道,活动对象是在进入函数上下文时刻被创建的,它通过函数的arguments属性初始化。arguments属性的值是Arguments对象:

    AO = {   arguments: <ArgO> };

    Arguments对象是活动对象的一个属性,它包括如下属性:

    1. callee — 指向当前函数的引用
    2. length — 真正传递的参数个数
    3. properties-indexes (字符串类型的整数) 属性的值就是函数的参数值(按参数列表从左到右排列)。 properties-indexes内部元素的个数等于arguments.length. properties-indexes 的值和实际传递进来的参数之间是共享的。

    这个共享其实不是真正的共享一个内存地址,而是2个不同的内存地址,使用JavaScript引擎来保证2个值是随时一样的,当然这也有一个前提,那就是这个索引值要小于你传入的参数个数,也就是说如果你只传入2个参数,而还继续使用arguments[2]赋值的话,就会不一致,例如:

    function b(x, y, a) {     arguments[2] = 10;     alert(a); } b(1, 2);

    这时候因为没传递第三个参数a,所以赋值10以后,alert(a)的结果依然是undefined,而不是10,但如下代码弹出的结果依然是10,因为和a没有关系。

    function b(x, y, a) {     arguments[2] = 10;     alert(arguments[2]); } b(1, 2);

    题目五:

    根据ECMAScript262规范规定:如果第一个参数传入的对象调用者是null或者undefined的话,call方法将把全局对象(也就是window)作为this的值。所以,不管你什么时候传入null,其this都是全局对象window,所以该题目可以理解成如下代码:

    function a() {     alert(this); } a.call(window);

    所以答案是object window。

    题目六:

    深度克隆,百度会有代码的。

  • 相关阅读:
    Apicloud_(模板)登陆注册功能模板
    Apicloud_(接口验证)用户注册头部信息X-APICloud-AppKey生成
    Apicloud_(项目)网上书城02_后端数据获取
    Apicloud_(项目)网上书城01_前端搭建
    R_Studio(时序)Apriori算法寻找频繁项集的方法
    R_Studio(聚类)针对iris数据比较几种聚类方法优劣
    R_Studio(神经网络)BP神经网络算法预测销量的高低
    JavaWeb_(SSH论坛)_七、辅助模块
    JavaWeb_(SSH论坛)_六、点赞模块
    JavaWeb_(SSH论坛)_五、帖子模块
  • 原文地址:https://www.cnblogs.com/happycloud/p/3309557.html
Copyright © 2011-2022 走看看