一、Let和Const
let声明变量,可变
const定义常量(实际指的是变量和的内存地址),不可变
只能在其声明或定义的代码块内有效
注:若区块中存在let或者const命令,则这个区块对这些变量和常量在一开始就行成封闭作用域,只要在声明之前使用就会报错(可能会出现暂时性死区)
不能重复声明,否则报错
块级作用域
闭包:JS中的变量是没有作用域时的一个临时解决方案
-
块级作用域可以任意嵌套
-
外层作用域不能访问内层作用域的变量
-
内层作用域可以定义外层作用域的变量
函数中的块级作用域
es6中在块级作用域中可以声明函数
函数声明的语句和let的行为类似,在块级作用域外不能访问
函数声明也会提到块级作用域的头部
ES6声明变量的6种方式
- var
- function
- let
- const
- import
- class
二、解构赋值
按照一定模式从数组和对象中提取值,然后赋值给变量
如果解构不成功,则变量的值为undefined
不完全解构:等号左边的模式值匹配一部分的等号右边的数组,仍然可以解构成功
解构赋值允指定默认值
默认值可以引起解构的其他变量,但是该变量必须已经声明
对象的解构赋值
数组的元素是按照次序排列的,变量的取值是按照他的位置决定的,而对象没有次序,变量必须与属性同名才能取到正确的值
对象的解构也可以指定默认值,默认值生效的条件是,对象的属性严格的等于undefined
如果解构失败,变量的值就等于undefined
如果解构的模式是嵌套的对象,而且子对象所在的父属性不存在,则会报错
不会复制继承自原对象的属性
字符串的解构赋值
字符串解构赋值时字符串被转换成了一个类似于数组的对象(类似于数组的对象还有一个length属性,也可对其赋值)
数值和布尔的解构赋值
解构赋值时,如果等号右边是数值或者布尔值,则会先转换成为对象,在进行赋值
解构的规则:只要等号的右边不是对象或者数组,都会先将其转换成对象(注:undefined和null无法转换成对象,对其进行赋值时都会报错)
函数的解构赋值
函数参数也可以进行解构,也可使用默认值
圆括号问题
变量声明语句,模式不能使用圆括号(eg:函数的参数)
赋值语句的非模式部分可以使用圆括号
三、字符串的扩展
JS允许使用 \uxxxx的形式表示一个字符,xxxx:字符的Unicode码点
在JS内部,字符以UTF-16的格式存储,每个字符固定为2个字节
codePointAt():能正确处理4个节点的字符,并返回一个字符的码点
参数:字符在字符串中的位置
String.fromCharCode():可以识别大于0xFFFF的字符
参数:大于0xFFFF的字符
at():可以识别Unicode编号大于0xFFFF的字符,返回正确的字符
参数:
normalize():将字符的不同表示方法表示为同样的形式
参数:可以接受一个参数来决定normalize的形式,有4个可选值
- NFC(默认参数):标准等价合成,指视觉和语义上的等价
- NFD:标准等价分解,在标准等价的前提下,返回合成字符分解出的多个简单字符
- NFKC:兼容等价合成,返回合成字符。兼容等价 指语义上等价,直觉上不等价
- NFKD:兼容等价分解:在兼容等价的前提下,返回合成字符分解出的多个简单字符
除indexOf()外来确定一个字符串中是否包含灵感字符串的3中方法
includes():返回布尔值,表是否找到了参数字符串
参数:要查找的字符串
starsWith():返回布尔值,表参数字符串是否在源字符串的头部
参数:要查找的字符串
endsWith():返回布尔值,表参数字符串是否在源字符串的尾部
参数:要查找的字符串
其他一些方法
repeat():返回一个字符串,表示将原字符串重复n次
参数:次数n
注:
- 参数是小数,会被取整
- 参数是负数或者Infinity,会报错
- 参数在0-1之间,则等同于0
- 参数为NaN,则等同于0
padStar():头部补全 而 padEnd():尾部补全
参数1:指定字符串的最小长度
参数2:用于补全的字符串
注:
- 若原字符串的长度等于或大于指定的最小长度,返回原字符串
- 若用于补全的字符串与原字符串之和超出了指定的最小长度,则会截去超出位数的补全字符串
- 如果省略了第二个参数,会用空格补全
模板字符串
``
- 可当做普通字符串使用
- 可定义多行字符串
- 可嵌套变量(需将变量写在${}中)
- 可调用函数
- 可嵌套模板字符串
String.raw():充当模板字符串的处理函数,返回一个反斜线都被转义的字符串,对应于替换变量后的模板字符串
也可当正常的函数使用,第一个从参数应该是一个具有raw属性的对象(应该是一个数组)
四、正则的扩展
五、数值的扩展
ES6 中八进制要以前缀0o表示
Number.isFinite():检查一个数值是否为有限的
参数:要检查的数值
Number.isNaN():用于检查一个数值是否为NaN
参数:要检查的数值
Number.isInteger():判断一个数是否为整数
参数:要检查的数值
Number.isSafeInteger():判断一个数是否搂在这个范围之内,返回布尔值
参数:要检查的数值
Math对象的扩展
Math.trunc():用于除去一个数的小数部分,返回整数部分
-
对于非数值,内部将其先转化为数值
-
对于空值和无法返回的值,返回NaN
参数:要检查的数值
Math.sign():判断一个数到底是正数,负数,还是0
参数有5中情况
- 参数为正数,返回+1
- 参数为负数,返回-1
- 参数为0,返回0
- 参数为-0,返回-0
- 其他值,返回NaN
注:对于非数值,会将其转换为数值
Math.cbrt():用于计算一个数的立方根(对于非数值,此案转换为数值)
Math.clz32():返回一个数的32位无符号整数形式有多少个前导0
参数:数值
- 对于小数,只考虑整数部分
- 对于空值和其他类型的值,先转换成为数值,在计算
Math.imul():返回两个数以32位带符号正数形式相乘的结果,返回的也是一个32位的带符号整数
Math.fround():返回一个数的单精度浮点数形式
Math.hypot():返回所有参数的平方和的平方根
- 若参数不是数值,会先转换成数值,在计算、
- 只要有一个参数无法转换为数值,就返回NaN
对数
Math.expm1(x):返回e的x次方-1
Math.log1p(x):返回ln(1+x),如果x小于-1,返回NaN
Math.log10(x):返回以10 为底x的对数,如果小于0,返回NaN
Math.log2(x):返回以2 为底x的对数,如果小于0,返回NaN
双曲函数
Math.sinh(x):返回x的双曲正弦
Math.cosh(x):返回x的双曲余弦
Math.tanh(x):返回x的双曲正切
Math.asinh(x):返回x的反双曲正弦
Math.acosh(x):返回x的反双曲余弦
Math.atanh(x):返回x的反双曲正切
Math.signbit():判断一个数的正负
- 参数是NaN,返回false
- 参数是-0,返回true
- 参数是负值,返回true
- 其他情况,返回false
integer数据类型
必须要以后缀n来表示
二进制、八进制、十六进制都要以后缀n来表示
注:
- 几乎所有的Number运算都能用在integer中,除>>>和求证运算符+
- Integer类型与Number类型不能混合运算,会报错
- 相等运算符(==)会改变数据类型,不能混合使用
- 精确相等运算符(===)不会改变数据类型,可以混合使用
六、函数的扩展
ES6允许为函数设置默认值,即直接写在参数定义的后面
使用参数默认值时,不能有同名的参数
注:参数默认值不是传值的,而是每次都重新计算默认值表达式的值(参数默认值是惰性求值)
通常情况下,定义了参数默认值的参数是函数的尾参数
有参数的默认值都是尾参数,除非显示输入undefined,如果传入的是undefined,将触发默认值,null不行
设置了默认值之后,或者默认值不是尾参数,函数的length不在计入后面的参数(length属性失真)
一旦设置了参数的默认值,函数在进行初始化的时候,参数会形成一个单独的作用域,等到初始化结束的时候,这个作用域消失(不设置参数默认值的时候不会出现)
利用参数默认值可以指定某一个参数不得省略,若省略则报错
可以将参数默认值设置为undefined,表示这个参可以省略
rest参数(形为“…变量名”),用于获取函数多余的参数
函数的name属性返回函数的函数名
箭头函数
ES6简明笔记中有
注:
- 箭头函数可以嵌套箭头函数
七、数组的扩展
扩展运算符 ( . . . )
主要用于函数调用
扩展运算符 后可以放表达式
如果扩展运算符后面是一个空数组,则不产生任何效果
可以合并数组
可以与结构赋值结合起来生成数组
若扩展运算符用于数组,只能放在参数的最后一位,否则报错
可以将字符串转为真正的数组
Array.from():将伪数组(两类对象:类似于数组的对象)转换为真正的数组
Array.of(一组值):将一组数转换为数组,若没有参数,则返回空数组
copyWithin():在当前数组内部将指定位置的成员复制到其他地方,然后返回数组(会修改数组)
接受3个参数
- target(必选):从该位置开始替换数据
- start(可选):从该位置开始读取数据,默认值为0,如果为负数,表示倒数
- end(可选):到该位置停止读取数据,默认等于数组长度,若为负,表示倒数
fill():用于填充数组
参数1(必填):用于填充的给定值
参数2(可选):填充的起始位置
参数3(可选):填充的结束位置
entries()、keys()、value()用于遍历数组
entries():对键值对的遍历
keys():对键名的遍历
values():对键值的遍历
includes():表示某个数组是否包含给定的值,返回一个布尔值
参数1:给定值
参数2:搜索的起始位置,默认为0,若为负数,则表示倒数的位置,如果这时大于数组长度,则会重置为从0开始
数组的空位
数组的空位值数组的某一个位置没有任何值(空值不是undefined)
Array.from()会将数组的空位转换成为undefined
扩展运算符也会将空位转为undefined
copyWithin()会将空位一起复制
fill() 会将空位视为数组正常的位置
八、对象的扩展
ES6允许直接写入变量和函数作为对象的属性和方法
在对象中可只写属性名,不写属性值
可直接用标识符作为属性名,也可将表达式放在方括号内作为属性名(字面量定义)
Object.is():比较两个值是否严格相等,与严格相等运算符(===)的行为基本一致(注:有两个不同之处1:+0不等于-0、2:NaN等于自身)
Object.assign():将源对象的所有可枚举属性复制到目标对象
第一个参数是目标对象,后面的参数是源对象
注:
- 只有一个参数,会返回改参数
- 若改参数不是对象,会先转换为对象,然后返回
- 由于undefined和null无法转换为对象,所以人工将它们作为参数就会报错
- 其他类似的值(数值、布尔)不在首参也不会报错,但是除了字符串会议数组的形式复制到目标对象,其他值都不会产生效果
- Object.assign()是浅复制(即源对象的某个属性的值是对象,name目标对象复制得到的是这个对象的引用)
对象的可枚举性
for…in循环:只遍历对象自身和继承的可枚举属性
Object.keys():返回对象自身的所有可枚举属性的键名
JSON.Stringify():只串化对象自身的可枚举属性
Object.assign():将源对象的所有可枚举属性复制到目标对象
注:所有class的原型的方法时不可枚举的
属性的遍历
for…in:循环遍历对象自身和继承的可枚举属性(不包含Symbol属性)
Object.keys(obj):返回一个数组,包含对象自身的(不含继承的)所有可枚举属性(不包含symbol属性)
Object.getOwnPropertyNames(obj):返回一个数组,包含对象自身的所有属性(不含Symbol,但是含有不可枚举属性)
Object.getOwnPropertySymbols(obj):返回一个数组,包含对象自身的所有Symbol属性
Reflect.ownKeys(obj):返回一个数组,包含对象自身的所有属性,不管属性名是Symbol还是字符串,也不管是否可枚举
以上5中均遵循属性遍历次序规则
- 首先遍历所有属性名为数值的属性,按照数字排序
- 其次遍历所有属性名为字符串的属性,按照生成时间排序
- 最后遍历所有属性名为Symbol的属性,按照生成时间排序
_ _ proto _ _属性
用于读取或者设置当前对象的prototype属性
缺点:兼容性和语义都不是很好
ES6使以下三种替换它
Object.setPrototypeOf(obj):用来设置一个对象的prototype属性,返回参数对象本身
参数:第一个参数若不是对象,则会自动转化为对象(undefined和null时会报错)
Object.getPrototypeOf():用于读取一个对象的prototype属性
参数:参数若不是对象,则会自动转化为对象(undefined和null时会报错)
Object.reate():生成对象
对象的解构赋值和扩展运算符混用
对象的解构赋值会将所有的键值对都复制到新的对象上面
解构赋值必须是最后一个参数,否则会报错
解构赋值不会复制继承自原型对象的属性
扩展运算符可用于合并两个对象
若自定义的属性放在扩展运算符后面,则扩展运算符内部有同名属性会被覆盖
若把自定义属性放在扩展云苏菲前面,则变成了设置新对象的默认属性
若扩展运算符的参数是undefined或者null,则这两个值会被忽略,不会报错
若扩展运算符的参数对象之中有取值函数get,则这个函数会被执行
Object.getOwnPropertyDescriptors(obj)
Object.getOwnPropertyDescriptor(obj):用于返回某个对象属性的描述对象
Object.getOwnPropertyDescriptors(obj):返回指定对象所有自身属性(非继承属性)的描述对象
主要是为了解决Object.assign()无法正确复制get属性和set属性
Null传导运算符
四种用法
- obj?.prop :读取对象属性
- obj?.[expr]:读取对象属性
- func.{…args}:函数或对象方法的调用
- new C ?.{…args}:构造函数的调用