js面试题

Js面试题

判断js数据类型的方法?

1.Typeof
可以判断出’string’,‘number’,‘boolean’,‘undefined’,‘symbol’
但判断 typeof(null) 时值为 ‘object’; 判断数组和对象时值均为 ‘object’
2.Instanceof
B instanceof A 判断b是否是a的实例,原理是构造函数的 prototype 属性是否出现在对象的原型链中的任何位置
3.Object.prototype.toString.call()
对所有的数据类型都能判断,即便是null和undefined
4.Array.isArray()
用于判断是否为数组
Js判断变量是不是数组?
1、方式一:Array.isArray()
a)
2、方式二:instanceof
Arr instanceof Array
3、Object.prototype.toString.call()
4、isPrototypeOf

5、constructor来判断数据的类型,但是除了null、undefined,因为他们不是由对象构建。
arr.constructor

JS判断对象是否为空?

1、使用ES6的Object.keys()方法
Object.keys()是ES6的新方法, 返回值也是对象中属性名组成的数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。
Object.keys(obj).length === 0 && obj.constructor === Object
2、将json对象转化为json字符串,再判断该字符串是否为"{}"

闭包概念,闭包优缺点?

闭包就是一个函数能读取其他函数内部变量的连接。
优点:
1、内部函数可以访问到外部函数的变量,可以让一个变量长期存储在内存中的同时,避免全局变量的污染。
2、闭包可以解决一些问题
(比如说我在页面上有4个li,点击每个li的时候触发点击事件显示li的顺序。
首先要对这4个li进行for循环,在循环里执行点击事件,根据js的执行流程来说,会先执行同步,再执行异步,这个时候onclick事件是在for循环完执行就导致点击每个li都显示的是4。
可以用闭包的方法,让i驻留在内存中,就可以解决这样的问题了。)

缺点:
1、变量会驻留在内存中,造成内存损耗的问题。
解决:手动把闭包的函数设置为null
2、在ie浏览器里会造成内存泄漏。

深拷贝和浅拷贝

共同点:都是复制
1、浅拷贝:只复制引用,而未复制真正的值

2、深拷贝:复制真正的值(不同的引用)
实现:
1、JSON.parse(JSON.stringify(xx))
JSON.parse()用来解析JSON字符串,构造成字符串描述的JavaScript值或对象
JSON.stringify(xx)把对象转换成JSON字符串

