欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

前端面试题

程序员文章站 2022-03-04 12:04:15
...

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为局部变量,外部访问不到。输出2Uncaught 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 });  
  1. 调用者是window,所以打印 window.a,即 1
  2. 非严格模式下,apply的第一个参数为 undefined或 null时,则指向全局对象 window,结果同上
  3. apply改变了函数内 this指向,指向了 {a: 3},所以打印 3

如果 say改为箭头函数:由于箭头函数不绑定 this, 它会捕获其所在(即定义的位置)上下文的 this值, 作为自己的 this值。所以三个输出都为 1

4. 箭头函数是否有arguments

没有。如果在函数作用域中,就获取上层的arguments。

5. promise的链式调用如何中断

在then函数里,返回一个reject状态的promise对象,就可以跳过下面的then调用,直接执行catch函数

6. Object.create()

7. hasOwnPropertyin

  • hasOwnProperty判断一个对象是否有此名称的属性,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。
  • in判断的是对象的所有属性,包括对象实例及其原型的属性;