1.
var a = 1;
if (!(b in window)) {
var b = 2; // 改成 let b = 2,结果如何
a += 1;
} else {
a += 2;
}
console.log(a);
console.log(b);
因为变量提升,所以
b in window
为 true,所以if判断结果为 false,a+2、b声明未赋值,输出3 undefined
如果改为
let b =2
,let会产生暂时性死区,所以if判断为true。但let声明会产生块级作用域,所以b为局部变量,外部访问不到。输出2
、Uncaught ReferenceError: b is not defined
2.
function Fn() {
sayName = function() {
console.log("asdfasdf");
};
this.name = "li";
}
Fn.sayName = function() {
console.log(2);
};
Fn.prototype.sayName = function() {
console.log(3);
};
var sayName = function() {
console.log(4);
};
function sayName() {
console.log(5);
}
new Fn.sayName();
new Fn().sayName();
new new Fn().sayName();
sayName();
3.
var a = 1;
var obj = {
a: 2,
say: function() { // say 改为箭头函数,结果如何
console.log(this.a);
}
};
var say = obj.say;
say();
say.apply();
say.apply({ a: 3 });
- 调用者是window,所以打印 window.a,即 1
- 非严格模式下,apply的第一个参数为 undefined或 null时,则指向全局对象 window,结果同上
- apply改变了函数内 this指向,指向了 {a: 3},所以打印 3
如果 say改为箭头函数:由于箭头函数不绑定 this, 它会捕获其所在(即定义的位置)上下文的 this值, 作为自己的 this值。所以三个输出都为 1
4. 箭头函数是否有arguments
没有。如果在函数作用域中,就获取上层的arguments。
5. promise的链式调用如何中断
在then函数里,返回一个reject状态的promise对象,就可以跳过下面的then调用,直接执行catch函数
6. Object.create()
7. hasOwnProperty
和in
hasOwnProperty
判断一个对象是否有此名称的属性,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。in
判断的是对象的所有属性,包括对象实例及其原型的属性;
网友评论