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中间件有哪些?
3.express3.x与4.x的区别?
4.项目有个双重回调为什么不用一层XXXXX?(没听太清楚面试官的意思)