跟着NONO复习day1 - 基本数据类型以及判断方法&防抖节流&微宏任务题&手写reduce

98 阅读2分钟

基本数据类型以及判断方法

基本数据类型:string、number、boolean、null、undefined、Symbol(Symbol是一种新的原始数据类型,表示独一无二的值) 引用数据类型:Object、arr、函数等

基本数据类型的数据存在 栈 引用数据类型的引用地址存在 栈 中,值存储在堆中

堆和栈的区别: 堆类似于堆排序,先进先出;栈是先进后出; 堆一般由垃圾回收机制去执行释放;栈被调用时在存储空间中,不使用时就被立即释放。

基本数据类型还有一种是bigInt,这个上用来解决 现在的number类型有一个最大值和最小值的范围,如果超出这个范围就会失真的问题。 失真问题还有0.1+0.2,这是因为在计算机最底层,数值的运算和操作都是采用二进制实现的,所以计算机没有办法精确表示浮点数,而只能用二进制近似相等的去表示浮点数的小数部分。当进行计算或其他操作时时,四舍五入(逢1进,逢0舍)将会导致最终的运算结果存在偏差。

数据类型的判断方式有

  1. typeof 这个语法的缺点是 null 会判断为 object,其他引用类型也统一去返回 object
  2. intanceof 问题是不能检测基本数据类型,因为没有原型链,原型链可能被修改,导致检测结果不准确
  3. Object.prototype.toString().call 检测结果为[object String | Null | Boolean | Object| Function .... ] 较为准确,言简意赅的说:所有数据类型都是对象的一种类型,而Object.prototype.toString可以返回当前调用者的对象类型(去原型链上去找)。
  4. 判断是否为数组 Array.isArray()

防抖节流

// 防抖  高频率点击只提交一次
const fangdou = (fn, dalay) => {
  let timeOut = null;
  return function(){
    clearTimeout(timeOut)
    timeOut = setTimeout(() => {
      fn();
    }, dalay);
  }
};

// 节流  多次点击只在固定的时间去触发
const jieliu = (fn, dalay) => {
  let flag = false;
  return function() {
    if(flag) return false;
    flag = true;
    setTimeout(() => {
      fn();
      flag = false;
    }, dalay);
  }
};

const xx = fangdou(() => console.log('xxx'), 1000);

微宏任务题

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(1)
}).then(function (res) {
  console.log('promise2', res)
}).then(function (res) {
  console.log('promise3', res)
})
console.log('script end')


// script start
// async1 start
// async2
// promise1
// script end
// async1 end
// promise2 1 
// promise3 undefined
// setTimeout

手写reduce

const reduce = (arr, func, int) => {
  let res = int;
  for(let i = 0; i < arr.length; i++){
    res = func(res, arr[i])
  };
  return res;
};