ES6
模块
ES6 模块是编译时加载或者静态加载,即 ES6 可以在编译时就完成模块加载
// 抛出一个对象或者 function
export {a,b,c,d,f,a as bb}
export function() {}
export default function () {} // 如果不知道别人写的export 的名字这么办 用default
export default {} // export default命令的本质是将后面的值,赋给default变量
// 引用
import {a,b,f,bb} from './b.js'; //export 抛出什么名字就得用什么名字接
import {a as A} from './b.js'; // as 重命名 把 a 重命名 为 AA
import * as gg from './b.js'; // *星号 表示 export抛出的对象 通过gg.a 获取
import kk from './a.js'; //export default 返回的值 不需要{} 直接名字就好,允许你为它取任意名字
CommonJS
CommonJS规范主要用于服务端编程(Node采用 CommonJS 模块规范),加载模块是同步的,这并不适合在浏览器环境,因为同步意味着阻塞加载,浏览器资源是异步加载的,因此有了AMD CMD解决方案。
语法:(暴露模块module.exports = value或exports.xxx = value 引入模块:require(xxx))。
特点:
- 所有代码都运行在模块作用域,不会污染全局作用域。
- 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。
- 模块加载的顺序,按照其在代码中出现的顺序。加载模块是同步的,只有加载完成,才能执行后面的操作。
AMD CMD
AMD规范则是非同步加载模块,如果是浏览器环境,要从服务器端加载模块,这时就必须采用非同步模式,因此浏览器端一般采用AMD规范。CMD规范专门用于浏览器端,模块的加载是异步的,模块使用时才会加载执行。CMD规范整合了CommonJS和AMD规范的特点。
缺点: 繁琐
ES6 模块与 CommonJS 模块的差异
- ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。比如,CommonJS 模块就是对象,输入时必须查找对象属性。
- CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。
- CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。
Set 数据类型
Set 数据结构 类似数组 不同的是元素是唯一的,有has,add,keys、values、entries等方法和size属性
let k=new Set([1,2,3,4,2,3,"1"]);
console.log(k); //{1, 2, 3, 4, "1"} 除去了重复的 数字1和字符串1是不同的 最外面是大括号包着的 {}
let t=new Set("abcabd");
console.log(t); //{"a", "b", "c", "d"} //字符串也去重了
console.log([...t]) //...转数组 ["a", "b", "c", "d"]
Map 数据类型
和对象一样 ,键值对 ,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。 有set,get等方法
Symbol 数据类型
Symbol 是一种新的数据类型,表示独一无二的值。 不需要用 new ,可以通过参数来区别Symbol
let ss1=Symbol(); // 返回 Symbol()
let sss=Symbol("aa"); // 返回 Symbol('aa')
Object 对象
有keys,entries、values、assign
- keys 返回由对象key组成的数组
- values 返回由对象值组成的数组
- entries 返回二维数组 外层数组的元素是[key,value],var kk={a:1,b:2,c:3,d:4,}; Object.entries(kk) =》 [["a", 1],["b", 2],["c", 3],["d", 4]]
- assign 合并数组,属于浅拷贝;把后一项的值赋给前一项,前一项会改变,最终返回 合并后第一项的值
- ...扩展运算符 a =
//Object.fromEntries()方法是Object.entries()的逆操作,
var arr=[['foo', 'bar'],['baz', 42]]
console.log(Object.fromEntries(arr)); //{foo: "bar", baz: 42}
Object.prototype.hasOwnProperty.call(obj, key) // 返回boolean 判断key是否是实例obj上的属性
Array 数组
- Array.from方法用于将类似数组的对象和可遍历的对象转为真正的数组
- fill方法使用给定值,填充一个数组。会覆盖原来的值
- 数组也有entries,keys 和 values
- includes方法返回一个布尔值,表示某个数组是否包含给定的值
- flat()用于将嵌套的数组“拉平”
- forEach、filter、reduce、every、some、map。只有map不会跳过空元素,[,,undefined] 都不算 undefined
String
- 字符模板
${}
保留里面的空格换行, - str.repeat(2) 把str重复两遍
- str.padStart(2, 'a') 字符串长度不足2时,头部补a
- str.padEnd(2, 'a') 字符串长度不足2时,尾部补a
- str.slice(2,5) 开始下标,结束下标 返回新字符串
- str.substring(2,5) 以两个参数中较小一个作为起始位置,较大的参数作为结束位置。 返回新字符串
- str.substr(2,5) 以下标为2的元素开始 向后截取5个字符, 返回新字符串
箭头函数
箭头函数的存在的意义:1、简写的函数 2、改变this指向,
箭头函数的特点: 1、this是静态的,始终指向声明函数时的作用域;2、不能作为构造函数的实例化对象; 3、 不能使用arguments变量,但是可以使用 (...a)=> { a }//获取参数
Number
ES6 将全局方法parseInt()和parseFloat(),移植到Number对象上面,不是math对象' ES5的写法:parseInt('12.34');ES6的写法: Number.parseInt('12.34')
变量
- let声明的变量 不存在变量提升。所以 先声明 在使用
- let声明的变量 只在let命令所在的代码块内有效。
- 不允许在相同作用域内,使用let重复声明同一个变量。
- const声明一个只读的常量(不建议以后改变)、不可重复声明、在块级就能生效。const定义的引用类型只要指针不发生改变,其他的不论如何改变都是允许的,const仅保证指针不发生改变,const定义的如果是基本数据类型(string,number,boolean,null,undifined,symbol),定义后就不可再修改,如果修改,会报错。
解构
实际上,对象解构是把右边a对应的值赋给左边a对应的值的值,let { a: b } = { a:123 }; //右边a对应的123值赋给左边a对应的b的值
默认值
let [a,b = 99,c = 88,d = 77] = [,undefined,null,,1] // 只有 undefined 和 空才会被赋与默认值
let {x = 0,y = 1,z = 2,q = 3} ={x:null,y:undefined,q: ''} // 只有 undefined 和 空才会被赋与默认值, 空字符串都不行 q为''
解构就是声明变量, 已声明的这么办
let a;
let ob={};
({aa:a,bb:ob.b}={aa:"11",bb:{b:123}});