前端面试 75 道题,看完的人少之又少 (中)( 四 )
//ES5 Versionvar getCurrentDate = function (){return new Date();}//ES6 Versionconst getCurrentDate = () => new Date();
在本例中 , ES5 版本中有function(){}声明和return关键字 , 这两个关键字分别是创建函数和返回值所需要的 。 在箭头函数版本中 , 我们只需要()括号 , 不需要 return 语句 , 因为如果我们只有一个表达式或值需要返回 , 箭头函数就会有一个隐式的返回 。
//ES5 Versionfunction greet(name) {return 'Hello ' + name + '!';}//ES6 Versionconst greet = (name) => `Hello ${name}`;const greet2 = name => `Hello ${name}`;
我们还可以在箭头函数中使用与函数表达式和函数声明相同的参数 。 如果我们在一个箭头函数中有一个参数 , 则可以省略括号 。
const getArgs = () => argumentsconst getArgs2 = (...rest) => rest
箭头函数不能访问arguments对象 。 所以调用第一个getArgs函数会抛出一个错误 。 相反 , 我们可以使用rest参数来获得在箭头函数中传递的所有参数 。
const data = http://kandian.youth.cn/index/{result: 0,nums: [1, 2, 3, 4, 5],computeResult() {// 这里的“this”指的是“data”对象const addAll = () => {return this.nums.reduce((total, cur) => total + cur, 0)};this.result = addAll();}};
箭头函数没有自己的this值 。 它捕获词法作用域函数的this值 , 在此示例中 , addAll函数将复制computeResult 方法中的this值 , 如果我们在全局作用域声明箭头函数 , 则this值为 window 对象 。
44. 什么是类?类(class)是在 JS 中编写构造函数的新方法 。 它是使用构造函数的语法糖 , 在底层中使用仍然是原型和基于原型的继承 。
//ES5 Version function Person(firstName, lastName, age, address){this.firstName = firstName;this.lastName = lastName;this.age = age;this.address = address; } Person.self = function(){return this; } Person.prototype.toString = function(){return "[object Person]"; } Person.prototype.getFullName = function (){return this.firstName + " " + this.lastName; }//ES6 Version class Person {constructor(firstName, lastName, age, address){this.lastName = lastName;this.firstName = firstName;this.age = age;this.address = address;}static self() {return this;}toString(){return "[object Person]";}getFullName(){return `${this.firstName} ${this.lastName}`;} }
重写方法并从另一个类继承 。
//ES5 VersionEmployee.prototype = Object.create(Person.prototype);function Employee(firstName, lastName, age, address, jobTitle, yearStarted) {Person.call(this, firstName, lastName, age, address);this.jobTitle = jobTitle;this.yearStarted = yearStarted;}Employee.prototype.describe = function () {return `I am ${this.getFullName()} and I have a position of ${this.jobTitle} and I started at ${this.yearStarted}`;}Employee.prototype.toString = function () {return "[object Employee]";}//ES6 Versionclass Employee extends Person { //Inherits from "Person" classconstructor(firstName, lastName, age, address, jobTitle, yearStarted) {super(firstName, lastName, age, address);this.jobTitle = jobTitle;this.yearStarted = yearStarted;}describe() {return `I am ${this.getFullName()} and I have a position of ${this.jobTitle} and I started at ${this.yearStarted}`;}toString() { // Overriding the "toString" method of "Person"return "[object Employee]";}}
所以我们要怎么知道它在内部使用原型?
class Something {}function AnotherSomething(){}const as = new AnotherSomething();const s = new Something();console.log(typeof Something); // "function"console.log(typeof AnotherSomething); // "function"console.log(as.toString()); // "[object Object]"console.log(as.toString()); // "[object Object]"console.log(as.toString === Object.prototype.toString); // trueconsole.log(s.toString === Object.prototype.toString); // true
45. 什么是模板字符串?模板字符串是在 JS 中创建字符串的一种新方法 。 我们可以通过使用反引号使模板字符串化 。
//ES5 Versionvar greet = 'Hi I\'m Mark';//ES6 Versionlet greet = `Hi I'm Mark`;
在 ES5 中我们需要使用一些转义字符来达到多行的效果 , 在模板字符串不需要这么麻烦:
//ES5 Versionvar lastWords = '\n'+ 'I\n'+ 'Am\n'+ 'Iron Man \n';//ES6 Versionlet lastWords = `IAmIron Man`;
在ES5版本中 , 我们需要添加\n以在字符串中添加新行 。 在模板字符串中 , 我们不需要这样做 。
//ES5 Versionfunction greet(name) {return 'Hello ' + name + '!';}//ES6 Versionfunction greet(name) {return `Hello ${name} !`;}
在 ES5 版本中 , 如果需要在字符串中添加表达式或值 , 则需要使用+运算符 。 在模板字符串s中 , 我们可以使用${expr}嵌入一个表达式 , 这使其比 ES5 版本更整洁 。
46. 什么是对象解构?对象析构是从对象或数组中获取或提取值的一种新的、更简洁的方法 。 假设有如下的对象:
- 三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经
- java面试题整理
- 面试官:问你一个,Spring事务是如何传播的?
- 程序员面试主要看哪些 该怎么准备面试内容
- 震惊!京东T4大佬面试整整三个月,才写了两份java面试笔记
- 2020金九银十安卓面试题来袭(猿辅导+斗鱼+字节+腾讯)
- 「8」进大厂必须掌握的面试题-Java面试-异常和线程
- 安卓面试必备的JVM虚拟机制详解,看完之后简历上多一个技能
- 成功拿下阿里P6的offer后,总结出大厂面试的血泪史
- 面试官:聊聊 etcd 中的 Raft 吧