es6 学习笔记2
1、let
- 使用let声明一个变量,但是如果在变量声明之前就输出声明的变量,就会报错(
ReferenceError),
不过如果使用的是var的话,会输出undefined,这是因为在es6中不存在变量提升。
- 只要let存在的会计作用域,就会存在暂时性死区,就是这个变量绑定了这个区域,这个区域的这个变量不受外部的
的影响,即使外部声明了一个全局的变量。
如果let变量声明之前使用typeof的话,那么就会输出ReferenceError,但是如果之后没有声明的话,就会输出undefined
- let不允许相同作用域内,重复声明同一个变量,所以也不允许在函数内部声明参数,这样也会报错
- 块级作用域作用域是没有返回值的,如果想要得到块级作用域的内部值,可以将块级作用域之前加上do,把它变为do表达式,这样就可以得到整个块级作用域的返回值了
2、const
- 这是声明一个只读的变量,一旦声明之后就不能改变,不然会报错,所以也就意味着,一旦声明就必须立即初始化,不能留到之后再赋值。
- 但是const的作用域与let命令相同,只在声明所在的块级作用域内有效,而且变量也是不提升的,同样存在暂时性死区,只能在声明的位置后面使用,也不可以重复声明
3、变量
- 解构数组:解析赋值允许指定默认值,如果一个值有给他赋值默认值,然后他的数组成员严格等于undefined的时候,就会等于默认值
- 可以使用圆括号的情况只有一种:赋值语句的非模式部分,可以使用圆括号。即需要是赋值语句而不是声明语句
4、字符串的扩展
- 字符的Unicode表示法:这种表示法只限于码点在
\u0000~\uFFFF之间的字符,超出这个范围的字符,必须用两个双字节的形式表示,如果超出这个范围的就会显示一个空格 - codePointAt() :字符以UTF-16的格式储存,每个字符固定为
2个字节,用for...of循环,因为它会正确识别32位的UTF-16字符 ![]()
- String.fromCharCode(): 从码点返回对应的字符
- at(): 字符串实例的
at方法,可以识别 Unicode 编号大于0xFFFF的字符,返回正确的字符,因为原本js的charAt()只能返回UTF-16编码的第一个字符 - 传统上,JavaScript只有
indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中。ES6又提供了三种新方法。
(1)includes(): 返回布尔值,表示是否找到了参数字符串。
(2)startWidth(): 返回布尔值,表示参数字符串是否在原字符串的头部。
(3)endsWith(): 返回布尔值,表示参数字符串是否在原字符串的尾部。
PS:以上三种方法接收第二个参数,第二个参数candela是开始查找的位置
- repeat(): 返回一个新的字符串,表示将原字符串重复n次
,但是如果参数是-或者Infinity就会报错,如果是0到-1,就会等同于0,如果参数是NaN的话,就等同于0,如果参数是字符串就换转换成数字 - 补全长度:
padStart和padEnd一共接受两个参数,第一个参数用来指定字符串的最小长度,第二个参数是用来补全的字符串。如果原字符串的长度,等于或大于指定的最小长度,则返回原字符串。如果省略第二个参数的话,则默认空格补全- padStart() : 比如:“x”.padStart(5, "ab") 头部补全
- padEnd(): 尾部补全
- 模板字符串:
- 直接使用append(``); 这里面写要添加的dom,引入变量的话
- 可以直接使用`${name}`来嵌入变量,但是改变量需要是已经声明过的变量,否则会报错
- 如果需要用到反引号的话,就要多加一个\(反斜杠转义),让反引号原样输出
- 如果使用模板字符串表示多行字符串,所有的空格和缩进都会被保留在输出之中。如果你不想要这个换行,可以使用
trim方法消除它。$("").html(``.trim()); - 模板字符串之中还能调用函数, `hello ${fn()} world`
![]()
![]()
这章看的快吐了,暂时看不下去了,之后在继续看。。。
5、正则的扩展
- 点字符:在正则表达式中,可以替换任意单个字符,对于码点大于
0xFFFF的 Unicode 字符,点字符不能识别,必须加上u修饰符。比如:var s = '𠮷'; /^.$/u.test(s) - Unicode 字符:比如:
/\u{61}/u.test('a'),如果不加上u修饰符的话,正则表达式无法识别这种表示法,只会为这个匹配61个连续的u
- y修饰符:和g修饰符都是全局匹配,后一次匹配都是从上一次匹配成功的下一个位置开始,与g修饰符的不同在于g修饰符只要剩余位置中存在匹配就可,而y修饰符必须从剩余的第一个位置开始,这也就是粘连的含义。并且y字符会隐含头部的^,单单一个y修饰符只能返回第一个匹配,必须与g修饰符联用,才能返回所有匹配
- sticky属性:判断是否设置了y修饰符 比如:var r = /hello\d/y;
r.sticky
- source属性:
/abc/ig.source ==》 "abc"
- flags属性: /abc/ig.flags==》 "gi"
- dotAll模式:即点代表一切字符,就是正则表达式中含有.的就是处在doAll模式,re.doAll可以判断是否处在doAll模式
- 具名组匹配:组匹配的一个问题是,每一组的匹配含义不容易看出来,而且只能用数字序号引用,要是组的顺序变了,引用的时候就必须修改序号。“具名组匹配”: 允许为每一个组匹配指定一个名字,既便于阅读代码,又便于引用。
“具名组匹配”在圆括号内部,模式的头部添加“问号 + 尖括号 + 组名”(?<year>)
比如: 原本的:

如果使用具名组匹配的话:

- 具名组匹配以后,可以使用解构赋值直接从匹配结果上变为变量赋值

