Javascript
-
Map和Set,Map和Object的区别分别是什么?
Map和Object
| Map | Object | |
|---|---|---|
| 键的类型 | 任意类型 | String、Symbol |
| 键的顺序 | 有序 | 有序,但是顺序不可靠 |
| 意外的健 | 没有 | 原型链上可能存在键与对象上的产生冲突 |
| 序列化与反序列化 | 需要通过replacer和reviver手动实现 | 通过JSON.stringify序列化,通过JSON.parse反序列化 |
| size | 可通过size属性直接获取 | 需要计算 |
| 迭代 | 支持,for...of | 不支持 |
| 性能 | 查找、删除有优化 | 无 |
Map和Set
| Map | Set | |
|---|---|---|
| 表示的内容 | 键值对 | 关键值的集合 |
| key、value值是否允许修改 | 可以修改value值,不可以修改key值 | 不可以 |
-
数组的filter、every、flat分别是做什么的?
| filter | 遍历数组并找出符合条件的值,组成新的数组返回 |
|---|---|
| every | 测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个布尔值。 |
| flat | 将多维数组扁平化成一维数组,并返回 |
-
es6有哪些新特性
-
默认参数
function link(height=50, width=100, color='red'){...}
-
模版对象
const introduce = `my name is ${firstName}${lastName}, I'm ${age} years old.`
-
解构赋值
function foo({id, name}){...}
const {id, name} = info
-
支持class类
-
新方法filter、map、Map、Set、WeakMap
-
async/await
-
let、const块级作用域
// 1.防止全局变量污染
// 2.函数声明更加规范
-
箭头函数
const foo = (arg) => {}
-
深入理解Promise
手写Promise: 手写Promise
-
箭头函数和普通函数的区别
| this指向 | 能否用于构造函数 | |
|---|---|---|
| 箭头函数 | 不能被改变,指向函数定义时的上下文 | 不能 |
| 普通函数 | 可以被改变,指向调用者,或者call、apply、bind指向的对象 | 能 |
-
let、var、const的区别,如果不希望const内部的对象被修改应该怎么做
| 作用域 | 能够被修改 | |
|---|---|---|
| let | 局部作用域 | 能 |
| var | 全局作用域 | 能 |
| const | 局部作用域 | 不能,但对象内部的属性可以被修改 |
使用Object.freeze()冻结对象,如果对象内部还有对象则需要递归冻结
-
堆、栈、队列的区别
| 在js中的描述 | 执行顺序 | 内存分配方式 | 内存泄漏 | |
|---|---|---|---|---|
| 栈stack | 函数调用形成了一个由若干帧组成的栈 | 先进后出 | 手动分配,大 | 容易引起内存泄漏 |
| 堆heap | 对象分配在堆中,堆用来表示一大块内存区域的计算机术语(内存存储单元)。可以用来随意的存储数据,数据销毁是由浏览器引擎的垃圾处理机制来处理 | 先进后出 | 自动分配,小 | 不会 |
| 队列 | 一个js运行时包含了一个待处理消息的队列,每一个消息都关联着一个与之相关的回调函数 | 先进先出 |
-
闭包
-
如何产生闭包
- 函数嵌套
- 外部函数返回内部函数
- 内部函数使用外部函数的变量
-
优点:
- 可以缓存数据
- 可以解决var不支持块级作用域的问题
-
缺点:
- 容易产生脏数据,造成内存泄漏
-
使用场景
for(var i=0; i<5; i++){
(
function(i){
setTimeout(()=>{
console.log(i)
})
}
)(i)
}
-
instanceof的实现原理
-
new实现原理
-
数据类型有哪些?如何判断一个数据是否是数组
- 数据类型:undefined、null、string、number、array、object、symbol
- 判断是否是数组:
// 1
function isArray(o){
return Object.prototype.toString.call(o)=='[object Array]';
}
// 2
Array.isArray(arr)
// 3
arr instanceof Array
-
说一下js的执行栈、调用栈
js自上而下执行,如果fn1引用了fn2,函数fn2引用了fn3,fn3引用了fn4,那么他们的执行顺序就是. fn1 -> fn2 -> fn3 -> fn4 -> fn3 -> fn2 -> fn1,这就满足了栈先进后出的原则
-
说一下js原型和原型链
- 原型:js的语言机制,可以理解为是对象的__proto__属性,或者prototype指向的对象
- 原型链:对象的__proto__或者prototype指向的逐级向上直到为null的链式路径。foo.proto === Foo.prototype