TOPIC-JS

2022-03-11  本文已影响0人  如果俞天阳会飞

为什么JS是单线程?

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

setTimeout时间延迟为何不准?

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

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

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

如何判断变量的类型?

  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

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

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);
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])
var arr = [6, 4, 1, 8, 2, 11, 23];
console.log(Math.max.apply(null, arr))
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
}

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

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))

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

浅拷贝
深拷贝
上一篇 下一篇

猜你喜欢

热点阅读