js面试题

==和===的区别

双引号只对比值,而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等待结果 

  • 27
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值