• 【ES6】阮一峰ES6学习(二)模板字符串、新增的字符串方法、函数扩展、rest参数、箭头函数


    模板字符串

    // 普通字符串
    `In JavaScript '\n' is a line-feed.`
    
    // 多行字符串
    `In JavaScript this is
     not legal.`
    
    console.log(`string text line 1
    string text line 2`);
    
    // 字符串中嵌入变量
    let name = "Bob", time = "today";
    `Hello ${name}, how are you ${time}?`
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    如果在模板字符串中需要使用反引号,则前面要用反斜杠转义

    let greeting = `\`Yo\` World!`;
    
    • 1

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

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

    字符串新增方法

    传统上,JavaScript 只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中。ES6 又提供了三种新方法。

    1. includes(), startsWith(), endsWith()
    • includes():返回布尔值,表示是否找到了参数字符串。
    • startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
    • endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。
    let s = 'Hello world!';
    
    s.startsWith('Hello') // true
    s.endsWith('!') // true
    s.includes('o') // true
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这三个方法都支持第二个参数,表示开始搜索的位置。

    let s = 'Hello world!';
    
    s.startsWith('world', 6) // true
    s.endsWith('Hello', 5) // true
    s.includes('Hello', 6) // false
    
    • 1
    • 2
    • 3
    • 4
    • 5

    上面代码表示,使用第二个参数n时,endsWith的行为与其他两个方法有所不同。它针对前n个字符,而其他两个方法针对从第n个位置直到字符串结束。

    1. repeat()

      repeat方法返回一个新字符串,表示将原字符串重复n次。

    'x'.repeat(3) // "xxx"
    'hello'.repeat(2) // "hellohello"
    'na'.repeat(0) // ""
    
    • 1
    • 2
    • 3

    参数如果是小数,会被取整。

    'na'.repeat(2.9) // "nana"
    
    • 1

    如果repeat的参数是字符串,则会先转换成数字。

    'na'.repeat('na') // ""
    'na'.repeat('3') // "nanana"
    
    • 1
    • 2
    1. padStart(),padEnd()

      padStart()用于头部补全,padEnd()用于尾部补全。

    	'x'.padStart(5, 'ab') // 'ababx'
    	'x'.padStart(4, 'ab') // 'abax'
    	
    	'x'.padEnd(5, 'ab') // 'xabab'
    	'x'.padEnd(4, 'ab') // 'xaba'
    
    • 1
    • 2
    • 3
    • 4
    • 5

    padStart()padEnd()一共接受两个参数,第一个参数是字符串补全生效的最大长度,第二个参数是用来补全的字符串。

    如果原字符串的长度,等于或大于最大长度,则字符串补全不生效,返回原字符串。

    'xxx'.padStart(2, 'ab') // 'xxx'
    'xxx'.padEnd(2, 'ab') // 'xxx'
    
    • 1
    • 2
    1. trimStart(),trimEnd()

    trimStart()消除字符串头部的空格,trimEnd()消除尾部的空格。它们返回的都是新字符串,不会修改原始字符串。

    const s = '  abc  ';
    
    s.trim() // "abc"
    s.trimStart() // "abc  "
    s.trimEnd() // "  abc"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. replaceAll()

    字符串的实例方法replace()只能替换第一个匹配。

    // replace()只将第一个b替换成了下划线。
    'aabbcc'.replace('b', '_')
    // 'aa_bcc'
    
    // 如果要替换所有的匹配,不得不使用正则表达式的g修饰符。
    'aabbcc'.replace(/b/g, '_')
    // 'aa__cc'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    'aabbcc'.replaceAll('b', '_')
    // 'aa__cc'
    
    • 1
    • 2

    BigInt 数据类型

    BigInt 只用来表示整数,没有位数的限制,任何位数的整数都可以精确表示。

    const a = 2172141653n;
    const b = 15346349309n;
    
    // BigInt 可以保持精度
    a * b // 33334444555566667777n
    
    // 普通整数无法保持精度
    Number(a) * Number(b) // 33334444555566670000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    为了与 Number 类型区别,BigInt 类型的数据必须添加后缀n

    1234 // 普通整数
    1234n // BigInt
    
    // BigInt 的运算
    1n + 2n // 3n
    
    • 1
    • 2
    • 3
    • 4
    • 5

    BigInt 与普通整数是两种值,它们之间并不相等。

    42n === 42 // false
    
    • 1

    typeof运算符对于 BigInt 类型的数据返回bigint

    typeof 123n // 'bigint'
    
    • 1

    函数的扩展

    1. 基础用法

      ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面。

    	function log(x, y = 'World') {
    	  console.log(x, y);
    	}
    	
    	log('Hello') // Hello World
    	log('Hello', 'China') // Hello China
    	log('Hello', '') // Hello
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    参数变量是默认声明的,所以不能用letconst再次声明。

    function foo(x = 5) {
      let x = 1; // error
      const x = 2; // error
    }
    
    • 1
    • 2
    • 3
    • 4

    rest参数

    ES6 引入 rest 参数(形式为...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest参数搭配的变量是一个数组,该变量将多余的参数放入数组中。

    function add(...values) {
      let sum = 0;
    
      for (var val of values) {
        sum += val;
      }
    
      return sum;
    }
    
    add(2, 5, 3) // 10
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    ES5里我们一般使用的是argument当作参数,arguments对象不是数组,而是一个类似数组的对象。所以为了使用数组的方法,必须使用Array.from先将其转为数组。rest 参数就不存在这个问题,它就是一个真正的数组,数组特有的方法都可以使用。

    下面是一个利用 rest 参数改写数组push方法的例子

    function push(array, ...items) {
      items.forEach(function(item) {
        array.push(item);
        console.log(item);
      });
    }
    
    var a = [];
    push(a, 1, 2, 3)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注意,rest 参数之后不能再有其他参数(即只能是最后一个参数),否则会报错。

    箭头函数

    1. 基本用法

      ES6 允许使用“箭头”(=>)定义函数。

    	var f = v => v;
    	
    	// 等同于
    	var f = function (v) {
    	  return v;
    	};
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分。

    var f = () => 5;
    // 等同于
    var f = function () { return 5 };
    
    var sum = (num1, num2) => num1 + num2;
    // 等同于
    var sum = function(num1, num2) {
      return num1 + num2;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。

    var sum = (num1, num2) => { return num1 + num2; }
    
    • 1

    箭头函数可以与变量解构结合使用。

    const full = ({ first, last }) => first + ' ' + last;
    
    // 等同于
    function full(person) {
      return person.first + ' ' + person.last;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    箭头函数使得表达更加简洁。

    const isEven = n => n % 2 === 0;
    const square = n => n * n;
    
    • 1
    • 2

    箭头函数的一个用处是简化回调函数。

    // 普通函数写法
    [1,2,3].map(function (x) {
      return x * x;
    });
    
    // 箭头函数写法
    [1,2,3].map(x => x * x);
    
    // 普通函数写法
    var result = values.sort(function (a, b) {
      return a - b;
    });
    
    // 箭头函数写法
    var result = values.sort((a, b) => a - b);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    rest 参数与箭头函数结合的例子。

    const numbers = (...nums) => nums;
    
    numbers(1, 2, 3, 4, 5)
    // [1,2,3,4,5]
    
    const headAndTail = (head, ...tail) => [head, tail];
    
    headAndTail(1, 2, 3, 4, 5)
    // [1,[2,3,4,5]]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注意:

    1. 箭头函数没有自己的this对象。(对于普通函数来说,内部的this指向函数运行时所在的对象,但是这一点对箭头函数不成立。它没有自己的this对象,内部的this就是定义时上层作用域中的this。也就是说,箭头函数内部的this指向是固定的,相比之下,普通函数的this指向是可变的。)
    2. 不可以当作构造函数,也就是说,不可以对箭头函数使用new命令,否则会抛出一个错误。(箭头函数根本没有自己的this,导致内部的this就是外层代码块的this。正是因为它没有this,所以也就不能用作构造函数。)
    3. 由于箭头函数没有自己的this,所以当然也就不能用call()apply()bind()这些方法去改变this的指向。
  • 相关阅读:
    3GPP R17空闲态省电特性
    Kafka关键点总结-消息的顺序性
    NVS 错误码对应的原因
    VM虚拟机克隆
    通信原理学习笔记1:模拟与数字通信系统、通信系统性能指标
    当图网络遇上计算机视觉!计算机视觉中基于图神经网络和图Transformer的方法和最新进展...
    java毕业设计颜如玉图书销售网站的设计与实现Mybatis+系统+数据库+调试部署
    python 安装使用 IntelliJ IDEA插件python
    【c++】刷题常用技巧
    使用C语言实现并查集
  • 原文地址:https://blog.csdn.net/Bon_nenul/article/details/128189891