==和===的区别
双引号只对比值,而js的很多类型会在比较时转换成其他值,所以导致精确度不高
三引号除了比较值,还比较类型,所以严谨情况下用三引号
js微任务和宏任务
1.js是单线程的语言
2.js代码执行流程:同步任务=》事件循环
同步的任务都执行完了,才回去执行事件循环中的内容
进入事件循环的任务:请求、定时器、事件
3.事件循环中包括【微任务、宏任务】
微任务:Promise.then()
宏任务:setTimeout
要执行宏任务的前提是清空了所有的微任务后
js对象
js对象的注意点:
1.对象是通过new出来的,所以对象之间不相等 注:引用类型例外,也就是浅拷贝的类型
[1,2,3] === [1,2,3] 这是错的
js判断是不是数组
方式一: Array.isArray(arr)
方式二:arr instanceof Array
方式三:Object.prototype.toString.call().(arr).indexOf('Array')>-1
方式四:Array.prototype.isPrototypeOf(arr)
slice和splice
1.slice是用来截取的 .slice(index,number) number可选
第一个参数是索引,0开始,第二个是要截取的数量
如果传一个正数,从头第几位开始后面全部截取,如果是负数则从尾几位到头全部截取
slice不会改变原数组并返回一个新的数组
2.splice是用来插入、替换、删除的
会返回一个数组,是删除的元素
该方法会改变原数组
js数组去重
1.new set
let a = [1,2,3,1]
Array.from(new Set(a)) ;
2.for循环去
var arr = [1,2,3,1]; var newArr = [] for(let i;i < newArr.length;i++){ if(newArr.indexOf(arr[i]) == -1){ newArr.push(arr[i]) } }
new操作符具体做了什么操作
1.创建了一个空的对象
2.将空对象的原型指向构造函数的原型 Fn.prototype == new Fn().__proto__
3.将空对象作为构造函数的上下文(改变了this的指向)
4.对构造函数有返回值的处理判断 如果返回基本类型则忽略
闭包
1.闭包是什么
闭包是一个函数,它可以访问另一个函数作用域中的变量函数;一般情况下就是在一个函数中包含另一个函数。
原型链
1.原型可以解决什么问题
对象共享属性和共享方法
2.谁会有原型
函数拥有:prototype
对象拥有:__proto__
3.对象查找属性或方法的顺序是
现在对象的本身查找 =》对象的构造函数中查找=》对象的原型上查找=》构造函数的原型中查找=》Object.prototype中查找
4.原型链是什么
原型链就是把原型都串联起来
原型的最顶端就是null Object的__proto__
call、apply、bind的区别
共同点:功能一样,可以改变this指向;
语法:fn.call()、fn.apply()、fn.bind();
区别:
1.call、apply调用时会立即执行一次,bind不会立即执行,而是返回一个已改变this的函数
2.参数不同:apply的第二个参数是数组。call和bind都是...args的形式
数组sort的原理
深拷贝和浅拷贝
1.浅拷贝:只复制引用,而未复制真正的值(指向同一块内存空间),其中一个被修改,其他也会被修改;
2.深拷贝: 复制了真正的值,存在了不同的内存空间,互相不影响;
localStorage、sessionStorage、cookie的区别
1.数据存放有效期:
localStorage可以持久化存储,不主动清除可以永久保存
sessionStorage在关闭之前存在,关闭标签页后数据消失;
cookies可以持久化存储,在过期时间之前
3.存储大小:
cookies存储量不超过4k
localStorage和sessions不能超过5m
js数组方法
.forEach():遍历每一个元素,没有返回值,可以直接改变原数组;
.filter():判断每一个元素,将满足的元素作为一个新数组返回
.push():忘数组后面添加新元素,改变数组长度
.pop():删除数组最后一个元素,改变数组长度
.unshift():向数组最前面添加一个或多个元素,改变数组长度
.shift():删除数组第一个元素,返回被删除元素数组
.map():遍历每一个元素,返回一个新的数组,不会改变原数组
.every():判断每一个元素,所有满足条件时返回true,否则返回false
.some():判断其中一个满足条件则返回true,否则返回false;
.reduce():遍历元素,返回一个最后结果,第一个是一个函数,第二个是初始值;函数的第一个值是上一次的值,第二个是当前值,第三个是数组本身
.toString():把数组作为字符串返回,逗号分隔;
.join():把数组作为返回字符串返回,可以传入分隔符;
.slice():截取数组,返回一个新数组,不会改变原数组;
.splice():截取、替换数组,返回新数组并改变原数组
.concat():将两个数组连接在一起,返回新数组,不会改变原数组
.sort():数组排序
.reverse():数组反转
.findIndex():返回符合条件的元素下标
.includes():数组中包含条件则返回true,否则返回false
js字符串方法
.trim():去除空格
.split():把每一项分割成数组;
.indexOf():返回符合条件的第一个元素下标,如没有找到则返回-1
.lastIndexOf():返回元素在字符串中最后一次出现的位置,如没有找到则返回-1
.subString(from,to):字符串分割,返回from到to(不含)之间的字符
.slice():截取字符串
.toLowerCase():字符串转换小写
.toUpperCase():字符串大写
.replace():字符替换,可以写正则
.concat():连接字符串
js中defer和async的区别
defer:解析到script中带有defer属性后并行下载js,并最后按script标签的顺序执行;
async:解析到scipr带有async属性后开始并行下载js,下载完后立即执行,不会按照scipr的顺序执行
什么是重排和重绘
重排:改变dom结构的时候,会从dom树开始重新渲染页面,比如:删除和添加dom元素,元素的尺寸改变,元素的内容改变,窗口改变等等,当计算的像素位置改变时就会触发重排;
重绘:当改变元素样式,不去改变几何结构,他会从render tree也就是渲染树开始重新渲染,比如改变颜色、改变透明、使用变形transfrom时就会触发重绘;
什么是防抖和节流
防抖:事件触发时不会立即触发对应函数,如果在指定时间内没有重新触发事件,才会执行相应函数,如果在指定时间内再次触发事件,则重新计时;
节流:不过指定时间内有多少次被触发事件,只会按照指定时间的频率去执行函数。如:1000ms/次,不管多么频繁触发,只能按照1000ms一次的频率
for in 和 for of
for in :
用于遍历数组:得到数组下标和数组的属性和原型上的方法和属性;
用于遍历对象:得到对象的属性名和原型上的方法和属性
for of:一般用于遍历Map和Set结构等,也可以用来遍历数组
浏览器地址栏输入url后发生了什么
1、DNS域名解析
2、发起TCP的3次握手
3、简历TCP连接发起http请求
4、服务端响应http,浏览器接收html字符串
5、浏览器解析html,请求html中的资源
6、浏览器对页面进行渲染呈现给用户
Promise的几种状态
三种状态:
1.pending 初始化
2.fulfilled 成功
3.reject 失败
两个过程
1.pending-》fulfilled
2.pending -》 reject
调用resolve时,pending进入fulfilled,执行then方法
调用reject时,pending进入reject,执行catch方法
什么是async/await
async/await是现在最流行的解决异步的方案,使得异步代码看起来像同步代码,用async标记一个异步函数,在函数内部用await等待结果