【ES6 】ES6 字符串扩展及新增方法

模板字符串

  • 传统写法
    var str = 'There are <b>' + basket.count + '</b> ' +
      'items in your basket, ' +
      '<em>' + basket.onSale +
      '</em> are on sale!'

    ES6写法

  • let  str = ` There are <b>${basket.count}</b> items
       in your basket, <em>${basket.onSale}</em>
      are on sale!`

    注意:模板字符串中的换行和空格都是会被保留的
    变量名写在 ${} 中,${} 中可以放入 JavaScript 表达式。

标签模板

  模板字符串的功能,不仅仅是上面这些。它可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。这被称为“标签模板”功能(tagged template)。

    • 模板字符串中没有变量

      alert`123`
      // 等同于
      alert(123)

      标签模板其实不是模板,而是函数调用的一种特殊形式。“标签”指的就是函数,紧跟在后面的模板字符串就是它的参数。

    • 模板字符串中含有变量
      let a = 5;
      let b = 10;
      
      tag`Hello ${ a + b } world ${ a * b }`;
      // 等同于
      tag(['Hello ', ' world ', ''], 15, 50);

      如果模板字符里面有变量,就不是简单的调用了,而是会将模板字符串先处理成多个参数,再调用函数。上面代码中,

                          模板字符串前面有一个标识名tag,它是一个函数。整个表达式的返回值,就是tag函数处理模板字符串后的返回值。

                         tag函数的第一个参数是一个数组,该数组的成员是模板字符串中那些没有变量替换的部分,

                          也就是说,变量替换只发生在数组的第一个成员与第二个成员之间、第二个成员与第三个成员之间,以此类推。

                         tag函数的其他参数,都是模板字符串各个变量被替换后的值。由于本例中,模板字符串含有两个变量,因此tag会接受到value1value2两个参数。

                       tag函数所有参数的实际值如下。

      • 第一个参数:['Hello ', ' world ', '']
      • 第二个参数: 15
      • 第三个参数:50

                      也就是说,tag函数实际上以下面的形式调用。

    • demo2
      function f(stringArr,...values){
       let result = "";
       for(let i=0;i<stringArr.length;i++){
        result += stringArr[i];
        if(values[i]){
         result += values[i];
              }
          }
       return result;
      }
      let name = 'Mike';
      let age = 27;
      f`My Name is ${name},I am ${age+1} years old next year.`;
      // "My Name is Mike,I am 28 years old next year."
       
      f`My Name is ${name},I am ${age+1} years old next year.`;
      // 等价于
      f(['My Name is',',I am ',' years old next year.'],'Mike',28); 

方法

  • 子串的识别

    ES6 之前判断字符串是否包含子串,用 indexOf 方法,ES6 新增了子串的识别方法。

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

    以上三个方法都可以接受两个参数,需要搜索的字符串,和可选的搜索起始位置索引。

    let string = "apple,banana,orange";
    string.includes("banana");     // true
    string.startsWith("apple");    // true
    string.endsWith("apple");      // false
    string.startsWith("banana",6)  // true

    注意点:

    • 这三个方法只返回布尔值,如果需要知道子串的位置,还是得用 indexOf 和 lastIndexOf 。
    • 这三个方法如果传入了正则表达式而不是字符串,会抛出错误。而 indexOf 和 lastIndexOf 这两个方法,它们会将正则表达式转换为字符串并搜索它。
  • 字符串重复

    repeat():返回新的字符串,表示将字符串重复指定次数返回。 
    • 1.参数如果是小数,会被向下取整。
      'na'.repeat(2.9) // "nana"
    • 如果参数是 0 到-1 之间的小数,则等同于 0,这是因为会先进行取整运算。0 到-1 之间的小数,取整以后等于-0repeat视同为 0。
      'na'.repeat(-0.9) // ""
    • 如果参数是 NaN,等同于 repeat 零次
      'na'.repeat(NaN) // ""
    • 如果参数是负数或者 Infinity ,会报错:
      'na'.repeat(Infinity)
      // RangeError
      'na'.repeat(-1)
      // RangeError
    • 如果repeat的参数是字符串,则会先转换成数字。
      'na'.repeat('na') // ""
      'na'.repeat('3') // "nanana"
  • 字符串补全 

    • padStart:返回新的字符串,表示用参数字符串从头部(左侧)补全原字符串。
    • padEnd:返回新的字符串,表示用参数字符串从尾部(右侧)补全原字符串。

      以上两个方法接受两个参数,
          第一个参数是指定生成的字符串的最小长度,
          第二个参数是用来补全的字符串。如果没有指定第二个参数,默认用空格填充。

      • 正常用法
        console.log("h".padStart(5,"o"));  // "ooooh"
        console.log("h".padEnd(5,"o"));    // "hoooo"
        console.log("h".padStart(5));      // "    h"
      • 如果指定的长度小于或者等于原字符串的长度,则返回原字符串:
        console.log("hello".padStart(5,"A"));  // "hello"
      • 如果原字符串加上补全字符串长度大于指定长度,则截去超出位数的补全字符串:
        console.log("hello".padEnd(10,",world!"));  // "hello,worl"
      • 常见用途
        • 为数值补全指定位数下面代码生成 10 位的数值字符串。
          '1'.padStart(10, '0') // "0000000001"
          '12'.padStart(10, '0') // "0000000012"
          '123456'.padStart(10, '0') // "0000123456"
        • 提示字符串格式
          '12'.padStart(10, 'YYYY-MM-DD') // "YYYY-MM-12"
          '09-12'.padStart(10, 'YYYY-MM-DD') // "YYYY-09-12"