最后
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
function isEqual( a, b ){
if( a-b < Number.EPSILON ){
return true
}else{
return false
}
}
console.log( isEqual( 0.1+0.2, 0.3 ) )
11、ECMAScript 6 怎么写 class ,为何会出现 class?
ES6 中新增 class ,它是为了补充 js 中缺少的一些面向对象语言的特性,本质上来说它只是一种语法糖,它的绝大多数功能 ES5 都可以实现,新的 class 写法让对象原型写法更清晰。添加 class 之后,有利于我们更好的组织代码,在 class 中添加方法,其实就是添加到类的原型上。
class 应用:
class Phone{
// 构造函数
constructor( brand, price ){
this.brand = brand;
this.price = price
},
call(){
console.log(“可以打电话”)
}
}
// 实例化对象
let hw = new Phone( ‘华为’, 999 )
12、setTimeout、Promise、Async/Await 的区别
setTimeout 是异步执行函数,js 主线程运行到此函数时,不会等待 setTimeout 中的回调函数,回调函数会被压进消息队列,然后直接向下执行,当执行完当前事件循环的时候,回调函数会在下次事件循环中被执行。
console.log(1)
setTimeout(()=>{
console.log(2)
},0)
console.log(3)
// 运行结果:1 3 2
Promise 本身是同步的立即执行函数,当在执行体中执行 resolve 或 reject 的时候,此时是异步操作,会先执行 then / catch 等,等主栈完成后,才会执行 resolve reject 中的方法。
console.log(1)
var p =new Promise(( resolve, reject )=>{
console.log(2)
resolve(3)
})
p.then((res)=>{
console.log(res)
})
console.log(4)
// 运行结果:1 2 4 3
Async/Await 函数返回的是一个 Promise 对象,当函数执行的时候,一旦遇到 await 就会先返回,等到触发的异步操作完成,在执行函数体后面的语句。
await的含义为等待,也就是 async 函数需要等待await后的函数执行完成并且有了返回结果(Promise对象)之后,才能继续执行下面的代码。await通过返回一个Promise对象来实现同步的效果。
async function a1(){
console.log( 1 );
await a2();
console.log( 2 )
}
async function a2(){
console.log( 3 )
}
console.log( 4 );
a1();
console.log( 5 )
// 运行结果 4 1 3 5 2
13、forEach、for in、for of 三者区别
forEach 是数组的方法,进行遍历数组的。
for…in 不仅可以遍历数组,还可以对象。
for…of 进行遍历数组的。
for…in 与 for… of 遍历对象时,in 使用的是下标,而 of 使用的是 key。
14、说一下 es 6 的导入导出模块
export 命令用于规范模块的对外接口。
import 命令用于输入其他模块提供的功能。
export 对外暴露数据方式有三种:
方式1:分别暴露
export let person = “前端小姐姐”
export function showName(){
console.log( “倩倩” )
}
方式2:统一暴露
let person = “前端小姐姐”
function showName(){
console.log( “倩倩” )
}
export {
person,
showName
}
方式3:默认暴露
export default{
person = “前端小姐姐”,
showName: function(){
console.log( “倩倩” )
}
}
import 引入方式有三种:
方式1:通用的导入方式
import * as m from “./src/js/m.js”
console.log( “m”,m )
方式2:解构赋值
import { person, showName } from “./src/js/m.js”
// 重名时,可自定义名字
import { person as per, showName } from “./src/js/m.js”
// 针对默认暴露也可以这么写
import { default as m } from “./src/js/m.js”
方式3:简便形式,针对默认暴露
import m from “./src/js/m.js”
15、介绍下 Set、Map的区别 ?
应用场景 Set 用于数组重组,Map 用于数据储存。
对于Set:
-
成员不能重复。
-
只有键值没有键名,类似数组。
-
可以使用 for…of 遍历
-
方法有 size、add、delete、has、clear
对于Map:
-
键值对的集合,类似集合。
-
可以 for…of 遍历
-
方法有 size、set、delete、has、clear
光说理论是不是都要困了,现在是时候大展拳脚了!看看你对 ES 知识掌握到底怎么样?
16、写出下面代码运行结果。
new Promise((resolve)=>{
console.log( 1 )
resolve()
}).then(()=>{
console.log( 2 )
new Promise(res=>{
res(1)
}).then(()=>{
console.log( 3 )
new Promise(res=>{
res(1)
}).then(()=>{
console.log( 4 )
})
}).then(()=>{
new Promise(res=>{
res(1)
}).then(()=>{
console.log( 5 )
})
})
}).then(()=>{
console.log( 6 )
})
答案: 1 2 3 6 4 5
17、箭头函数中的 this 。请写出下面代码运行结果。
name = “单身狗”
setTimeout(()=>{
console.log(this.name) //单身狗
},0)
function Job(){
this.name = “漂亮小姐姐”
setTimeout(()=>{
console.log(我是天天敲代码的 ${this.name} !
) //漂亮小姐姐
},3000)
}
let j = new Job()
箭头函数没有自己的 this ,它的 this 是继承而来的,默认指向在定义它时所处的对象。
18、写出下面代码运行结果。
var name = ‘window name’
var p1 = {
name:‘p1 name’,
showName:function(){
console.info(this.name)
}
}
var fn = p1.showName
fn()
p1.showName()
var p2 = {
name:‘p2 name’,
showName:function(fun){
fun()
}
}
p2.showName(p1.showName)
p2.showName = p1.showName
p2.showName()
/*
运行结果:
window name
p1 name
window name
p2 name
*/
19、箭头函数可以用call或者apply改变this指向吗?
call 和 apply 都是用来改变 this 指向的,它们会立即执行。
ES6 箭头函数的主要特性:
-
箭头函数没有自己的 this 对象,箭头函数内部的 this 是词法作用域,由上下文确定。this 在定义函数的时候已绑定,并非执行函数的时候。
-
箭头函数的 this 永远指向其父级作用域。
-
任何方法都改变不了 this ,包括 call、apply 和 bind。
试试下面这个练习,你就知道了。
const obj1 = {
name:‘张三’,
}
const obj2 = {
name:‘李四’,
fun2 : function(){ //修改成箭头函数再试试
console.log(this);
}
}
obj2.fun2();
obj2.fun2.call(obj1);
最后
基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
箭头函数的 this 永远指向其父级作用域。
- 任何方法都改变不了 this ,包括 call、apply 和 bind。
试试下面这个练习,你就知道了。
const obj1 = {
name:‘张三’,
}
const obj2 = {
name:‘李四’,
fun2 : function(){ //修改成箭头函数再试试
console.log(this);
}
}
obj2.fun2();
obj2.fun2.call(obj1);
最后
基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。