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

    为什么JS是单线程? 假定js同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时候...

网友评论

      本文标题:TOPIC-JS

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