TOPIC-JS

作者: 如果俞天阳会飞 | 来源:发表于2022-03-11 15:38 被阅读0次

    为什么JS是单线程?

    假定js同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时候浏览器应该以哪个线程为准?
    所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征

    setTimeout时间延迟为何不准?

    JS是单线程,先执行同步主线程,再执行异步任务队列

    例举3种强制类型转换和2种隐式类型转换?

    强制(parseInt,parseFloat,number)
    隐式(+,-,*,/,%)
    当加号运算符时,string和其它类型时,其它类型会转换成string,其它情况,都会转换成Number类型,
    注:undefined 转化为Number是 为’NaN‘, 任何Number与NaN相加都为NaN

    如何判断变量的类型?

    • instanceof 用于检测构造函数的原型是否出现在某个实例对象的原型链上
    • typeof 对于原始类型 (除null)是可以检测到的,但是引用类型就统一返回object
    • Object.prototype.toString 会返回一个形如 "[object XXX]" 的字符串
      console.log(typeof 'null') // string
      console.log(typeof 123) // number
      console.log(typeof false) // boolean
      console.log(typeof null) // object
      console.log(typeof undefined) // undefined
      console.log(typeof {}) // object
    

    求数组的最大值和最小值?

    • Math.max()
      值得注意的是:
      1.如果有任一参数不能被转换为数值,则结果为 NaN。
      2.如果没有参数,则结果为 -Infinity (注意是负无穷大)
    • 最原始的方法,莫过于循环遍历一遍
    var arr = [6, 4, 1, 8, 2, 11, 23];
    
    var result = arr[0];
    for (var i = 1; i < arr.length; i++) {
        result =  Math.max(result, arr[i]);
    }
    console.log(result);
    
    • reduce
      既然是通过遍历数组求出一个最终值,那么我们就可以使用 reduce 方法:
    var arr = [6, 4, 1, 8, 2, 11, 23];
    
    function max(prev, next) {
        return Math.max(prev, next);
    }
    console.log(arr.reduce(max));
    
    • 排序
      如果我们先对数组进行一次排序,那么最大值就是最后一个值:
    var arr = [6, 4, 1, 8, 2, 11, 23];
    
    arr.sort(function(a,b){return a - b;});
    console.log(arr[arr.length - 1])
    
    • apply 使用 apply 是另一种。
    var arr = [6, 4, 1, 8, 2, 11, 23];
    console.log(Math.max.apply(null, arr))
    
    • ES6 ... 使用 ES6 的扩展运算符:
    var arr = [6, 4, 1, 8, 2, 11, 23];
    console.log(Math.max(...arr))
    

    ”==”和“===”的不同?

    前者会自动转换类型,再判断是否相等 后者不会自动类型转换,直接去比较

    new操作符都做了些什么?

    创建一个空对象
    将空对象的proto属性指向构造函数的原型
    将this指向这个对象
    返回这个对象

    function myNew(fn, ...args) {
        const obj = {}
    
        obj.__proto__ = fn.prototype
    
        fn.apply(obj, args)
    
        return obj
    }
    

    平时工作中数组去重的方法?

    • object key 得唯一性
    • indexOf
    • new Set() 成员值的唯一性
    • 循环

    promise对象 有什么优缺点吗?

    优点

    1.可以将异步操作 以同步操作的流程表达出来 避免层层嵌套
    2.提供了统一的接口,使得控制异步操作更加容易

    缺点

    一旦建立就会立即执行,无法中途取消,不设置回调函数 内部抛出错误不会反应到外部当处于pending(进行中)状态时,无法得知目前的进展到哪一个阶段

    instanceof 能否判断基本数据类型?

    能 比如下面这种方式:

    class Demo {
      static [Symbol.hasInstance](x) {
        return typeof x === 'number'
      }
    }
    console.log(111, instanceof Demo)
    

    其实就是自定义instanceof行为的一种方式,,这里将原有的instanceof方法重定义,换成了typeof,因此能够判断基本数据类型。

    自己手写一个instanof

      function myInstanceof(target, obj) {
        if (typeof target !== 'object' || target === null) return false;
        let proto = Object.getPrototypeOf(target);
        while (true) {
          if (target == null) return false;
          if (proto === obj.prototype) return true;
          proto = Object.getPrototypeOf(proto)
        }
      }
    
      console.log(myInstanceof(dog1, Dog))
    

    深拷贝和浅拷贝的区别?如何实现?

    浅拷贝
    • for... in 循环第一层
    • Object.assign方法
    • 直接用=赋值
    • 扩展运算符
    深拷贝
    • 采用递归去拷贝所有层级属性
    • JSON.parse
      JSON.stringify与JSON.parse可以实现深拷贝,
      就是利用JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象
      1.当json里面有RegExp、Error对象时,序列化的结果将只得到一个空对象;
      2.当json里有function,undefined时,序列化的结果中function,undefined 会丢失
      3.当json里有NaN、Infinity和-Infinity时,序列化结果后得到的为一个null值;
      4.当json里有对象是由构造函数生成的时候,序列化的结果会丢弃该对象的 constructor
      5.当对象中有在内存中的循环引用时,该方法将会报错。

    相关文章

      网友评论

          本文标题:TOPIC-JS

          本文链接:https://www.haomeiwen.com/subject/akycdrtx.html