ES6笔记(一)

10 篇文章 11 订阅
5 篇文章 3 订阅

一、Let和Const

let声明变量,可变

const定义常量(实际指的是变量和的内存地址),不可变

只能在其声明或定义的代码块内有效

注:若区块中存在let或者const命令,则这个区块对这些变量和常量在一开始就行成封闭作用域,只要在声明之前使用就会报错(可能会出现暂时性死区)

不能重复声明,否则报错

块级作用域

闭包:JS中的变量是没有作用域时的一个临时解决方案

  • 块级作用域可以任意嵌套

  • 外层作用域不能访问内层作用域的变量

  • 内层作用域可以定义外层作用域的变量

    函数中的块级作用域

    es6中在块级作用域中可以声明函数

    函数声明的语句和let的行为类似,在块级作用域外不能访问

    函数声明也会提到块级作用域的头部

ES6声明变量的6种方式

  1. var
  2. function
  3. let
  4. const
  5. import
  6. 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:用于补全的字符串

注:

  • 若原字符串的长度等于或大于指定的最小长度,返回原字符串
  • 若用于补全的字符串与原字符串之和超出了指定的最小长度,则会截去超出位数的补全字符串
  • 如果省略了第二个参数,会用空格补全

模板字符串

``

  1. 可当做普通字符串使用
  2. 可定义多行字符串
  3. 可嵌套变量(需将变量写在${}中)
  4. 可调用函数
  5. 可嵌套模板字符串

String.raw():充当模板字符串的处理函数,返回一个反斜线都被转义的字符串,对应于替换变量后的模板字符串

​ 也可当正常的函数使用,第一个从参数应该是一个具有raw属性的对象(应该是一个数组)

四、正则的扩展

五、数值的扩展

ES6 中八进制要以前缀0o表示

Number.isFinite():检查一个数值是否为有限的

​ 参数:要检查的数值

Number.isNaN():用于检查一个数值是否为NaN

​ 参数:要检查的数值

Number.isInteger():判断一个数是否为整数

​ 参数:要检查的数值

Number.isSafeInteger():判断一个数是否搂在这个范围之内,返回布尔值

​ 参数:要检查的数值

Math对象的扩展

Math.trunc():用于除去一个数的小数部分,返回整数部分

  • 对于非数值,内部将其先转化为数值

  • 对于空值和无法返回的值,返回NaN

    ​ 参数:要检查的数值

Math.sign():判断一个数到底是正数,负数,还是0

参数有5中情况

  1. 参数为正数,返回+1
  2. 参数为负数,返回-1
  3. 参数为0,返回0
  4. 参数为-0,返回-0
  5. 其他值,返回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中均遵循属性遍历次序规则

  1. 首先遍历所有属性名为数值的属性,按照数字排序
  2. 其次遍历所有属性名为字符串的属性,按照生成时间排序
  3. 最后遍历所有属性名为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传导运算符

四种用法

  1. obj?.prop :读取对象属性
  2. obj?.[expr]:读取对象属性
  3. func.{…args}:函数或对象方法的调用
  4. new C ?.{…args}:构造函数的调用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值