js面试题
1、 js数据类型
(1) 基本数据类型:
Number、String、Boolean、Null、Undefined、Symbol、bigInt
(2)引用数据类型:
object、Array、Date、Function、RegExp
2、js变量和函数声明的提升
(1)js中的变量和函数的声明会提升到最顶部执行
(2)函数的提升高于变量的提升
(3)函数的内部如果用var声明了相同的外部变量,函数将不再向上寻找。
3、闭包
(1)闭包就是能够读取其他函数内部变量的函数
(2)闭包基本上就是一个函数内部返回一个函数
好处
(1)可以读取函数内部的变量
(2)将变量始终保存在内存中
(3)可以封装对象的私有属性和方法
坏处
(1)比较耗费内存,使用不正当会造成内存溢出的问题
4、==和===的区别
(1)==是非严格意义上的相等 【值相等就像等】
(2)===是严格意义上的相等,会比较两边的数据类型和值的大小 【值和引用地址相等才相等】
5、this
(1)this总是指向函数的调用者
(2)如果有new关键字,this指向的就是new出来的对象
(3)在this中,this指向出发这个事件的对象
6、js数组和遍历的方式
(1)for in
(2)for
(3)forEach
(4)for-of
7、map与forEach区别
(1) forEach方法是最基本的方法,就是遍历与循环,默认有3个参数:分别是遍历的数组内容容 item、数组索引 index、和当前遍历数组 Array
(2)map 方法,基本用法与 forEach 一致,但是不同的,它会返回一个新的数组,所以 callback需要有 return 值,如果没有,会返回 undefined
8、箭头函数与普通用函数的区别
(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象
(2)不可以当作构造函数,也就是说,不可以使用 new 命令,否则会抛出一个错误
(3)不可以使用 arguments 对象,该对象在函数体内不存在。如果要用,可以用 Rest 参数代替
(4)不可以使用 yield 命令,因此箭头函数不能用作 Generator 函数
9、同源策略
同源指的是域名、协议、端口号相同
10、如何解决跨域
(1)jsonp跨域
(2)document.domain + iframe 跨域
(3)nodejs中间件代理跨域
(4)后端在头部信息里面设置安全域名
11、严格模式的限制
(1)变量必须声明后在使用
(2)函数的属性不能有同名属性,否则报错
(3)不能使用with语句
(4)禁止this指向全局对象
12、es6新增
(1)新增模板字符串
(2)箭头函数
(3)for -of【用来遍历数据一列入数据中的值】
(4)ES6将 Promise 对象纳入规范,提供了原生的 Promise 对象
(5)增加了 let 和 const 命令,用来声明变量
(6)还有就是引入 module 模块的概念
13、attribute 和 property 的区别是什么?
(1)attribute 是 dom 元素在文档中作为 html 标签拥有的属性
(2)property 就是 dom 元素在 js 中作为对象拥有的属性
(3)对于 html 的标准属性来说,attribute 和 property 是同步的,是会自动更新的
(4)但是对于自定义的属性来说,他们是不同步的
14、let和const 的区别是什么?
(1)let命令不存在变量提升,如果在 let 前使用,会导致报错
(2)如果块区中存在let和const,就会形成封闭作用域
(3)不允许重复声明
(4)const定义的是常量,不能修改,但是如果定义的是对象,可以修改对象内部的数据
15、内存泄漏
(1)定义:程序中己动态分配的堆内存由于某种原因程序未释放或无法释放引发的各种问题。
(2)js中可能出现的内存泄漏情况:结果:变慢,崩溃,延迟大等
(3)js中可能出现的内存泄漏原因
(1)全局变量
(2)dom清空是,还存在引用
(3)定时器未清除
(4)子元素存在引起的内存泄露
16、script 引入方式?
(1)html<script>引入
(2)js动态插入<script>
(3)<script defer>:异步加载,元素解析完成后执行
(4)<script async>:异步加载,但执行时会阻塞元素渲染
17、数组(array)方法
(1)map : 遍历数组,返回回调返回值组成的新数组
(2)forEach : 无法 break ,可以用 try/catch 中 throw new Error 来停止
(3)filter : 过滤
(4)some:有一项返回 true ,则整体为 true
(5)every:有一项返回 false ,则整体为 false
(6)join : 通过指定连接符生成字符串
(7)push / pop : 末尾推入和弹出,改变原数组, 返回推入/弹出项
(8)unshift / shift : 头部推入和弹出,改变原数组,返回操作项
(9)sort(fn) / reverse : 排序与反转,改变原数组
(10)concat :连接数组,不影响原数组,浅拷贝
(11)slice(start,end):返回截取后的新数组,不改变原数组
(12)splice(start,number,value…):返回删除元素组成的数组,value为插入项,改变原数组
(13)indexOf:查找数组项,返回对应的下标
(14)reduce:两两执行,prev 为上次化简函数的return 值,cur 为当前值(从第二项开始)
18、JavaScript 深浅拷贝?
(1)浅拷贝:Object.assign
(2)深拷贝:可以通过 JSON.parse(JSON.stringify(object)) 来解决
19、说说异步编程的实现方式?
(1)回调函数
优点:简单容易理解
缺点:不利于维护、代码耦合高
(2)事件监听
优点:容易理解,可以绑定多个事件,每个事件可以指定多个回调函数
缺点:事件驱动型,流畅不够清晰
(3)发布/订阅(观察者模式)
类似于事件监听,但是可以通过‘消息中心’,了解现在有多少发布者,多少订阅者
(4)Promise 对象
优点:可以利用 then 方法,进行链式写法;可以书写错误时的回调函数
缺点:编写和理解,相对比较难
(5)Generator 函数
优点:函数体内外的数据交换、错误处理机制
缺点:流程管理不方便
(6)async 函数
优点:内置执行器、更好的语义、更广的适用性、返回的是 Promise、结构清晰
缺点:错误处理机制
24、作用域链?
作用域链可以理解为一组对象列表,包含 父级和自身的变量对象,因此我们便能通过作用域链访问到父级里声明的变量或者函数