PS: 后行断言看不下去了,下次看。。。
6、数值
Number.isSafeInteger(): 用来判断一个整数是否落在这个范围(-2^53到2^53之间(不含两个端点))之内- Math.trunc() : 去除小数部分,返回整数,对于不是数字的,先将他转成整数,然后在去除小数部分,对于空值或者无法截取整数的值,返回NaN

- Math.sign(): 是用来判断一个数到底是正数还是负数,还是零,对于非数值,会先将其转换为数值。不是数值的返回NaN
7、函数
- 可以直接为函数置顶默认值。直接定义在参数的后面
- 设置默认值之后,函数的length属性,将返回没有设置没有设置默认值的参数个数,也就是说指定默认值之后,length属性将失真。而且设置的默认值不是尾参数的话,length只会统计设置默认值前面,没有设置默认值的参数个数
- 作用域:一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的。
- 如果将参数设置尾undefined的话,表明这个参数是可以省略的
- rest参数: 用于获取多余的参数,rest参数搭配的变量是一个数组,该变量江都欧的参数放入数组中,并且要注意的是rest参数之后不能再有其他的参数,否则会报错,并且函数的length属性,不包括rest参数
- 箭头函数有几个使用注意点。
(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
(4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
- this的指向固定化,并不是因为箭头函数内部有绑定this的机制,实际上是因为家头函数根本没有自己的this,导致内部的this就是外层代码块的this,正是因为他没有this,所以也不能用作构造函数
- 箭头函数可以绑定this对象,大大减少了显示绑定this对象的写法(call、apply、bind),但是箭头函数并不适用于所有的场所,函数绑定运算符是并排的两个冒号(::),双冒号左边是对象,右边是一个函数,该运算符会自动将左边的对象,作为上下文环境(即this对象),绑定到右边的函数上面。
- 尾调用:某个函数的最后一步操作是调用另一个函数
- 尾递归:尾递归只会存在一个调用帧,所以永远不会存在栈溢出的错误。
像FIbonacci改成尾递归的话

· PS; 这块关于递归的没看完,之后需要再看下。
8、数组
- 扩展运算符(...): 它好比是rest的逆运算,将数组转化成用逗号分割的参数序列,如果是单独拿出来用的话。
- 使用扩展运算符可以展开数组,搜易不需要在调用apply方法,将数组转化成函数的参数。
- 也可以用来合并运算符
- 如果将扩展运算符作为数组赋值的话,只能放在参数的最后一位,不然会报错
- 可以将字符串转成真正的数组
- 实现了Iterator接口的对象,将其转成真正的数组,不过只能对有部署Iterator接口的,对于那些没有部署 Iterator 接口的类似数组的对象,扩展运算符就无法将其转为真正的数组。
- Array.from():
- 类似数组的对象可以通过Array.from()转成真正的数组,任何有length属性的对象都可以通过Array.from转成数组,Array.from可以接受第二个参数,作用类似于数组的map,用来对每个元素进行处理,将处理后的值放入返回的数组
- Array.of() :
- 将一组值转成数组,这个方法是用来弥补Array()的不足
- 其中Array()没有参数、一个参数、三个参数时,返回的结果都不一样,当参数的个数不少于两个的时候,才可以有参数组成新的数组,只有一个的时候,实际上是指定数组的长度
- copyWidthin()
- 数组实例的
copyWithin方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说,使用这个方法,会修改当前数组。 -
它接受三个参数。这三个参数都应该是数值,如果不是,会自动转为数值。
- target(必需):从该位置开始替换数据。
- start(可选):从该位置开始读取数据,默认为0。如果为负值,表示倒数。
- end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示倒数。
- 数组实例的

- [].find(function(value,index,arr){})
- 用于找出符合第一个符合条件的数组成员,的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为
true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined。 - 该方法的回调函数可以接收三个参数,依次为当前的值、当前的位置、原数组
- 用于找出符合第一个符合条件的数组成员,的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为
- [].findIndex(function(value, index, arr){})
- 用法与
find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。
- 用法与
- fill()
- 使用给定值,填充一个数组,用于空数组的初始化非常方便,如果原数组中已经有元素的话,就会被替换掉
- fill()可以接受三个参数,第一个是要填充的给定值,第二个是填充的开始位置,第二个是填充的结束位置
- entries()、keys()、values()用来遍历数组
- 可以用
for...of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。如果不使用for ...of的话,可以手动调用遍历器对象的next方法进行遍历
- 可以用

- includes()
- 返回一个布尔值,表示某个数组是否包含给定的值,该方法的第二个参数表示搜索的起始位置,默认为
0。如果第二个参数为负数,则表示倒数的位置,如果这时它大于数组长度(比如第二个参数为-4,但数组长度为3),则会重置为从0开始。
- 返回一个布尔值,表示某个数组是否包含给定的值,该方法的第二个参数表示搜索的起始位置,默认为
9、对象
- Object.is(): 用来比较两个值是否相等,与严格相等的行为基本一致
- Object.assign():
- 用于对象的合并,将源对象的所有可枚举属性,复制到目标对象。如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
- 如果只有一个参数,
Object.assign会直接返回该参数。如果该参数不是对象,则会先转成对象,然后返回。 - 由于
undefined和null无法转成对象,所以如果它们作为参数,就会报错。如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过。这意味着,如果undefined和null不在首参数,就不会报错。 - 其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。但是,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果。
- 该方法实行的是浅拷贝,而不是深拷贝。
- 该方法也可以用来处理数组,但是会把数组视为对象


,但是如果参数是-或者Infinity就会报错,如果是0到-1,就会等同于0,如果参数是NaN的话,就等同于0,如果参数是字符串就换转换成数字

浙公网安备 33010602011771号