js常见理论面试题
JS篇
1.ES6新特性?⭐⭐⭐
新增块级作用域let定义变量和const定义常量变量的解构赋值
模板字符串 (‘${}’)
默认参数(key=value)
箭头函数(=>)
扩展运算符(…)
模块(import/export)
类(class/extends)
Promise
Proxy
Symbol
2.闭包的理解⭐⭐
理解:主要是为了设计私有的方法和变量。
优点:可以避免全局变量造成污染。
缺点:闭包会常驻内存,增加内存使用量,使用不当会造成内存泄漏。
特征:(1)函数嵌套函数。(2)在函数内部可以引用外部的参数和变量。(3)参数和变量不会以垃圾回收机制回收。
4.原型,原型链⭐⭐⭐
主要是还是实现继承与扩展对象。
每个函数对象都有一个 prototype 属性,这个属性就是函数的原型对象。
原型链是JavaScript实现继承的重要方式,原型链的形成是真正是靠__proto__ 而非prototype。
所有的引用类型(包括数组,对象,函数)都有隐性原型属性(proto), 值也是一个普通的对象。
所有的引用类型的 proto 属性值都指向构造函数的 prototype 属性值。
构造函数 new 出来一个对象,而每个对象都有一个 constructor 属性,该属性指向创建该实例的构造函数。
实例对象通过__proto__或者 object.getPrototype 的方法获取原型。
原型链其实就是有限的实例对象和原型之间组成有限链,就是用来实现共享属性和继承的。
6.export和export default的区别⭐
- 均可导出常量、函数、文件、模块等。
- 在一个文件或模块中,export、import可以有多个。export default仅有一个。
- 通过export方式导出,在导入时要加{ },export default则不需要。
7.箭头函数和普通函数的区别⭐⭐
语法更加简洁、清晰,=>()
箭头函数是匿名函数,不能作为构造函数,不能使用new
箭头函数不能使用arguments,而用reat参数…解决
箭头函数没有自己的this,会捕获其所在的上下文的this值,并且不能通过call()和apply()来改变其this
箭头函数没有原型
8.GET和POST的区别⭐⭐⭐
表面区别
后退/刷新:GET无害,POST数据会被重新提交。
书签:GET产生的URL地址可以被收藏为书签,而POST不可以。
数据:GET一般是用来获取数据,POST提交数据。
数据类型:GET只允许ASCII字符,POST无限制。
数据大小:GET大小有限制(一般来说1024字节),POST理论上来说没有大小限制。
安全性:GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
可见性:GET参数通过URL传递对所有人可见,POST数据不可见。
历史保留:GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
12.简述一下你理解的面向对象⭐⭐
面向对象是基于万物皆对象这个哲学观点. 把一个对象抽象成类,具体上就是把一个对象的静态特征和动态特征抽象成属性和方法,也就是把一类事物的算法和数据结构封装在一个类之中,程序就是多个对象和互相之间的通信组成的。
面向对象具有封装性,继承性,多态性。
封装:隐蔽了对象内部不需要暴露的细节,使得内部细节的变动跟外界脱离,只依靠接口进行通信.封装性降低了编程的复杂性。
继承:使得新建一个类变得容易,一个类从派生类那里获得其非私有的方法和公用属性的繁琐工作交给了编译器。
多态:继承和实现接口和运行时的类型绑定机制所产生的多态,使得不同的类所产生的对象能够对相同的消息作出不同的反应,极大地提高了代码的通用性.。
14. 数组有哪些方法\会不会改变原数组⭐⭐
(es5+es6)
会改变原来数组的有
1.添加(push---向数组的末尾添加一个或更多元素,unshift--向数组的开头添加一个或更多元素)
2.删除(pop--删除数组的最后一个元素,shift)
3.从数组中连续删除、插入数据:splice(索引下标,删除几位,插入的值)
4.数组排序:sort()
5.数组颠倒:reverse()
不会改变原来数组的有:
数组串联:join()
split()--通过指定分隔符对字符串进行切片
数组抽取:slice()
数组合并:concat()
数组转为字符串:toString()
every()---检测数组元素的每个元素是否都符合条件。
some()---检测数组元素中是否有元素符合指定条件。
filter()---检测数组元素,并返回符合条件所有元素的数组。
indexOf()---搜索数组中的元素,并返回它所在的位置。
slice()---选取数组的的一部分,并返回一个新数组。
valueOf()---返回数组对象的原始值
(ES5中数组常用方法)
1.forEach()
2.map(映射)
3.filtter(过滤)
4.every(所有)和some(存在)
5.reduce()和reduceRight()
6.indexOf()和lastIndexOf()
16. Promise⭐⭐⭐
含义:异步编程的一种解决方案,用来解决回调地狱。
三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败) (Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。)
resolved函数作用:将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved)。
reject函数的作用:将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected)。
Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。
then: Promise 实例添加状态改变时的回调函数。可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为resolved时调用,第二个回调函数是Promise对象的状态变为rejected时调用。
缺点:无法取消Promise,一旦新建它就会立即执行,无法中途取消。如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。
17.JS中new操作符有什么用?⭐⭐
- 创建临时对象,并将this指向临时对象
- 将构造函数的原型属性和方法挂载到新对象的__proto__(原型指针)上
- return 临时对象
18.JS获取HTML DOM元素的方法⭐⭐
通过ID获取(getElementById)
通过name属性(getElementsByName)
通过标签名(getElementsByTagName)
通过类名(getElementsByClassName)
获取html的方法(document.documentElement)
获取body的方法(document.body)
通过选择器获取一个元素(querySelector)
通过选择器获取一组元素(querySelectorAll)
19.事件捕获和事件冒泡⭐⭐
事件捕获和事件冒泡主要解决了页面事件流的问题。页面的事件流经过了三个阶段,分别是事件捕获、目标阶段和事件冒泡阶段。
事件捕获是由外向内;而事件冒泡则是由内向外。
event.stopPropagation() 可以阻止事件流的进一步传播。
采用事件代理的方式,能够节省内存消耗,对于动态改变子元素的时候,也非常有利,避免了很多麻烦的步骤,比如重新绑定事件。(把子元素的事件委托给父元素来处理)
23.JS有几种方法判断变量的类型?⭐⭐⭐
typeof
判断基本数据类型,对于引用数据类型除了function返回’function‘,其余全部返回’object’。
instanceof
区分引用数据类型,检测方法是检测的类型在当前实例的原型链上,用其检测出来的结果都是true,不太适合用于简单数据类型的检测,检测过程繁琐且对于简单数据类型中的undefined, null, symbol检测不出来。
constructor
检测引用数据类型,检测方法是获取实例的构造函数判断和某个类是否相同,如果相同就说明该数据是符合那个数据类型的,这种方法不会把原型链上的其他类也加入进来,避免了原型链的干扰。
Object.prototype.toString.call()
适用于所有类型的判断检测,检测方法是Object.prototype.toString.call(数据) 返回的是该数据类型的字符串。(举例:字符串返回的是[object String])