1. 谈谈你对 ES6 的理解,为什么要学习es6?
ES6是新一代的JS语言标准,对分JS语言核心内容做了升级优化,规范了JS使用标准,新增了JS原生方法,使得JS使用更加规范,更加优雅,更适合大型应用的开发。学习ES6是成为专业前端正规军的必经之路。
2. ES和js有什么关系?
ES是JS的一种规格,JS是ES的实现
3. 解构赋值及其原理?
解构赋值是一种在编程中用于从数组或对象中提取数据并赋值给变量的方式。其原理基于匹配模式,可以将数组或对象的结构与变量名一一对应,以便快速访问和使用其中的数据。
4.var let const 的区别和使用场景?
var: var 声明的变量具有函数作用域(function scope),而不是块作用域(block scope)。这意味着它们在声明它们的函数内部是可见的,而在函数之外是不可见的。 var 声明的变量会被提升(hoisting),即在函数或全局作用域的顶部,变量声明会被提升到执行上下文的顶部。但初始化(赋值)不会被提升。 var 声明的变量可以被重复声明,而不会引发错误。 var 声明的变量在全局作用域中会成为全局对象的属性,这可能导致意外的变量覆盖。 使用场景: 在 ES5 或旧版浏览器中使用,或者需要变量提升的情况。 在全局作用域中声明全局变量(但要谨慎,因为会导致变量污染和意外的覆盖)。 let: let 声明的变量具有块作用域(block scope),例如在 if、for、while 等语句块内部声明的变量只在该块内部可见。 let 声明的变量不会被提升到块的顶部,而是在声明位置之前访问会引发错误。 let 不允许在同一作用域内重复声明同名变量。 使用场景: 在 ES6 或更新的环境中使用,因为它引入了块作用域,更安全且通常更易维护。 在需要控制变量的作用域范围,例如在循环中迭代时,使用 let 声明循环变量。 const: const 声明的变量也具有块作用域。 const 声明的变量必须在声明时进行初始化(赋值),而且一旦赋值后,就不能再重新赋值。 const 声明的对象或数组可以修改其内部属性或元素,但不能重新赋值。
5. 什么是模板字符串?
1.ES6(ES2015)为 JavaScript 引入了许多新特性,其中与字符串处理相关的一个新特性——模板字面量,提供了多行字符串、字符串模板的功能,相信很多人已经在使用了。模板字面量的基本使用很简单,但大多数开发者还是仅仅把它当成字符串拼接的语法糖来使用的,实际上它的能力比这要强大得多哦。夸张一点地说,这可能是 ES6 这么多特性中,最容易被低估的特性了。 2.模板字面量在 ES2015 规范中叫做 Template Literals,在规范文档更早的版本中叫Template Strings,所以我们见过的中文文档很多也有把它写成 模板字符串 的,有时为表述方便也非正式地简称为 ES6 模板 3.在 ES6 之前的 JavaScript,字符串作为基本类型,其在代码中的表示方法只有将字符串用引号符(单引号 ' 或 双引号 ")包裹起来,ES6 模板字面量(下文简称 ES6 模板)则使用反撇号符(`)包裹作为字符串表示法。两个反撇号之间的常规字符串保持原样,如:
`hello world` === "hello world" // --> true `hello "world"` === 'hello "world"' // --> true `hello 'world'` === "hello 'world'" // --> true `\`` // --> "`" // --> true
6. 箭头函数和普通函数有什么区别
//箭头函数 let fun = () => { console.log('lalalala'); } //普通函数 function fun() { console.log('lalla'); } 箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种只包含一个表达式,连{ ... }和return都省略掉了。还有一种可以包含多条语句,这时候就不能省略{ ... }和return。 1.箭头函数是匿名函数,不能作为构造函数,不能使用new 2.箭头函数不绑定arguments,取而代之用rest参数...解决 3.箭头函数不绑定this,会捕获其所在的上下文的this值,作为自己的this值 4.箭头函数通过 call() 或 apply() 方法调用一个函数时,只传入了一个参数,对 this 并没有影响。 5.箭头函数没有原型属性 6.箭头函数不能当做Generator函数,不能使用yield关键字
7. 什么是扩展运算符?有什么使用场景?
1.扩展运算符(spread)是三个点(…)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。 应用场景: 1.数组传参 2.复制数组 3.合并数组 4.解构赋值 5.字符串转数组 6.类数组转真数组
8. 什么是symbol?
Symbol(符号)是 ECMAScript 6(ES6)引入的一种新的基本数据类型。它是一种唯一且不可变的数据类型,通常用于创建对象属性的唯一标识符。每个 Symbol 值都是唯一的,因此它们不会与其他 Symbol 值相等,即使它们的描述字符串相同也不例外。
9. Set和Map有什么相同和不同之处?
1.Set接口 1.不允许重复对象 2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。 3. 只允许一个 null 元素 4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。 2.Map接口 1.Map不是collection的子接口或者实现类。Map是一个接口。 2.Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。 3. TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。 4. Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。 5.Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)
10. 如何声明一个类?类如何继承?
class Cat extends Animal(){ constructor(){ super();//super关键字,用来指定父类的实例对象 this.type = 'cat'; } } let cat = new Cat(); cat.says('hello');//输出‘cat says hello’
11. 模块化有什么好处?
第一, 把一个系统分解成各个不同的子模块,不同的开发者专注于对其中某一模块的开发,一方面实现了劳 动的分工,另一方面也提高了自由软件开发的效率。基于模块化的性质,每个模块在开发出来以后都可以通过一个被称作是内核的原系统进行信息交流,发挥整个模块的功能,同时也并不会影响其他模块功能的发挥。而且在各个不同的模块整合在一起后,由于外部性的存在,会使整个系统增加的功能要超过该模块本身的功能。在此过程中实现了价值的分割与整合。 第二, 对于开发者而言,基于模块化的自由软件开发具有更大的吸引力,其在参与开发过程中可以得到更高的期望收益。 第三, 在非模块化的软件开发过程中,存在着严重的“搭便车”现象,当一个开发者选择参与开发,其余的开发者就会选择“搭便车”,最终会导致软件的供给不足;在基于模块化的开发过程中,所有的开发者都更倾向于参与开发不同的模块,从而实现整个系统的开发。
12.js由那三部分组成?
1、ECMAScript(JavaScript语法 ) 2、DOM 页面文档对象模型 3、BOM 浏览器对象模型
13. 什么是Proxy?
Promise 是一种用于处理异步操作的设计模式,它提供了一种更优雅的方式来管理异步操作的结果和错误处理。Promise 是 ECMAScript 6(ES6)中引入的一种构造函数,用于更好地管理异步代码,并解决回调地狱(callback hell)问题。