-
变量的声明
变量的声明和函数的声明会提升,会提升到块级作用域最顶上,代码块:{ },变量赋值不会。赋值前打印是undefine 不会报错。
严格来讲,let 在 JavaScript 运行时中也会被提升,但由于“暂时性死区”(temporal dead zone)的 缘故,实际上不能在声明之前使用 let 变量。因此,从写 JavaScript 代码的角度说,let 的提升跟 var 是不一样的
JavaScript引擎的⼯作⽅式是,先解析代码,获取所有被声明的变量,然后再⼀⾏⼀⾏地运⾏。这造成的结果,就是所有 的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)
-
var、 let、 const
const 可以声明一些函数方法或数组对象
-
解构赋值
数组的解构 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
-
展开运算符 ...
数组的展开 this.carsList = [...this.carsList]; 或者在函数传参的时候 const fn = (a,b,...arr,c) =>{} // 意思是将a,b,数组arr全部值和c,都作为参数传给fn
-
箭头函数
const fn = () => {return ...};箭头函数的值就是返回的值
箭头函数的特点:
-
箭头函数没有自己的this,其箭头函数内部的this永远指向自己的上一层的this。没有就指向windows
-
箭头函数中没有arguments;但有新的...args 获取函数接受到的所有实参 (this、arguments是普通函数两个隐藏的东西)
-
不能作为构造函数调用.即,不能 new fn
-
无法通过call、apply、bind指定函数的this
-
-
JS模块化
我们使用js一般需要引入js库。js库又是相互依赖的。
模块化原因:有些js文件中的东西我们不想,也不必要暴露给其他调用者。其他调用者也只需要某个模块,不需要整个js文件。所以我们可以用import 和 export 来暴露js文件中我们想暴露出去的变量或方法。
-
类 类的this 类的继承 静态属性和方法(在变量和方法前加static即可用fn.方法,而不需要new fn出一个实例对象)
-
数组的方法
- 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)
- 谈谈模块化的 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会复制一份。但两者都会做缓存,所以不会有循环引用问题。