SE6新特性
(1)let变量声明
1.变量声明不能重名
2.块级作用域
3.不存在变量提升
4.不影响作用域链
(2)const变量声明
1.声明时需要赋初值
2.一般声明常量时使用大写,且不可修改
3.块级作用域
4.对于数组和对象的修改由于未改变变量指向的地址,因此不算修改,不会报错
(3)变量的解构赋值
ES6 允许按照一定模式从数组和对象中提取值,对变量进行赋值。
1.数组:let A = ['1','2','3','4'] let [a,b,c,d] = A, console.log(a)
2.对象:let A = { .... } let {name,age} = A; 【let后接与A中的属性名相同即可】
(4)模版字符串``(英文模式下左上角第二行第一个)
特点:1.同样是字符串的一种
2.字符串中可以加上换行符
3.可以变量拼接${变量名}
(5)简写对象
当对象的key值和value值一样时,可以只写一个
例如: let name = '1234'; let A = {name:name 【原来的写法】 => name【简写是这样】}
函数可以省略:和function
(6)箭头函数 ()=>{ ... }
特点:
1.括号内可以携带参数。当只有一个参数时,可以省略括号
2.this的指向不会更改,即在声明时this指向谁,那么在使用时仍然会调用谁,不会被call更改
3.当{}内只有一句代码时,可以省略{},且这句代码的返回值被当做整个函数的返回值
(7)函数参数的默认值
1.允许对函数的形参赋初始值,如果未传入该形参的值则使用初始值,否则使用传入的值
2.可以和解构赋值结合使用
3.引入rest参数(...args),又被称为剩余参数,即将你未接收的参数都收集起来,书写时需要放在所有需要接收的形参之后【不清楚...的可以先看8】
(8)扩展运算符(...)
1.概念:扩展运算符能将数组转化为逗号分隔的参数序列,简单来说就是将数组结构解除,将其中的元素拿出来依次使用。
2.应用:
数组合并 const A = [...B,...C]【B和C都是数组】
数组克隆 const A = [...B] 浅拷贝
可以将伪数组转化为真正的数组
(9)基本数据类型symbol
1.特点:值唯一,用于解决命名冲突,如 A = Symbol('a') B = Symbol('a')此时A不等于B,如果使用 Symbol.for('')则相等
不能与其他数据类型进行运算
定义的对象属性不能使用for..in..遍历,需要使用Reflect.ownKeys来获取对象的所有键值
2.使用:向对象中添加属性或方法,不确定对象中原本有没有这个属性和方法时,可以使用Symbol,但是这时一定要使用Symbol.for('')来赋值
const A = { name : 'nihao', [Symbol.for('say')]: function(){ console.log("nihao!") } }
A[Symbol.for('say')]()
3.Symbol的内置值,共11个(暂时空着)
console.log(o instanceof Person) ;
(10)迭代器
用于遍历array、arguments、set、map等,获取到的是value值,而不是索引。
原理:
1.创建一个指针对象,使其指向当前数据结构的起点
2.第一次调用对象的next方法,此时指针会指向数据结构的第一个成员
3.不断的调用next方法,指针不断后移,直到指向最后一个成员
4.每次调用next方法都会包含一个value和done属性的对象
(11)生成器
写法:function * gen(){ ... }
调用:let A = gen() A.next()
yield:函数代码的分割符,每次调用next方法会执行到一个yield为止,且yield语句后面的会作为next方法的返回对象中value的值
next:next方法可以携带实参,传入的实参会作为yield语句的返回值
使用:因为是分段调用且需要用next方法‘激活’下一段代码,因此可以作为异步调用的实现区
(12)promise:异步编程的新的解决方案(内容很多,会写到新随笔中)
(13)set和map
1.属性:
size:返回元素个数
2.方法
add: 【set】
set:添加 【map】
get:获取 【map】
delete:删除
clear:清空
has:检测是否含有
3.可以使用扩展运算符(...)和(for.. of ..遍历)
(14)class
1.static关键词标注属性,即可在类的外部无需实例化对象调用。 static name = "123"
2.构造函数:class在实例化时调用的函数,作用是初始化变量 constructor(args【参数】){ ... }
子类构造函数:需要调用父类的构造函数,使用super函数。 constructor(args【参数】){ super(【参数】) ... }
3.继承:extands关键字,即子类继承父类的一切 class A extands B(){ .. }
4.方法重写:子类继承父类时,需要用到父类的函数,但功能不同时可以对原方法重写
5.getter和setter: 当在class外需要访问到使用private(私有)关键字修饰的属性时,需要使用get和set函数。 eg:get 【函数名】(){ .. }
(15)数值扩展
1.Number.EPSILON:javascript表示的最小精度,用于数值比较
2.进制:0b(2) 0o(8) 0x(16)
3.Number.isfinite:判断一个数是不是有限数
4.Number.isNaN:判断一个数是否是NaN
5.Number.parseInt / parseFloat :字符串转整数或浮点数
6.Number.isInteger:判断一个函数是否是整数
7.Math.trunc:将小数部分抹掉(同样的还有floor等)
8.Math.sign:判断一个数是正数、负数还是0
(16)对象方法扩展
1.Object.is:判断两个值是否相等,类似于===。Object.is(NaN,NaN) => true,NaN===NaN=> false
2.Object.assign:对象的合并 Object.assign(A,B)
3.Object.get/setPrototypeOf 获取或设置原型对象
(17)模块化
1.暴露,将一个模块中的js代码暴露出去供给其他模块的js代码使用,使用export
分别暴露:在需要暴露的变量/函数前添加export暴露即可 export name = "123"
集中暴露:正常书写模块中的js代码,在js文件的末尾将需要暴露的内容全部暴露。 export { .. . }
默认暴露:export default { ... }
2.引用:引入另一个模块中的js文件中的暴露变量/方法
普通写法:import * as A from ‘【文件位置】’ (注意,在正常的引入中A.name即可访问,但若采用的是默认暴露的形式则要用A.default.name)
解构赋值:import { .name.. } from '' (默认暴露:import { default as A } from '' )
简便写法(仅针对默认暴露):import A from ‘【文件位置】’