1. 变量的声明

    变量的声明和函数的声明会提升,会提升到块级作用域最顶上,代码块:{ },变量赋值不会。赋值前打印是undefine 不会报错。

    严格来讲,let 在 JavaScript 运行时中也会被提升,但由于“暂时性死区”(temporal dead zone)的 缘故,实际上不能在声明之前使用 let 变量。因此,从写 JavaScript 代码的角度说,let 的提升跟 var 是不一样的

    JavaScript引擎的⼯作⽅式是,先解析代码,获取所有被声明的变量,然后再⼀⾏⼀⾏地运⾏。这造成的结果,就是所有 的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)

  2. var、 let、 const

    alt

    const 可以声明一些函数方法数组对象

  3. 解构赋值

    数组的解构
    let arr = ['andy','lucy','lily','marc']
    
    const [a,b] = arr	// const a='andy';const b='lucy'	有多少个解构多少个
    const [a,b,,c] = arr	// const a='andy';const b='lucy';const c= 'marc';	会跳过第三个
    
    const [a,...b] = arr	//  const a='andy',const b = ['lucy','lily','marc'];	剩余的都给b
    
    对象的解构
    let obj = {name:'lucy',age:'25',gender:'female',data:{...}}
    
    const {name:name} = obj		//这个可以简写为 const {name} = obj
    const {name,age,gender} = obj
    
    const {data:res} = obj		//也可以解构赋值为其他名称,把data解构为res
    
    
  4. 展开运算符 ...

    数组的展开
    this.carsList = [...this.carsList];
    
    或者在函数传参的时候
    const fn = (a,b,...arr,c) =>{}	// 意思是将a,b,数组arr全部值和c,都作为参数传给fn
    
  5. 箭头函数

    const fn = () => {return ...};箭头函数的值就是返回的值

    箭头函数的特点:

    • 箭头函数没有自己的this,其箭头函数内部的this永远指向自己的上一层的this。没有就指向windows

    • 箭头函数中没有arguments;但有新的...args 获取函数接受到的所有实参 (this、arguments是普通函数两个隐藏的东西)

    • 不能作为构造函数调用.即,不能 new fn

    • 无法通过call、apply、bind指定函数的this

  6. JS模块化

    我们使用js一般需要引入js库。js库又是相互依赖的。

    模块化原因:有些js文件中的东西我们不想,也不必要暴露给其他调用者。其他调用者也只需要某个模块,不需要整个js文件。所以我们可以用import 和 export 来暴露js文件中我们想暴露出去的变量或方法。

  7. 类 类的this 类的继承 静态属性和方法(在变量和方法前加static即可用fn.方法,而不需要new fn出一个实例对象)

  8. 数组的方法

    • map(),通过一个数组返回一个新的数组,不改变原数组。
    const arr1 = [1,4,5,6,9]
    const arr2 = arr1.map((item,index,arr)=>{
    	item = item*2
        return item
    })
    
    arr2为 [2 8 10 12 18]
    
    • filter(), 将数组中符合条件的元素返回。需要一个函数(箭头函数)作为参数,会对数组中的每一个元素调用这个箭头函数,如果函数返回true,则钙元素会被放到新数组中,返回false就不会。

    
    const arr1 = [1,4,5,6,9]
    const arr2 = arr1.filter((item,index)=>{
          item%2 == 1
    })
    
    arr2为 [4 6] 
    
    • concat(),连接两个数组
    arr3=arr1.concat(arr2)
    



alt alt

贴图原文链接

  1. 谈谈模块化的 require 和 import
  • require是commonjs的规范,在node中实现的api,import是es的语法,由编译器处理。所以import可以做模块依赖的静态分析,配合webpack、rollup等可以做treeshaking。

  • commonjs导出的值会复制一份,require引入的是复制之后的值(引用类型只复制引用),es module导出的值是同一份(不包括export default),不管是基础类型还是应用类型。

  • 写法上有差别,import可以使用import * 引入全部的export,也可以使用import aaa, { bbb}的方式分别引入default和非default的export,相比require更灵活。

  • 问 require和import的区别就是问commonjs和es module的区别,这两者一个是api的规范,一个是语言的语法,所以后者可以做静态分析,基于这个实现treeshaking,同时es module会静态的绑定导出的值,而commonjs会复制一份。但两者都会做缓存,所以不会有循环引用问题。