18.2.26深信服Web实习生补坑

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

1.var和不var的区别?

我突然醒悟面试官想问的并不是我下面所挖掘的,应该就是单纯的函数作用域?在一个函数中用var,在外面是访问不到的,所以我们需要闭包(顺势再扯点闭包),如果不用var,就是全局作用域了,在外部也可以访问到了,此时的上下文就是window。
—–3.25更新
先问了作用域相关,然后问如果不用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通常却不行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值