Vue 面试题
1.Vue 双向绑定原理
2.描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
3.你是如何理解 Vue 的响应式系统的?
4.虚拟 DOM 实现原理
5.既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?
6.Vue 中 key 值的作用?
7.Vue 的生命周期
8.Vue 组件间通信有哪些方式?
9.watch、methods 和 computed 的区别?
10.vue 中怎么重置 data?
11.组件中写 name 选项有什么作用?
12.vue-router 有哪些钩子函数?
13.route 和 router 的区别是什么?
14.说一下 Vue 和 React 的认识,做一个简单的对比
15.Vue 的 nextTick 的原理是什么?
16.Vuex 有哪几种属性?
17.vue 首屏加载优化
18.Vue 3.0 有没有过了解?
19.vue-cli 替我们做了哪些工作?
…
算法
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
- 冒泡排序
- 选择排序
- 快速排序
- 二叉树查找: 最大值、最小值、固定值
- 二叉树遍历
- 二叉树的最大深度
- 给予链表中的任一节点,把它删除掉
- 链表倒叙
- 如何判断一个单链表有环
- 给定一个有序数组,找出两个数相加为一个目标数
…
由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+评论666
ES2017(ES8)新增了以下特性👇
Async functions
Object.entries
Object.values
Object.getOwnPropertyDescriptors
Trailing commas
一、Async functions
1.1 定义
Async functions
是 async
声明的函数,async
函数是 AsyncFunction
构造函数的实例,其中允许使用 await
关键字。
1.2 语法
async function name([param[, param[, ...param]]]) {
// statements
}
1.3 返回值
一个Promise
1.4 例子
const promise = () => {
console.log('1');
return new Promise((resolve, reject) => {
resolve('2');
});
};
const asyncFun = async() => {
console.log('3');
const test = await promise();
console.log('4', test);
}
asyncFun(); // 3 1 4 2
二、Object.entries
2.1 返回值
Object.entries()
方法返回一个给定对象自身可枚举属性的键值对数组
2.2 语法
Object.entries(obj);
2.3 例子
let obj = {a: 1, b: 2};
Object.entries(obj); // [['a', 1], ['b', 2]]
三、Object.values
3.1 返回值
Object.values()
方法返回一个给定对象自身可枚举属性值的数组
3.2 语法
Object.values(obj);
3.3 例子
let obj = {a: 1, b: 2};
Object.values(obj); // [1, 2]
四、Object.getOwnPropertyDescriptors
4.1 返回值
Object.getOwnPropertyDescriptors()
方法用来获取一个对象的所有自身属性的描述符
4.2 语法
Object.getOwnPropertyDescriptors(obj);
4.3 例子
let obj = {a: 1, b: 2};
Object.getOwnPropertyDescriptors(obj); // [a: {configurable: true, enumerable: true, value: 1, writable: true}, b: {configurable: true, enumerable: true, value: 2, writable: true}]
五、Trailing commas
尾后逗号
5.1 定义
如果你想要添加新的属性,并且在上一行已经使用了尾后逗号,你可以仅仅添加新的一行,而不需要修改上一行
5.2 注意
- JSON 不允许尾后逗号
5.3 举例
-
字面量中的尾后逗号
- 对象
let obj = { a: 1, b: 2 }
- 数组
let arr = [ 1, 2 ]
-
函数中的尾后逗号
- 参数定义
function(x, y) {} function(x, y,) {} (x, y) => {} (x, y,) => {}
- 函数调用
fun(x, y) fun(x, y,)
- 不合法的尾后逗号
不含参数或者在剩余参数后面加逗号,都是不合法的尾后逗号
function(,) {} (,) => {} fn(,) function(...arg,) {} (...arg,) => {}
-
解构中的尾后逗号
let [a, b,] = [1, 2];
let {x, y} = {x: 1, y: 2};
- JSON中的尾后逗号
JSON中不允许出现尾后逗号
JSON.parse("[1, 2, 3,]") // ❌
JSON.parse('{"a": 1,}') // ❌
JSON.parse("[1, 2, 3]") // ✅
JSON.parse('{"a": 1}') // ✅
六、String.prototype.padStart()
6.1 定义
padStart()
用另一个字符串填充当前字符串。
6.2 返回值
在原字符串开头填充指定的填充字符串直到目标长度所形成的新字符串。
6.3 语法
str.padStart(targetLength);
str.padStart(targetLength, padString);
- targetLength:当前字符串需要填充到的目标长度。如果这个数值小于当前字符串的长度,则返回当前字符串本身。
- padString(可选):填充字符串。如果字符串太长,使填充后的字符串长度超过了目标长度,则只保留最左侧的部分,其他部分会被截断。此参数的默认值为 " "。
6.4 例子
'abc'.padStart(10); // " abc"
'abc'.padStart(10, "foo"); // "foofoofabc"
'abc'.padStart(6,"123465"); // "123abc"
'abc'.padStart(8, "0"); // "00000abc"
'abc'.padStart(1); // "abc"
七、String.prototype.padEnd()
7.1 定义
padEnd() 方法会用一个字符串填充当前字符串(如果需要的话则重复填充)。
7.2 返回值
返回在原字符串末尾填充指定的填充字符串直到目标长度所形成的新字符串。
7.3 语法
str.padEnd(targetLength)
str.padEnd(targetLength, padString)
- targetLength:当前字符串需要填充到的目标长度。如果这个数值小于当前字符串的长度,则返回当前字符串本身。
- padString(可选):填充字符串。如果字符串太长,使填充后的字符串长度超过了目标长度,则只保留最左侧的部分,其他部分会被截断。此参数的缺省值为 " "。
7.4 例子
'abc'.padEnd(10); // "abc "
'abc'.padEnd(10, "foo"); // "abcfoofoof"
'abc'.padEnd(6, "123456"); // "abc123"
'abc'.padEnd(1); // "abc"
ES9
ES2018(ES9)新增了如下特性👇
Async iterators
异步迭代器Object rest properties
剩余属性Object spread properties
扩展属性Promise.prototype.finally
一、Async iterators
异步迭代器
1.1 返回值
Async iterator
对象的 next() 方法返回一个 Promise
,这个 Promise
的返回值可以被解析成 {value, done}
的格式,
1.2 语法
iterator.next().then(({value, done}) => {});
1.3 举例
const asyncIterator = () => {
const array = [1, 2];
return {
next: function() {
if(array.length) {
return Promise.resolve({
value: array.shift(),
done: false
});
}
return Promise.resolve({
done: true
});
}
}
}
let iterator = asyncIterator();
const test = async() => {
await iterator.next().then(console.log); // {value: 1, done: false}
await iterator.next().then(console.log); // {value: 2, done: false}
await iterator.next().then(console.log); // {done: true}
}
test();
1.4 可以使用 for-await-of
在循环中异步调用函数
const promises = [
new Promise((resolve) => resolve(1)),
new Promise((resolve) => resolve(2)),
new Promise((resolve) => resolve(3)),
];
const test = async() => {
for await (const p of promises) {
console.log('p', p);
}
};
test();
二、Object rest properties
2.1 举例
let test = {
a: 1,
b: 2,
c: 3,
d: 4
}
let {a, b, ...rest} = test;
console.log(a); // 1
console.log(b); // 2
console.log(rest); // {c: 3, d: 4}
2.2 注意
null
不能使用扩展运算符
let {a, b, ...rest} = null; // ❌
三、Object spread properties
3.1 举例
let test = {
a: 1,
b: 2
}
let result = {c: 3, ...test};
console.log(result); // {c: 3, a: 1, b: 2}
let test = null;
let result = {c: 3, ...test}; // {c: 3}
四、Promise.prototype.finally
4.1 定义
在Promise
结束的时候,不管是结果是resolved
还是rejected
,都会调用finally
中的方法
finally
中的回调函数不接受任何参数
4.2 返回值
一个Promise
4.3 语法
const promise = new Promise((resolve, reject) => {
resolve('resolved');
reject('rejectd');
})
promise.then((res) => {
console.log(res);
}).finally(() => {
console.log('finally')
});
4.4 举例
const promise = new Promise((resolve, reject) => {
resolve(1);
reject(2);
});
const test = () => {
console.log(3);
promise.then((res) => {
console.log(4, res);
}).catch(err => {
console.log(5, err);
}).finally(() => {
console.log(6);
});
};
test(); // 3 4 1 6
ES10
ES2019(ES10)新增了如下新特性👇:
Array.prototype.{flat, flatMap}
扁平化嵌套数组Object.fromEntries
String.prototype.{trimStart, trimEnd}
Symbol.prototype.description
Optional catch binding
- Array.prototype.sort() is now required to be stable
一、Array.prototype.{flat, flatMap}
扁平化嵌套数组
1.1 Array.prototype.flat
1.1.1 定义
flat()
方法会按照一个可指定的深度遍历递归数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
1.1.2 语法
arr.flat([depth]);
depth
是数组遍历的深度,默认是1。
1.1.3 返回值
一个新数组,不会改变旧数组。
1.1.4 举例
const arr = [1, 2, [[[[3, 4]]]]];
arr.flat(); // [1, 2, [[[3, 4]]]]
arr.flat(3); // [1, 2, [3, 4]]
arr.flat(-1); // [1, 2, [[[[3, 4]]]]]
arr.flat(Infinity); // [1, 2, 3, 4]
1.1.5 注意
flat()
会移除数组中的空项
let arr = [1, 2, , , 3];
arr.flat(); // [1, 2, 3]
1.1.6 替换
reduce
与contact
let arr = [1, 2, [3, 4]];
arr.reduce((arr, val) => arr.concat(val), []);
...
扩展运算符与contact
let arr = [1, 2, [3, 4]];
[].contact(...arr);
1.2 Array.prototype.flatMap
1.2.1 定义
flatMap()
方法首先使用映射函数映射数组(深度值为1)的每个元素,然后将结果压缩成一个新数组。
1.2.2 返回值
一个新数组,并且每个元素都是回调函数的结果。
1.2.3 语法
arr.flatMap(function callback(currentVal[, index[, array]]) {
}[, thisArg])
- callback: 可以生成一个新数组所调用的函数
- currentVal: 当前数组在处理的元素
- index: 可选,正在处理的元素索引
- array: 可选,被调用的数组
- thisArg: 执行callback函数时使用的this值
1.2.4 举例
let arr = ['My name', 'is', '', 'Lisa'];
let newArr1 = arr.flatMap(cur => cur.split(' '));
let newArr2 = arr.map(cur => cur.split(' '));
console.log(newArr1); // ["My", "name", "is", "", "Lisa"]
console.log(newArr2); // [["My", "name"], ["is"], [""], ["Lisa"]]
二、Object.fromEntries
2.1 定义
fromEntries()
方法会把键值对列表转换成一个对象
2.2 返回值
一个新的对象
2.3 语法
Object.fromEntries(iterable)
- iterable: Array、Map等可迭代对象
2.4 举例
let map = new Map([['a', 1], ['b', 2]]);
let mapToObj = Object.fromEntries(map);
console.log(mapToObj); // {a: 1, b: 2}
let arr = [['a', 1], ['b', 2]];
let arrToObj = Object.fromEntries(arr);
console.log(arrToObj); // {a: 1, b: 2}
let obj = {a: 1, b: 2};
let newObj = Object.fromEntries(
Object.entries(obj).map(
([key, val]) => [key, val * 2]
)
);
console.log(newObj); // {a: 2, b: 4}
三、String.prototype.{trimStart, trimEnd}
3.1 String.prototype.trimStart
3.1.1 定义
trimStart()
方法用来删除字符串的开头的空白字符。
trimLeft()
是它的别名。
3.1.2 返回值
一个新的字符串,这个字符串左边的空格已经被去除掉了。
3.1.3 语法
str.trimStart();
str.trimLeft();
3.1.4 🌰 举例
let str = ' a b cd ';
str.trimStart(); // 'a b cd '
str.trimLeft(); // 'a b cd '
3.2 String.prototype.trimEnd
3.2.1 定义
trimEnd()
方法用来删除字符串末尾的空白字符。 trimRight()
是它的别名
3.2.2 返回值
一个新的字符串,这个字符串右边的空格已经被去除了
3.2.3 语法
str.trimEnd()
str.trimRight()
3.2.4 举例
let str = ' a b cd ';
str.trimEnd(); // ' a b cd'
str.trimRight(); // ' a b cd'
四、Symbol.prototype.description
4.1 定义
description
是一个只读属性
4.2 返回值
它返回Symbol对象的可选描述的字符串
4.3 语法
Symbol('myDescription').description;
Symbol.iterator.description;
Symbol.for('foo').description;
4.4 举例
Symbol('foo').description; // 'foo'
Symbol().description; // undefined
Symbol.for('foo').description; // 'foo'
五、Optional catch binding
可选的捕获绑定,允许省略catch绑定和它后面的圆括号
以前的用法:
try {
} catch(err) {
console.log('err', err);
}
ES10 的用法:
try {
} catch {
}
六、JSON.stringify()
的增强力
JSON.stringify()
在 ES10 修复了对于一些超出范围的 Unicode 展示错误的问题,所以遇到 0xD800-0xDFF 之内的字符会因为无法编码成 UTF-8 进而导致显示错误。在 ES10 它会用转义字符的方式来处理这部分字符而非编码的方式,这样就会正常显示了。
JSON.stringify('😊'); // '"😊"'
七、修订 Function.prototype.toString()
以前的 toString 方法来自 Object.prototype.toString()
,现在 的 Function.prototype.toString()
方法返回一个表示当前函数源代码的字符串。以前只会返回这个函数,不会包含空格、注释等。
function foo() {
// es10新特性
console.log('imooc')
}
##### 数据结构与算法
这一块在笔试、面试的代码题中考核较多,其中常考的数据结构主要有:**数组、链表、队列、栈、Set、Map、哈希表等**,不同数据结构有不同的方法以及储存原理,这些算是技术岗的必备知识。**算法部分主要分为两大块,排序算法与一些其他算法题**。
**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**
排序算法根据考频高低主要有:快速排序、归并排序、堆排序、冒泡排序、插入排序、选择排序、希尔排序、桶排序、基数排序、Timsort这十种,这类考核点要么是算法的时间、空间复杂度、稳定度,要么是直接手写代码,故在理解算法原理的同时,对JS语言版的排序算法代码也要加强记忆。
- 二叉树层序遍历
- B 树的特性,B 树和 B+树的区别
- 尾递归
- 如何写一个大数阶乘?递归的方法会出现什么问题?
- 把多维数组变成一维数组的方法
- 知道的排序算法 说一下冒泡快排的原理
- Heap 排序方法的原理?复杂度?
- 几种常见的排序算法,手写
- 数组的去重,尽可能写出多个方法
- 如果有一个大的数组,都是整型,怎么找出最大的前 10 个数
- 知道数据结构里面的常见的数据结构
- 找出数组中第 k 大的数组出现多少次,比如数组【1,2, 4,4,3,5】第二大的数字是 4,出现两次,所以返回 2
- 合并两个有序数组
- 给一个数,去一个已经排好序的数组中寻找这个数的位 置(通过快速查找,二分查找)
![](https://img-blog.csdnimg.cn/img_convert/65f264ed08c220f97c2f040704793de5.webp?x-oss-process=image/format,png)
Object.prototype.toString()`,现在 的 `Function.prototype.toString()` 方法返回一个表示当前函数源代码的字符串。以前只会返回这个函数,不会包含空格、注释等。
function foo() {
// es10新特性
console.log(‘imooc’)
}
数据结构与算法
这一块在笔试、面试的代码题中考核较多,其中常考的数据结构主要有:数组、链表、队列、栈、Set、Map、哈希表等,不同数据结构有不同的方法以及储存原理,这些算是技术岗的必备知识。算法部分主要分为两大块,排序算法与一些其他算法题。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
排序算法根据考频高低主要有:快速排序、归并排序、堆排序、冒泡排序、插入排序、选择排序、希尔排序、桶排序、基数排序、Timsort这十种,这类考核点要么是算法的时间、空间复杂度、稳定度,要么是直接手写代码,故在理解算法原理的同时,对JS语言版的排序算法代码也要加强记忆。
- 二叉树层序遍历
- B 树的特性,B 树和 B+树的区别
- 尾递归
- 如何写一个大数阶乘?递归的方法会出现什么问题?
- 把多维数组变成一维数组的方法
- 知道的排序算法 说一下冒泡快排的原理
- Heap 排序方法的原理?复杂度?
- 几种常见的排序算法,手写
- 数组的去重,尽可能写出多个方法
- 如果有一个大的数组,都是整型,怎么找出最大的前 10 个数
- 知道数据结构里面的常见的数据结构
- 找出数组中第 k 大的数组出现多少次,比如数组【1,2, 4,4,3,5】第二大的数字是 4,出现两次,所以返回 2
- 合并两个有序数组
- 给一个数,去一个已经排好序的数组中寻找这个数的位 置(通过快速查找,二分查找)
[外链图片转存中…(img-CcaXGrYB-1715578292257)]