js高级面试题

  1. 01.+0.2!=0.3  二进制浮点数转十进制        实际=0.3000 000 000 0004
    1. 解决办法:parseFloat((0.1+0.2).toFixed(10));
  1. 10个AJAX同时给hi发送请求至多允许三次失败:
    1. Promise.all(),但是失败一次就返回了,不行。
    2. Ajax(url,(res)=>{if(success){successIndex++}else{errprCount++;if(errorCount>3{}}});
    3. Let p =new Promise((resolve,reject)=>{if(success){resolve(res.data)}else{errorCount++;if(errorCount>3{})}});
  2. localstorge设计一个1M的缓存系统,需要实现缓存淘汰机制:
    1. 每个存储对象添加1个属性:存储时间;
    2. 判断所有存储属性大小>1M按照时间排序,删除多余的老的时间存储对象;
  3. 详细说明 Event  loop事件循环

js是门非阻塞单线程语言;如果是多线程处理DOM就会发生冲突;

  1. JS在执行的而过程中会产生执行环境,这些执行环境会被顺序的加入到执行栈中。如果遇到异步的代码,会被挂起并加入到task队列(多种task)中。一旦执行栈为空,Even loop会在task队列中拿出需要执行的代码并放入执行栈中执行,所以本质上来说js中的异步还是同步行为。
  2. Console.log('start'); 
              settimeout(function(){console.log('settimeout')},0);
              console.log('end');
              //start    end      settimeout
              settimeout函数虽然为0,但是h5规定第二个参数不得小于4毫秒,不足会自动增加;所以.
  1. 不同的任务源会被分配到不同的Task队列中,任务远可以分为:微任务microtask=jobs,宏任务macrotask;
              Console.log('start'); 
              settimeout(function(){console.log('settimeout')},0);
              new promise((resolve)=>{console.log('promise1') resolve()})
                    .then(function(){console.log('promise2')})
                         .then(function(){console.log('promise3')})
              console.log('end');
              //start   promise1 end  promise2       promise3  settimeout因为promise属于微任务,settimeout属于宏任务;
    1. 微任务:promise  process.nextTick   object.observe
    2. 宏任务:settomeout   setinterval  script I/o 
    3. 微任务一定快于宏任务?错!
                  因为宏任务中包含 script浏览器会先执行一个宏任务,接下来有异步代码的话就先执行微任务:
      1.   
      2. 执行同步代码,属于宏任务;
      3.   
      4. 执行栈为空,查询是否有微任务需要执行
      5.   
      6. 执行所有微任务;
      7.   
      8. 必要的渲染UI;
      9.   
      10. 开始新一轮  Event loop;

如果宏任务中异步代码有大量的计算并且需要操作DOM,可以把操作DOM放入微任务中。

 

  1. js原始数据类型:
    1. 原始(基本)类型:Number  null         boolean   undefined  string +symbol(es6)  +BigInt(es10);
    2. 复杂数据类型:object
    3. null是对象码?不是,虽然typeof null=='object’,但是不是对象,历史遗留问题:
                  最初版本使用的是32系统,为了性能考虑地低位存储变量的类型信息,000开头表示对象,null表示全为0,所以将他错误的判断为对像。
    4. 基本与复杂区别:
      1.   
      2. 内存分配不同;
      3.   
             
        1. 基本:栈
        2.    
        3. 复杂:堆,栈存储的是其 引用地址;
        4.   
          
      4. 访问机制不同;
      5.   
             
        1. 基本:安值访问;
        2.    
        3. 复杂:引用访问;
        4.   
          
      6. 复制变量不同;
      7.   
             
        1. 基本:a=b完全独立,互不影响;
        2.    
        3. 复杂:a=b;a.age=20;b.age//20;一个值改变,另一个也会改变;
        4.   
          
      8. 函数参数传递不同
      9.   
             
        1. 基本:拷贝栈中的值,修改互不影响;
        2.    
        3. 复杂:拷贝是引用地址,修改互相影响
        4.   
  2. HTML5语义化理解:
    1. 简单  清晰  易读,便于维护;
    2. 方便设备解析;
    3. 利于搜索引擎优化;

你可能感兴趣的