• ES6基础2


    1. 字符串的扩展
      1. 字符的Unicode表示法
        1. ES6使用大括号表示法表示字符
          1. "\u{20BB7}"
          2. // "𠮷"
          3. "\u{41}\u{42}\u{43}"
          4. // "ABC"
          5. let hello = 123;
          6. hell\u{6F} // 123
          7. '\u{1F680}' === '\uD83D\uDE80'
          8. // true
        2. JavaScript共有6种方法可以表示一个字符。个人感觉大括号表示法综合最好用。
          1. '\z' === 'z' // true
          2. '\172' === 'z' // true
          3. '\x7A' === 'z' // true
          4. '\u007A' === 'z' // true
          5. '\u{7A}' === 'z' // true
      2. at()
        1. ES5对字符串对象提供charAt方法,返回字符串给定位置的字符。该方法不能识别码点大于0xFFFF的字符。
          1. 'abc'.charAt(0) // "a"
          2. '𠮷'.charAt(0) // "\uD842"
        2. 目前,有一个提案,提出字符串实例的at方法,可以识别Unicode编号大于0xFFFF的字符,返回正确的字符。
          1. 'abc'.at(0) // "a"
          2. '𠮷'.at(0) // "𠮷"
      3. includes(), startsWith(), endsWith()
        1. 传统上,JavaScript只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中。ES6又提供了三种新方法。
        2. includes():返回布尔值,表示是否找到了参数字符串。用法和indexOf方法类似
        3. startsWith():返回布尔值,表示参数字符串是否在源字符串的头部。
        4. endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。
        5. 示例:
          1. var s = 'Hello world!';
          2. s.startsWith('Hello') // true
          3. s.endsWith('!') // true
          4. s.includes('o') // true
          5. var t = 'Hello world!';
          6. t.includes('Hello', 6) // false
          7. t.startsWith('world', 6) // true
          8. t.endsWith('Hello', 5) // true
        6. 注意(searchString, position)
          //startsWith和includes:从前向后position索引从0开始可以包括position处信息//endsWith:从前向后position索引从0开始不包括position处信息
      4. repeat()
        1. repeat方法返回一个新字符串,表示将原字符串重复n次。
          1. 'x'.repeat(3) // "xxx"
          2. 'hello'.repeat(2) // "hellohello"
          3. 'na'.repeat(0) // ""
        2. 参数如果是小数,会被取整。
          'na'.repeat(2.9) // "nana"
        3. 如果repeat的参数是负数或者Infinity,会报错。
          1. 'na'.repeat(Infinity)
          2. // RangeError
          3. 'na'.repeat(-1)
          4. // RangeError
        4. 但是,如果参数是0到-1之间的小数,则等同于0,这是因为会先进行取整运算。0到-1之间的小数,取整以后等于-0repeat视同为0。
          'na'.repeat(-0.9) // ""
        5. 参数NaN等同于0。
          'na'.repeat(NaN) // ""
        6. 如果repeat的参数是字符串,则会先转换成数字。

          1. 'na'.repeat('na') // ""
          2. 'na'.repeat('3') // "nanana"
      5. padStart(),padEnd()
        1. ES7推出了字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。padStart用于头部补全,padEnd用于尾部补全。
          1. 'x'.padStart(5, 'ab') // 'ababx'
          2. 'x'.padStart(4, 'ab') // 'abax'
          3. 'x'.padEnd(5, 'ab') // 'xabab'
          4. 'x'.padEnd(4, 'ab') // 'xaba'
        2. 上面代码中,padStartpadEnd一共接受两个参数,第一个参数用来指定字符串的最小长度,第二个参数是用来补全的字符串。如果原字符串的长度,等于或大于指定的最小长度,则返回原字符串。

          1. 'xxx'.padStart(2, 'ab') // 'xxx'
          2. 'xxx'.padEnd(2, 'ab') // 'xxx'
        3. 如果用来补全的字符串与原字符串,两者的长度之和超过了指定的最小长度,则会截去超出位数的补全字符串。

          1. 'abc'.padStart(10, '0123456789')
          2. // '0123456abc'
        4. 如果省略第二个参数,则会用空格补全长度。

          1. 'x'.padStart(4) // ' x'
          2. 'x'.padEnd(4) // 'x '
        5. padStart的常见用途是为数值补全指定位数。下面代码生成10位的数值字符串。

          1. '1'.padStart(10, '0') // "0000000001"
          2. '12'.padStart(10, '0') // "0000000012"
          3. '123456'.padStart(10, '0') // "0000123456"
        6. 另一个用途是提示字符串格式。

          1. '12'.padStart(10, 'YYYY-MM-DD') // "YYYY-MM-12"
          2. '09-12'.padStart(10, 'YYYY-MM-DD') // "YYYY-09-12"
      6. 模板字符串
        1. 模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。
          1. // 普通字符串
          2. `In JavaScript '\n' is a line-feed.`
          3. // 多行字符串
          4. `In JavaScript this is
          5. not legal.`
          6. console.log(`string text line 1
          7. string text line 2`);
          8. // 字符串中嵌入变量
          9. var name = "Bob", time = "today";
          10. `Hello ${name}, how are you ${time}?`
        2. 上面代码中的模板字符串,都是用反引号表示。如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。
          1. 义。
          2. var greeting = `\`Yo\` World!`;
        3. 模板字符串中嵌入变量,需要将变量名写在${}之中。
          1. function authorize(user, action) {
          2. if (!user.hasPrivilege(action)) {
          3. throw new Error(
          4. // 传统写法为
          5. // 'User '
          6. // + user.name
          7. // + ' is not authorized to do '
          8. // + action
          9. // + '.'
          10. `User ${user.name} is not authorized to do ${action}.`);
          11. }
          12. }

          大括号内部可以放入任意的JavaScript表达式,可以进行运算,以及引用对象属性。

          1. var x = 1;
          2. var y = 2;
          3. `${x} + ${y} = ${x + y}`
          4. // "1 + 2 = 3"
          5. `${x} + ${y * 2} = ${x + y * 2}`
          6. // "1 + 4 = 5"
          7. var obj = {x: 1, y: 2};
          8. `${obj.x + obj.y}`
          9. // 3

          模板字符串之中还能调用函数。

          1. function fn() {
          2. return "Hello World";
          3. }
          4. `foo ${fn()} bar`
          5. // foo Hello World bar

      7. String.raw()
        1. String.raw方法,往往用来充当模板字符串的处理函数,返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串,对应于替换变量后的模板字符串。
          1. String.raw`Hi\n${2+3}!`;
          2. // "Hi\\n5!"
          3. String.raw`Hi\u000A!`;
          4. // 'Hi\\u000A!'
        2. 如果原字符串的斜杠已经转义,那么String.raw不会做任何处理。
          1. String.raw`Hi\\n`
          2. // "Hi\\n"
    2. 数组的扩展
      1. Array.from()
        1. Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map)。
          1. let arrayLike = {
          2. '0': 'a',
          3. '1': 'b',
          4. '2': 'c',
          5. length: 3
          6. };
          7. // ES5的写法
          8. var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']
          9. // ES6的写法
          10. let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']

          实际应用中,常见的类似数组的对象是DOM操作返回的NodeList集合,以及函数内部的arguments对象。Array.from都可以将它们转为真正的数组。

          1. // NodeList对象
          2. let ps = document.querySelectorAll('p');
          3. Array.from(ps).forEach(function (p) {
          4. console.log(p);
          5. });
          6. // arguments对象
          7. function foo() {
          8. var args = Array.from(arguments);
          9. // ...
          10. }

          上面代码中,querySelectorAll方法返回的是一个类似数组的对象,只有将这个对象转为真正的数组,才能使用forEach方法。

        2. 只要是部署了Iterator接口的数据结构,Array.from都能将其转为数组。
          1. Array.from('hello')
          2. // ['h', 'e', 'l', 'l', 'o']
          3. let namesSet = new Set(['a', 'b'])
          4. Array.from(namesSet) // ['a', 'b']
        3. 扩展运算符(...)也可以将某些数据结构转为数组。(不全面)
          1. // arguments对象
          2. function foo() {
          3. var args = [...arguments];
          4. }
          5. // NodeList对象
          6. [...document.querySelectorAll('div')]

          扩展运算符背后调用的是遍历器接口Symbol.iterator),如果一个对象没有部署这个接口,就无法转换。Array.from方法则是还支持类似数组的对象。所谓类似数组的对象,本质特征只有一点,即必须有length属性。因此,任何有length属性的对象,都可以通过Array.from方法转为数组,而此时扩展运算符就无法转换。

        4. Array.from还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。
          1. Array.from(arrayLike, x => x * x);
          2. // 等同于
          3. Array.from(arrayLike).map(x => x * x);
          4. Array.from([1, 2, 3], (x) => x * x)
          5. // [1, 4, 9]
        5. Array.from()的另一个应用是,将字符串转为数组,然后返回字符串的长度。因为它能正确处理各种Unicode字符,可以避免JavaScript将大于\uFFFF的Unicode字符,算作两个字符的bug。
          1. function countSymbols(string) {
          2. return Array.from(string).length;
          3. }
      2. Array.of()
        1. Array.of方法用于将一组值,转换为数组。
          1. Array.of(3, 11, 8) // [3,11,8]
          2. Array.of(3) // [3]
          3. Array.of(3).length // 1

          这个方法的主要目的,是弥补数组构造函数Array()的不足。因为参数个数的不同,会导致Array()的行为有差异。

          1. Array() // []
          2. Array(3) // [, , ,]
          3. Array(3, 11, 8) // [3, 11, 8]

          上面代码中,Array方法没有参数一个参数三个参数时,返回结果都不一样。只有当参数个数不少于2个时,Array()才会返回由参数组成的新数组。参数个数只有一个时,实际上是指定数组的长度。

          Array.of基本上可以用来替代Array()new Array(),并且不存在由于参数不同而导致的重载。它的行为非常统一。

      3. copyWithin()
        1. 数组实例的copyWithin方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说,使用这个方法,会修改当前数组。
          Array.prototype.copyWithin(target, start = 0, end = this.length)

          它接受三个参数。

          1. target(必需):从该位置开始替换数据。

          2. start(可选):从该位置开始读取数据,默认为0。如果为负值,表示倒数。

          3. end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示倒数。

          4. 这三个参数都应该是数值,如果不是,会自动转为数值。

            1. [1, 2, 3, 4, 5].copyWithin(0, 3)
            2. // [4, 5, 3, 4, 5]

            上面代码表示将从3号位直到数组结束的成员(4和5),复制到从0号位开始的位置,结果覆盖了原来的1和2。下面是更多例子。

            1. // 将3号位复制到0号位
            2. [1, 2, 3, 4, 5].copyWithin(0, 3, 4)
            3. // [4, 2, 3, 4, 5]
            4. // -2相当于3号位,-1相当于4号位
            5. [1, 2, 3, 4, 5].copyWithin(0, -2, -1)
            6. // [4, 2, 3, 4, 5]
            7. // 将3号位复制到0号位
            8. [].copyWithin.call({length: 5, 3: 1}, 0, 3)
            9. // {0: 1, 3: 1, length: 5}
            10. // 将2号位到数组结束,复制到0号位
            11. var i32a = new Int32Array([1, 2, 3, 4, 5]);
            12. i32a.copyWithin(0, 2);
            13. // Int32Array [3, 4, 5, 4, 5]
            14. // 对于没有部署TypedArray的copyWithin方法的平台
            15. // 需要采用下面的写法
            16. [].copyWithin.call(new Int32Array([1, 2, 3, 4, 5]), 0, 3, 4);
            17. // Int32Array [4, 2, 3, 4, 5]
      4. find()和findIndex()
        1. 数组实例的find方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined
          1. [1, 5, 10, 15].find(function(value, index, arr) {
          2. return value > 9;
          3. }) // 10

          上面代码中,find方法的回调函数可以接受三个参数,依次为当前的值、当前的位置和原数组。

        2. 数组实例的findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1
          1. [1, 5, 10, 15].findIndex(function(value, index, arr) {
          2. return value > 9;
          3. }) // 2
      5. fill()
        1. fill方法使用给定值,填充一个数组。
          1. ['a', 'b', 'c'].fill(7)
          2. // [7, 7, 7]
          3. new Array(3).fill(7)
          4. // [7, 7, 7]

          上面代码表明,fill方法用于空数组的初始化非常方便。数组中已有的元素,会被全部抹去。

          fill方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置。

          1. ['a', 'b', 'c'].fill(7, 1, 2)
          2. // ['a', 7, 'c']
      6. entries(),keys()和values()
        1. ES6提供三个新的方法——entries()keys()values()——用于遍历数组。它们都返回一个遍历器对象(详见《Iterator》一章),可以用for...of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。
          1. for (let index of ['a', 'b'].keys()) {
          2. console.log(index);
          3. }
          4. // 0
          5. // 1
          6. for (let elem of ['a', 'b'].values()) {
          7. console.log(elem);
          8. }
          9. // 'a'
          10. // 'b'
          11. for (let [index, elem] of ['a', 'b'].entries()) {
          12. console.log(index, elem);
          13. }
          14. // 0 "a"
          15. // 1 "b"

      7. includes()
        1. Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。该方法属于ES7,但Babel转码器已经支持。
          1. [1, 2, 3].includes(2); // true
          2. [1, 2, 3].includes(4); // false
          3. [1, 2, NaN].includes(NaN); // true

          该方法的第二个参数表示搜索的起始位置,默认为0。如果第二个参数为负数,则表示倒数的位置,如果这时它大于数组长度(比如第二个参数为-4,但数组长度为3),则会重置为从0开始。

          1. [1, 2, 3].includes(3, 3); // false
          2. [1, 2, 3].includes(3, -1); // true

          没有该方法之前,我们通常使用数组的indexOf方法,检查是否包含某个值。indexOf方法有两个缺点,一是不够语义化,它的含义是找到参数值的第一个出现位置,所以要去比较是否不等于-1,表达起来不够直观。二是,它内部使用严格相当运算符(===)进行判断,这会导致对NaN的误判。

      8. 空位
        1. 由于空位的处理规则非常不统一,所以建议避免出现空位。
  • 相关阅读:
    C++位图,布隆过滤器
    跟我学c++中级篇——类型擦除
    什么是“缓存和数据库一致性“问题?
    区块链技术与应用 - 学习笔记1【引言】
    向日葵远程分辨率过低解决办法
    Spring-aop技术
    SAP ABAP基础语法-日期函数(九)
    Flink / Scala - 使用 Jedis、JedisPool 作为 Source 读取数据
    如何在并行安装中更改默认的SOLIDWORKS版本?| SOLIDWORKS教程
    Springboot+vue的人事管理系统(有报告),Javaee项目,springboot vue前后端分离项目。
  • 原文地址:https://blog.csdn.net/g841805/article/details/136607049