《ECMAScript6入门》读书笔记

第一章 let和const命令
  1. let的用法和var类似,但是所声明的变量只在let命令所在的代码块内有效。

    {
        let a = 10;
        var b = 1;
    }
    a //ReferenceError:a is not defined.
    b //1

    for循环中使用let定义计数变量i时,每一次循环的i其实都是一个新的变量,但是因为JavaScript引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。此外,for循环设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。

    for(let i = 0;i < 3;i++){
        let i = 'abc';
        console.log(i);
    }
    //abc
    //abc
    //abc
  2. var命令定义变量是会存在“变量提升”现象,即变量可以在声明之前使用,值为undefinedlet命令声明的变量一定要在声明后使用,否则报错。
  3. 在代码块内,使用let声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称TDZ)。
  4. let出现之后,typeof运算符不是百分之百安全了。在变量没有用let定义之前,都属于该变量的“死区”,使用该变量就会报错。但是,一个根本没有被声明的变量,使用typeof反而不会报错。

    typeof x; //ReferenceError
    let x;
    typeof y; //"undefined"
  5. let不允许在相同作用域内,重复声明同一个变量。不能再函数内部重新声明参数。

  6. ES5只有全局作用域和函数作用域,没有块级作用域。产生问题:内层变量可能会覆盖外层变量;用来计数的循环变量泄露为全局变量。
  7. ES6中,let为JavaScript增加了的块级作用域。ES6允许块级作用域的任意嵌套。外部作用域无法读取内层作用域的变量。内层作用域可以定义外层作用域的同名变量。
  8. ES6的块级作用域允许声明函数的规则,只在使用大括号的情况下成立,如果没有使用大括号,就会报错。
  9. const声明一个只读的变量,一旦声明,常量的值就不能改变。const一旦声明,就必须立即初始化,不能留到以后赋值。const的作用域与let命令相同:只在声明所在的块级作用域内有效。cosnt声明的变量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。同时不可重复声明。
  10. const保证的不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在指向的那个内存地址,因此等同于常量。但是对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。
  11. 顶层对象,在浏览器环境指的是window对象,在Node指的是global对象。ES5中,顶层对象的属性与全局变量是等价的。 从ES6开始,全局变量将逐步与顶层对象的属性脱钩。用var命令和function命令声明的全局变量,依旧是顶层对象的属性,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。
第二章、变量的解构赋值
  1. 解构(Destructuring):ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值。
  2. 本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。
  3. 解构不成功,变量的值就等于undefined
  4. 不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组。这种情况下,解构依然可以成功。

    let [x,y] = [1,2,3]
    x //1
    y //2   
  5. 在数组结构中,如果等号右边不是数组(严格地说,不是可遍历的结构),那么将会报错。事实上,只要某种数据结构具有Iterator接口,都可以采用数组形式的解构赋值。
  6. 解构赋值允许指定默认值。只有当一个数组成员严格等于(===)undefined,默认值才会生效。另外,null不严格等于undefined
  7. 如果默认值是一个表达式,那么这个表达式是惰性求值,即只有在用到的时候,才会求值。同时,默认值可以引用解构赋值的其他变量,但该变量必须已经声明。
  8. 解构不仅可以用于数组,还可以用于对象。两者最大的不同在于:数组的元素是按照次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正常的值。
  9. 如果变量名和属性名不一致,则必须写成这样:

    //foo为匹配模式,baz是变量,被赋值的是baz
    let {foo:baz} = {foo:'aaa',bar:'bbb'}
    baz //"aaa"

    对象的解构赋值内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。

  10. 解构可以用于嵌套结构的对象。下面的代码有三次解构赋值。只有line是变量,locstart都是模式,不是变量。

    const node = {
        loc:{
            start:{
                line:1,
                column:5
            }
        }
    };
    
    let {loc , loc:{start},loc:{start:{line}}} = node;
    line //1
    loc //Object{start:Object}
    start//Object{line:1 , column:5}
  11. 对象的解析也可以指定默认值,默认值生效的条件是,对象的属性值严格等于undefined
  12. 字符串可以解构,字符串被转换成了一个类似数组的对象。类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。
  13. 解构赋值时,如果等号右边是数值和布尔值,则先会转为对象。
  14. 解构赋值的规则:只要等号右边的值不是对象或数组,就先将其转为对象。由于undefinednull无法转为对象,所以对他们进行解构赋值,都会报错。
  15. 函数的参数也可以使用解构赋值。函数参数的解构也可以使用默认值。
  16. 不能使用圆括号的三种情况:
    - 变量声明语句
    - 函数参数
    - 赋值语句
  17. 可以使用圆括号的情况只有一种:赋值语句的非模式部分,可以使用圆括号。
  18. 变量解构赋值的用途:
    - 交换变量的值。
    - 从函数返回多个值
    - 函数参数的定义
    - 提取JSON数据
    - 函数参数的默认值
    - 遍历Map结构
    - 输入模块的指定方法
