前端学习整理系列一(javascript篇)

134 阅读3分钟

Javascript

  1. Map和Set,Map和Object的区别分别是什么?

Map和Object

MapObject
键的类型任意类型String、Symbol
键的顺序有序有序,但是顺序不可靠
意外的健没有原型链上可能存在键与对象上的产生冲突
序列化与反序列化需要通过replacer和reviver手动实现通过JSON.stringify序列化,通过JSON.parse反序列化
size可通过size属性直接获取需要计算
迭代支持,for...of不支持
性能查找、删除有优化

Map和Set

MapSet
表示的内容键值对关键值的集合
key、value值是否允许修改可以修改value值,不可以修改key值不可以
  1. 数组的filter、every、flat分别是做什么的?

filter遍历数组并找出符合条件的值,组成新的数组返回
every测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个布尔值。
flat将多维数组扁平化成一维数组,并返回
  1. es6有哪些新特性

  1. 默认参数

function link(height=50, width=100, color='red'){...}
  1. 模版对象

const introduce = `my name is ${firstName}${lastName}, I'm ${age} years old.`
  1. 解构赋值

function foo({id, name}){...}
const {id, name} = info
  1. 支持class类

  2. 新方法filter、map、Map、Set、WeakMap

  3. async/await

  4. let、const块级作用域

// 1.防止全局变量污染
// 2.函数声明更加规范
  1. 箭头函数

const foo = (arg) => {}
  1. 深入理解Promise

手写Promise: 手写Promise

  1. 箭头函数和普通函数的区别

this指向能否用于构造函数
箭头函数不能被改变,指向函数定义时的上下文不能
普通函数可以被改变,指向调用者,或者call、apply、bind指向的对象
  1. let、var、const的区别,如果不希望const内部的对象被修改应该怎么做

作用域能够被修改
let局部作用域
var全局作用域
const局部作用域不能,但对象内部的属性可以被修改

使用Object.freeze()冻结对象,如果对象内部还有对象则需要递归冻结

  1. 堆、栈、队列的区别

在js中的描述执行顺序内存分配方式内存泄漏
栈stack函数调用形成了一个由若干帧组成的栈先进后出手动分配,大容易引起内存泄漏
堆heap对象分配在堆中,堆用来表示一大块内存区域的计算机术语(内存存储单元)。可以用来随意的存储数据,数据销毁是由浏览器引擎的垃圾处理机制来处理先进后出自动分配,小不会
队列一个js运行时包含了一个待处理消息的队列,每一个消息都关联着一个与之相关的回调函数先进先出

  1. 闭包

  1. 如何产生闭包

    1. 函数嵌套
    2. 外部函数返回内部函数
    3. 内部函数使用外部函数的变量
  2. 优点:

    1. 可以缓存数据
    2. 可以解决var不支持块级作用域的问题
  3. 缺点:

    1. 容易产生脏数据,造成内存泄漏
  4. 使用场景

for(var i=0; i<5; i++){
    (
        function(i){
           setTimeout(()=>{
               console.log(i)
           })     
        }
    )(i)
}
  1. instanceof的实现原理

instanceof实现原理

  1. new实现原理

new实现原理

  1. 数据类型有哪些?如何判断一个数据是否是数组

  1. 数据类型:undefined、null、string、number、array、object、symbol
  2. 判断是否是数组:
// 1
function isArray(o){
    return Object.prototype.toString.call(o)=='[object Array]';
}
// 2
Array.isArray(arr)
// 3
arr instanceof Array
  1. 说一下js的执行栈、调用栈

js自上而下执行,如果fn1引用了fn2,函数fn2引用了fn3,fn3引用了fn4,那么他们的执行顺序就是. fn1 -> fn2 -> fn3 -> fn4 -> fn3 -> fn2 -> fn1,这就满足了栈先进后出的原则

  1. 说一下js原型和原型链

  1. 原型:js的语言机制,可以理解为是对象的__proto__属性,或者prototype指向的对象
  2. 原型链:对象的__proto__或者prototype指向的逐级向上直到为null的链式路径。foo.proto === Foo.prototype