2、用递归的形式手写(思路,判断要复制的是对象还是数组,是对象创建一个新对象,是数组创建一个新数组,然后for…in…循环要复制的对象或数组,获取item去判断item是否是引用类型object,如果是再调用这个函数,如果不是给创建的新数赋上对应的值。

3、slice
array.slice(0)

数组去重的方法?

1、ES6的new set,但是set返回的是对象,要转换成数组,使用array.from或者用[ 拓展运算符展开set返回的对象],

2、indexOf和push,创建一个新数组,循环要去重的数组,用indexOf判断新数组里有没有去重数组的每一项,如果没有,向新数组里push那一项。

3、ES6的filter,fiter去过滤掉

filter()方法会过滤掉不符合条件的数组,返回一个包含符合指定条件的所有元素的新数组。如果没有符合条件的元素,则返回空数组。
在filter后面的函数里,arr.indexOf(item)会返回item在arr里首次出现的位置,如果这个位置等于index,filter就不过滤,如果不等于就是重复了过滤掉

DOM事件有哪些阶段?谈谈对事件代理的理解?

分为三大阶段:捕获阶段–目标阶段–冒泡阶段
事件代理简单说就是:事件不直接绑定到某元素上,而是绑定到该元素的父元素上,进行触发事件操作时(例如’click’),再通过条件判断,执行事件触发后的语句(例如’alert(e.target.innerHTML)')
好处:(1)使代码更简洁;(2)节省内存开销

JS的微任务和宏任务?

1、js的单线程的语言,同一时间只能做一件事
2、js代码执行流程:同步执行完 =》事件循环
同步的任务都执行完了才会执行事件循环的内容
进入事件循环:请求、定时器、事件…
3、事件循环【微任务、宏任务】
微任务:promise.then
宏任务:setTimeout…
要执行宏任务的前提是清空了所有的微任务
流程:同步->事件循环【微任务和宏任务】->微任务->宏任务->宏任务里面有微任务先执行微任务->宏任务…

Js垃圾回收机制?

按照固定的时间周期性的找出不再使用的变量,释放占用的内存。
不是时时的,因为开销比较大。
四种常见的内存泄漏:全局变量,未清除的定时器,闭包,以及 dom 的引用
1.全局变量 不用 var 声明的变量,相当于挂载到 window 对象上。如:b=1; 解决:使用严格模式
2.被遗忘的定时器和回调函数
3.闭包
4.没有清理的 DOM 元素引用

如何延迟加载js?

一般我们先加载html,再加载js,避免js出错影响html渲染
1、setTimeout
2、async
3、defer

// new一个实例化对象经历的四个阶段 :

 // 1、创建一个空的实例化对象
 // 2、改变构造函数中的this指向,使构造函数中的this指向该实例化对象
 // 3、执行构造函数,在执行的过程中,空的实例化对象就生成了自身的属性和方法
 // 4、返回实例化对象

数组中常见方法

  • find 查找符合条件的项,找到一个就返回,返回符合条件的项
  • findIndex 查找符合条件项目的下标
  • filter过滤数组,返回符合条件的项,返回的是一个数组,返回所有符合条件的项
  • map遍历数组,映射并返回一个新数组
  • forEach循环数组,无返回值
  • reduce数组的累加方法
  • splice截取数组,删除或截取数组,第一个数是下标,第二个数是截取几个,会改变原数组,返回新数组
  • slice(start,end):方法可从已有数组中返回选定的元素,返回一个新数组,包含从start到end(不包含该元素)的数组元素。
    注意:该方法不会改变原数组,而是返回一个新数组
    start参数:必须,规定从何处开始选取,如果为负数,规定从数组尾部算起的位置,-1是指最后一个元素。
    end参数:可选(如果该参数没有指定,那么切分的数组包含从start倒数组结束的所有元素,如果这个参数为负数,那么规定是从数组尾部开始算起的元素)。
  • join数组转字符串
    -sort() 方法对数组的项目进行排序
  1. reverse 颠倒数组中的顺序
  2. every 检测数组中元素是否都符合条件,返回值为–boolean
  3. some 检测数组中元素是否有满足条件的元素,返回值为—boolean
  4. includes 查看数组中是否存在此元素
    Splice和slice的区别?
    splice改变原数组,slice不改变原数组。
    splice除了可以删除之外,还可以插入。
    splice可传入3个参数,slice接受2个参数。
    splice(指定删除的位置,要删除的项目数,要添加的新项目1,要添加的新项目2)

Js常见字符串常用方法

charAt(): 返回指定下标位置的字符
indexOf(): 返回某个指定的子字符串在字符串中第一次出现的位置,没有找到,返回-1
lastIndexOf(): 返回某个指定的子字符串在字符串中最后出现的位置。
slice(): 返回字符串中提取的子字符串,接受负值的参数。
substring(): 截取字符串中介于两个指定下标之间的字符。substring()用法与slice()一样,但不接受负值的参数。
substr(): 返回从指定下标开始指定长度的的子字符串。
split(): 把字符串分割成字符串数组。
replace(): 在字符串中用一些字符替换另一些字符。
match(): 返回所有查找的关键字内容的数组

js的原型、原型链?

1、原型可以解决什么问题?
Js作者创建js时参考的java的设计思路,但是不是用类去生成对象,而是构造函数。
用构造函数生成实例对象,有一个缺点就是无法共享属性和方法。每个实例都有自己的属性和方法的副本,不能数据共享也造成了极大的资源浪费。作者就为每一个构造函数设置原型(prototype对象),所有要共享的属性和方法放在protoType里,不需要共享的放在构造函数里。
实例对象一旦创建,自动引用protoType对象里的属性和方法。
2、函数拥有protoType
对象拥有_proto_,
对象的_proto_指向构造它的函数的protoType
3、对象查找属性或方法的顺序
先在对象本身查找 -> 到创建它的构造函数里查找 -> 到对象的原型_proto_中查找 -> 构造函数的原型protoType找 ->往当前创建构造函数的Object中找…
4、原型链?
1是什么?就是把原型串联起来
2原型链的顶端是null(空指针对象)

js的继承有哪些?

1、es6的extends继承(注意要加个super)

2、原型链继承,缺点是parent的原型对象是共用的

3、借用构造函数的继承,缺点是不能继承parent的原型对象

4、组合式继承(原型链继承和构造函数都继承)

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值