浅谈JS 底层原理面试题

199 阅读1分钟

第一题

    var a =0;
     b=0;
         function A(a){
           A = function(b){
           alert(a + b++);
           }
           alert(a++);
        }
        A(1);
        A(2);

哈哈哈 你是不是输出的答案 是不是 1 和 4 呢,如果是的话恭喜你 答错了, 需要注意的是: alert() 输出的是 字符串类型 准确的答案是: 1 和 4

第二题

用原生js 实现一个深克隆的方法如下:

function deepClone(obj) {
        // 过滤特殊情况:
        if (obj === null) return
        if (typeof obj !== 'object') return obj
        if (obj instanceof RegExp) {
          return new RegExp(obj)
        }
        if (obj instanceof Date) {
          return new Date(obj)
        }
        // 不直接创建空对象的目的:克隆的结果和之前保持的所属类相同
        let newObj = new obj.constructor()
        for (let key in obj) {
          if (obj.hasOwnProperty(key)) {
            newObj[key] = deepClone(obj[key])
          }
        }

        return newObj
      }
      var obj1 = {
        a: '吃饭',
        b: '睡觉',
        c: '打豆豆~'
      }
      let obj3 = deepClone(obj1)
      console.log(obj1 === obj3)  false
      console.log(obj1.b === obj3.b) 不知道为什么是 true

第三题:

  function Foo() {
    getName = function() {
      console.log(1);
    };
    return this;
    // 这里的this是window
    // 执行的时候相当于是 window.getName() 这个执行了
    //相当与把 getName=1 修改成全局的
  }

  Foo.getName = function() {
    console.log(2);
  };
  var p1 = (Foo.prototype.getName = function() {
    console.log(3);
  });
  console.log(p1, "打印你了吗?");

  var getName = function() {
    console.log(4);
  };
  function getName() {
    console.log(5);
  }
  Foo.getName(); //2
  getName(); //4
  Foo().getName(); //1
  getName(); //1
  new Foo.getName();
  // 先执行Foo.getName() 得到2,
  //在new它相当于普通函数执行
  // js的运算符的优先级
  new Foo().getName();
  //new Foo() 创建实例
  // 再让创建的实例 执行
  new new Foo().getName();
  //1. new Foo() 创建实例
  //2. xxx.getName() 原型上的方法 ->3
  //3. new func -> 3 

第四题:

 ```
  async function async1() {
    console.log("async1 start");
    await async2(); // 它执行完之后,才执行下面的函数 ,这个是异步的微任务
    console.log("async1 end");
  }
  async function async2() {
    console.log("async2");
  }
  console.log("script start");
  setTimeout(function() {
    console.log("setTimeout");
  }, 0);
  async1();
  new Promise(function(resolve) {
    console.log("promise1");
    resolve();
  }).then(function() {
    console.log("promise2");
  });
  console.log("script end");
  // 解析: js 先执行 同步-> 异步(宏任务和微任务); 先执行宏任务,在执行微任务
  // 同步: 1. script start 2. async1 start  3.async2 4.script end
  // 5.promise1 6.script end 7.async1 end 8.promise2
 ```