【2021-11-22】每日一题

223 阅读1分钟

每日一题(让我变优秀吧!)

1. let是否存在变量提升

let有变量提升,但是由于有暂时性死区所以看起来没有 变量提升。

var x = 'parent value';
(function(){
    console.log(x); // parent value
}())

var x = 'parent value';
(function(){
    console.log(x);// Cannot access 'x' before initialization
    let x = 'chlid value';
}())

2. JS原型链的理解,并且是否有创建实例时隐式原型__prpto__赋值的特殊情况

  • 原型
    • 所有引用类型(数组、对象、函数)都具有对象特性,可以自由扩展属性
    • 所有引用类型(数组、对象、函数)都有一个隐式原型属性__proto__属性,值为普通对象
    • 所有函数都有一个显示原型属性 prototype 属性,值为一个普通对象
    • 所有引用类型(数字、对象、函数),实例对象的隐式原型__prototype__属性指向它的构造函数的显示原型__prototype__属性值,即:obj.proto = Function.prototype
  • 原型链
    • 现在自身属性上查找,返回。
    • 未找到沿着__proto__这条链向上查找,找回返回
    • 最后还是没有找到,返回undefined 尽头是:Object.prototype.proto === null image.png

3. 这两段代码的执行顺序

代码一

new Promise((resolve, reject) => {
    console.log("外部promise1");
    resolve();
}).then(() => {
    console.log("外部第一个then");
    return new Promise((resolve, reject) => {
        console.log("内部promise");
        resolve();
    }).then(() => {
        console.log("内部第一个then");
    }).then(() => {
        console.log("内部第二个then");
    });
}).then(() => {
    console.log("外部第二个then");
});

外部promise1
外部第一个then
内部promise
内部第一个then
内部第二个then
外部第二个then

代码二

new Promise((resolve, reject) => {
    console.log("外部promise2");
    resolve();
}).then(() => {
    console.log("外部第一个then");
    new Promise((resolve, reject) => {
        console.log("内部promise");
        resolve();
    }).then(() => {
        console.log("内部第一个then");
    }).then(() => {
        console.log("内部第二个then");
    });
}).then(() => {
    console.log("外部第二个then");
});

外部promise2
外部第一个then
内部promise
内部第一个then
外部第二个then
内部第二个then