第三章、字符串的扩展
  1. JavaScript运行\uxxxx形式表示一个字符。xxxx表示字符的Unicode码点。但是,这种表示法只限于在\u0000~\uFFFF之间的字符。超过这个范围的字符必须使用双字节的形式表示。ES6中,将码点放入大括号中就能正确解读该字符。
  2. JavaScript的6中表示字符的方式:

    '\z' === 'z'  //true
    '\172' === 'z'  //true
    '\x7A' === 'z'  //true
    '\u007A' === 'z'  //true
    '\u{7A}' === 'z'   //true
  3. codePointAt方法能够正确处理4个字节存储的字符,返回第一个字符的码点。
  4. for ... of循环可以正确的识别32位的UTF-16字符。
  5. ES5提供String.fromCharCode方法,用于从码点返回对应字符,但是这个方法不能识别32位的UTF-16字符。ES6提供了String.fromCodePoint方法,可以识别大于0xFFFF的字符,弥补了String.fromCharCode不足,作用上正好与codePointAt方法相反。
  6. codePointAt方法定义在字符串的实例对象上,而fromCodePoint方法定义在String对象上。
  7. ES6为字符串添加了遍历器接口,使得字符串可以被for...of循环遍历。这个遍历器最大的优点是可以识别大于0xFFFF的码点。
  8. normalize()方法用来将不同的表示方法统一为相同的形式,这称为Unicode正规化。该方法可以接受一个参数来指定normalize的方式,参数的四个可选值如下。

    • NFC,默认参数,标准等价合成
    • NFD,标准等价分解
    • NFKC,兼容等价合成
    • NFKD,兼容等价分解
  9. 传统上,JavaScript只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中。ES6又提供了三种新方法。

    • includes():返回布尔值,表示是否找到了参数字符串。
    • startsWith():返回布尔值,表示参数字符串是否在原字符串的头部
    • endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。

    这三个方法都支持第二个参数,表示开始搜索的位置。使用第二个参数n时,endsWith的行为与其他两个方法有所不同,它针对前n个字符,而其他两个方法针对从第n个位置直到字符串结束。

  10. repeat方法返回一个新的字符串,表示将原字符串重复n次。参数如果是小数,会被取整。如果参数是负数或者Infinity,会报错。但是,参数如果是-1~0之间的小数,则等同于0,这是因为会先进行取整运算。-1~0之间的小数取整之后等于-0,参数NaN等同于0,参数是字符串则会先转换成数字。

  11. 字符串补全功能。padStart()用于头部补全,padEnd()用于尾部补全。两个参数,第一个指定字符串的最小长度,第二个参数是用来补全的字符串。
  12. 模板字符串(template string)是增强版的字符串,用反引号(`)标识。模板字符串中嵌入变量,需要将变量名写在${}之中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值