当 JavaScript 出现在编程世界的画面中时,出于营销原因选择了这个名字。那时Java在世界各地都很流行(但你最好知道两者是不同的)。后来它被提交给 ECMA(欧洲计算机制造商协会)以标准化该语言及其规范。
后来它被命名为 ES 的 ECMAScript。第一版于 1997 年 6 月发布。ES6 是该语言的第六版,后来更名为 ECMAScript 2015。该版本引入了许多新特性,例如类、模块、迭代器、for/of 循环、箭头函数、类型化数组、承诺、反思等。
2016 年 6 月,ES6 发布,后来更名为 ECMAScript 2015。2017 年 6 月,第 8 版发布,其中包含一些并发和原子性、与 promise 的语法集成(async/await)的功能。让我们讨论一些您应该为面试准备的常见问题。这些问题将有助于清除专门针对前端开发角色的面试。
1. ES6 有哪些常见的 Features?
以下是 ES6 的共同特性……
- 支持常量/不可变变量。
- 块作用域支持变量、常量、函数。
- 箭头函数
- 扩展参数处理
- 默认参数
- 模板字面量和扩展字面量。
- 解构赋值
- 箭头函数
- 承诺
- 班级
- 模块
- 支持 Map/Set 和 WeakMap/WeakSet
- Promises、本地化、元编程、国际化
2. let 和 const 是什么?两者与 var 有何不同?
在 JavaScript 中,当我们使用 var 关键字声明任何变量时。 var 关键字是函数作用域。我们可以在函数内访问变量。这导致每当我们必须创建一个新的作用域时,都会将代码包装在一个函数。
Let 和 const 都是块作用域。如果您使用这些关键字声明一个变量,那么它只存在于围绕它们的最里面的块中。假设您在块内使用 let 声明了一个变量(如果是条件或 for 循环),那么它只能在块内访问。
下面是一个 let 关键字的例子……
Javascript
if(true) {
let a=0;
console.log(a); //prints 0;
}
console.log(a); throws ReferenceError: a is not defined.
Javascript
const a=0;
a=1; // TypeError: Assignment to constatnt variable.
const b= [1, 2];
b.push(3); //[1, 2, 3]
b[3]= 4; // [1, 2, 3, 4]
Javascript
function add(a, b) {
return a+b;
};
//Implementation with arrow function
const add = (a, b) =>a+b;
// With single argument, no parenthesis required
const add5 = a => 5+a;
Javascript
var mySet = new Set();
mySet.add(1); // Set [1]
mySet.add(5); // Set [1, 5]
mySet.add(5); // Set [1, 5] --ignored
Javascript
function *infiniteNumbers() {
let n=1;
while(true) {
yield n++;
}
}
const numbers = infiniteNumbers(); // returns an iterable object
numbers.next(); // { value: 1, done: false}
numbers.next(); // { value: 2, done: false}
numbers.next(); // { value: 3, done: false}
Javascript
let num1 = [40,50,60];
let num2 = [10,20,30,...num1,70,80,90,100];
console.log(num2);
Javascript
let fullname =['Alan','Rickman'];
let [fname,lname] = fullname;
console.log (fname,lname);
Const 在 JavaScript 中是不可变的。一旦它被声明,你就不能改变或重新分配它的值。
Javascript
const a=0;
a=1; // TypeError: Assignment to constatnt variable.
const b= [1, 2];
b.push(3); //[1, 2, 3]
b[3]= 4; // [1, 2, 3, 4]
练习使用 let 和 const 而不是 var 关键字。
3. 什么是箭头函数?普通函数和箭头函数什么区别?
在 ES6 中定义了箭头函数来定义函数并使用它。基本上,它是箭头函数的速记符号。您可以将参数列表 (…..) 传递给箭头函数,然后是 =>marker 和函数体。如果您使用单个参数声明箭头函数,则不需要使用括号。
Javascript
function add(a, b) {
return a+b;
};
//Implementation with arrow function
const add = (a, b) =>a+b;
// With single argument, no parenthesis required
const add5 = a => 5+a;
让我们讨论箭头函数和普通函数之间的一些区别。
- 他们没有自己的版本,并且他们关闭了这一点。
- 它们可以有一个简洁的正文而不是冗长的正文。 (他们也可以有一个冗长的身体)
- 您不能将它们用作构造函数。不允许将 new 与箭头函数一起使用。这只是意味着箭头函数不能有原型属性。
- 箭头函数没有生成器语法。例如:没有等效于函数 *foo() {…} 的箭头。
4. 设置了什么?
Set是新值的集合。在 Set 中,不应有任何重复值。所有的值都应该是唯一的。这些值可以是原始类型或对象引用。
Javascript
var mySet = new Set();
mySet.add(1); // Set [1]
mySet.add(5); // Set [1, 5]
mySet.add(5); // Set [1, 5] --ignored
NaN 和 undefined 可以存储在 Set 中。
5. 什么是生成器函数?
这是 ES6 的一个新特性。生成器函数允许您随时间生成许多值,返回一个对象。我们可以迭代这个对象,我们可以一次从函数提取一个值。当您调用生成器函数,它会返回一个可迭代对象。我们在 ES6 中使用 * 符号作为带有新的“yield”关键字的生成器函数。
Javascript
function *infiniteNumbers() {
let n=1;
while(true) {
yield n++;
}
}
const numbers = infiniteNumbers(); // returns an iterable object
numbers.next(); // { value: 1, done: false}
numbers.next(); // { value: 2, done: false}
numbers.next(); // { value: 3, done: false}
6. ES6 中的展开运算符是什么?
展开运算符用于获取参数列表。它由三个点 (…) 表示。基本上展开运算符采用可迭代对象(例如 array 或字符串)并将其扩展为单个元素。在 JavaScript 中,主要用于制作 JS 的浅拷贝。它使您的代码简洁并提高了代码的可读性。
您可以使用扩展运算符来组合或执行数组之间的串联。下面给出一个例子……
Javascript
let num1 = [40,50,60];
let num2 = [10,20,30,...num1,70,80,90,100];
console.log(num2);
7. ES6 中的解构是什么?
在 ES6 中,解构被引入来从数组和对象中提取数据到一个单独的变量中。它允许您从对象和数组中提取较小的片段。下面给出一个例子……
Javascript
let fullname =['Alan','Rickman'];
let [fname,lname] = fullname;
console.log (fname,lname);
8. 在 ES6 中定义 Map。
在引入 ES6 之前,我们使用对象来映射键和值。 Map 成为 ES6 中一种以键值对表示数据的新方式。 Map 是有序的,它会记住键的插入顺序。您可以按元素的插入顺序遍历元素。
下面是 Map 的表示
var map = new Map([iterable]);
9. 解释 ES6 中的 Promise。
在 JavaScript 中,有一个异步编程的概念。在异步编程中,您可以从主线程单独运行进程。在 ES6 中,promise 是处理异步编程的最简单方法。根据操作结果,可以拒绝或解决承诺。在 ES6 中引入 promise 之前,回调用于处理异步编程。
但它产生了回调地狱的问题,并引入了承诺来克服这个问题。
10. JavaScript 中的回调和回调地狱是什么?
在回调中,一个函数在另一个函数完成后被执行。在 JavaScript 中,回调有助于处理事件。我们将一个函数作为另一个函数的参数传递给另一个函数。
当我们在 Web 应用程序中使用回调时,很多时候回调会嵌套。过度使用回调会使您的 Web 应用程序变得混乱并导致回调地狱。
结论
我们已经包含了 ES6 的 10 个重要问题,这些问题对于面试来说非常重要。除了这些问题,ES6 中还有一些其他重要的概念。例如…
- JavaScript 中的模块
- 在 JavaScript 中提升
- 巴别塔的概念
- Webpack 的概念
- 弱集的概念
- 弱图的概念
- 模板字面量
要学习 JavaScript,请参阅JavaScript 教程