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,如果参数是字符串就换转换成数字
  • 补全长度:padStartpadEnd一共接受两个参数,第一个参数用来指定字符串的最小长度,第二个参数是用来补全的字符串。如果原字符串的长度,等于或大于指定的最小长度,则返回原字符串。如果省略第二个参数的话,则默认空格补全
    • 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^532^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会直接返回该参数。如果该参数不是对象,则会先转成对象,然后返回。
    • 由于undefinednull无法转成对象,所以如果它们作为参数,就会报错。如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过。这意味着,如果undefinednull不在首参数,就不会报错。
    • 其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。但是,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果。
    • 该方法实行的是浅拷贝,而不是深拷贝。
    • 该方法也可以用来处理数组,但是会把数组视为对象
posted @ 2017-08-23 11:48  逆光飞翔23  阅读(147)  评论(0)    收藏  举报