zoukankan      html  css  js  c++  java
  • 【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"
                           

          

       

  • 相关阅读:
    五子棋
    团队项目:五子棋
    101空降师506团2营E连全体成员
    团队作业七
    作业六
    团队作业(五)——旅游行业的手机App
    团队任务四(无图)
    团队作业三(补二)
    菜的抠脚团队正式成立
    团队作业七
  • 原文地址:https://www.cnblogs.com/websmile/p/11534588.html
Copyright © 2011-2022 走看看