zoukankan      html  css  js  c++  java
  • 18.2.26深信服Web实习生补坑(已拿到offer)

    26号晚上8点左右收到电话,面试大概一小时左右,问的很广,发挥的一般,问到的大部分都答出来了,有些没有讲好。然后面试官说等通知,问了评价,面试官说我现在大三懂这么多已经很不错了,表达能力需要加强,有点紧张口吃。30分钟后收到实习生offer邮件。这里只记录下几个答的不好的点。

    1.var和不var的区别?

    先问了作用域相关,然后问如果不用var声明一个变量是属于什么变量,这个是全局变量,肯定一下子答上来,然后又问那么不var的和用var声明的变量有什么区别?

    js里面的属性是有权限设置的,比如我们直接创建一个对象:

    // 我心爱的对象 ob
    var ob = {a:1};
    
    // 访问属性
    ob.a; // => 1
    
    // 修改属性值
    ob.a = 0;
    ob.a; // => 0
    
    // 创建新属性
    ob.b = 2;
    ob.b; // => 2
    
    // 删除属性
    delete ob.b;
    ob.b; // => undefined
    

    但是上面代码中的对象的所有属性都是可迭代、可修改和可配置的吗?

    • 可迭代,意味着我能够通过 for..in 循环来访问该对象的所有属性. 还能通过 Object.keys() 方法获取该对象的所有属性名.
    • 可修改,意味着我能修改该对象的所有属性的值,通过为这些属性赋予一个新值就能修改: ob.a = 1000;.
    • 可配置,意味着我能修改属性的行为,让该对象的属性都是不可迭代的、不可修改的和不可配置的. 只有可配置的属性才能通过 delete 被删除.

    我们用var和不用var的一个区别就在可配置属性上,声明一个全局变量,其实都是给window增加一个属性(浏览器环境下),由于window对象是全局对象,因此默认可以不加"window.",全局作用域下,window也可以用this来代替。

    var test = function(){
     a = 'aa';
    }
    test();
    alert(this.a);//弹出'aa' 
    alert(window.a);//弹出'aa'
    
    var a = 'aa';
    alert(a); //弹出 'aa'
    alert(window.a)//弹出'aa' 
    
    a = 'aa';
    alert(a); //弹出 'aa'
    alert(window.a)//弹出'aa' 
    

    然后关键来了:

    var a = 'aa';
    delete window.a; // false 
    a = 'aa';
    delete window.a; // true 
    

    都是为'window'对象增加了属性,一个可以删除,一个不能删除。
    "delete 不可以删除那些可配置性为false的属性" ,某些内置对象的属性是不可配置的,比如通过变量声明或者函数声明创建的全局对象的属性
    不用var创建的变量就可以进行删除。

    这个可配置属性在Object.defineProperty()中的第三个参数部分就可以配置,以前在vue框架原理里面也看到过。这个可配置属性名为"configurable",具体看defineProperty()的文档:链接

    然后在一些场景里其实也相关了变量函数声明提前,当时跟面试官说了这个,但是面试官否决了,但是确实有些场景确实涉及到了啊:

    var var01 = 1;
    function funtest() {
     document.write(var01);
     var var01 = 0;
    } 
    

    结果为:undefined,函数里面声明的产生了函数作用域,变量声明提前了,所以为undefined。

    var var01 = 1;
    function funtest() {
     document.write(var01);
     var01 = 0;
    } 
    

    结果为:1,不用var就没有提前声明吧,所以我当时其实也答出了一个点,只是没把场景说好,面试官心中可能要的是第一个答案?

     var01 = 1;
    function funtest() {
     document.write(var01);
     var var01 = 0;
    }
    

    结果为:undefined

    var01 = 1;
    function funtest() {
     document.write(var01);
     var01 = 0;
    }
    

    结果为:1

    2.node中间件有哪些?

    正确来说是问你用过什么中间件,这个问题先要弄懂中间件和模块,插件概念的区别,不要随便瞎说用过哪个插件。
    来自cnode的一位大佬的回答:

    在软件领域,中间件是在应用与应用之间充当连接服务的,这并非是nodejs的概念,其他领域也会有这个概念。举个例子,比如消息队列、数据库驱动等。
    插件一般来说extra的,就是你整个系统或应用不需要插件也能正常工作,插件一般是提供一些额外功能。而且插件这个词本身代表的就是可拓展的(形象的说,可插拔)。
    我个人认为 plugin/addon = extra feature 模块一般是系统的负责某一功能的一部分,不可或缺。即 module =
    a part of system/application
    在 nodejs 里一般你在 package.json 里指定的那些package 都是 module,当然你从文件名 node_modules 也能看出来。

    还有另外一位大佬举了一个生动的例子:

    把大象放入冰箱的过程是这样的:

    function play_with_elephant () {
    open(); // 打开门
    in_elephant(); // 放入大象
    close(); // 关上门
    return result; } 那么如果这样写:

    function play_with_elephant (action_elephant) {
    open(); // 打开门
    action_elephant(); // 捣鼓大象
    close(); // 关上门
    return result; }
    action_elephant 就可以看作是play_with_elephant的一个中间件,ta运行在一套算法的中间,属于可变动的内容。

    其实express不就是基于Connect中间件开发的吗,而且用过express的肯定用过express.static吧, express.static是 Express 内置的唯一一个中间件。是基于 serve-static 开发的,负责托管 Express 应用内的静态资源。当时竟然连这个都忘了答出来。

    3.express3.x与4.x的区别?

    4.x 变得更加纯粹,以前只是内置了一些中间件…现在独立出来…,默认就不支持 files了,核心的东西其实都没变…4.X 源代码更清晰,文档更全面了,把connect模块替换成更简单的自己实现router http请求流程控制,原理还是一样,用数组储存中间件,其实就是(path,fn)对,然后http按次序进入各个中间件,执行完后返回。

    详细变化的优缺点可以看这个:链接

    4.项目有个双重回调为什么不用一层XXXXX?(没听太清楚面试官的意思)

    这个在电话中没听太清楚面试官的问意,面试官给的说法也没听懂,有机会去当面问下现在的师傅。

    5.怎么看一个属性是对象自有的还是从原型链继承下来的?

    其实就是问in和hasOwnProperty()操作:

    1.in 运算符

    var obj = {name:'jack'};
    alert('name' in obj); // --> true
    alert('toString' in obj); // --> true
    

    可看到无论是name,还是原形链上的toString,都能检测到返回true。

    2,hasOwnProperty 方法

    var obj = {name:'jack'};
    obj.hasOwnProperty('name'); // --> true
    obj.hasOwnProperty('toString'); // --> false
    

    原型链上继承过来的属性无法通过hasOwnProperty检测到,返回false。

    需注意的是,虽然in能检测到原型链的属性,但for in通常却不行。

  • 相关阅读:
    flex
    当前不会命中断点 源代码与原始版本不一致
    c setjmp longjmp
    VS 快捷键设置
    Lua C API 遍历 table
    lua class
    复习 C++ 中类的函数指针
    apache ab
    rabbitmq
    协程 coroutine
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/8496036.html
Copyright © 2011-2022 走看看