基本数据类型以及判断方法
基本数据类型:string、number、boolean、null、undefined、Symbol(Symbol是一种新的原始数据类型,表示独一无二的值) 引用数据类型:Object、arr、函数等
基本数据类型的数据存在 栈 引用数据类型的引用地址存在 栈 中,值存储在堆中
堆和栈的区别: 堆类似于堆排序,先进先出;栈是先进后出; 堆一般由垃圾回收机制去执行释放;栈被调用时在存储空间中,不使用时就被立即释放。
基本数据类型还有一种是bigInt,这个上用来解决 现在的number类型有一个最大值和最小值的范围,如果超出这个范围就会失真的问题。 失真问题还有0.1+0.2,这是因为在计算机最底层,数值的运算和操作都是采用二进制实现的,所以计算机没有办法精确表示浮点数,而只能用二进制近似相等的去表示浮点数的小数部分。当进行计算或其他操作时时,四舍五入(逢1进,逢0舍)将会导致最终的运算结果存在偏差。
数据类型的判断方式有
- typeof 这个语法的缺点是 null 会判断为 object,其他引用类型也统一去返回 object
- intanceof 问题是不能检测基本数据类型,因为没有原型链,原型链可能被修改,导致检测结果不准确
- Object.prototype.toString().call 检测结果为[object String | Null | Boolean | Object| Function .... ] 较为准确,言简意赅的说:所有数据类型都是对象的一种类型,而Object.prototype.toString可以返回当前调用者的对象类型(去原型链上去找)。
- 判断是否为数组 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;
};