【全球新要闻】es6增强了哪些功能

时间:2022-11-21 15:50:24       来源:PHP中文网

本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。

ES6对原有的语法进行增强

1,解构赋值

es6允许按照一定的模式,从数组或对象中提取值,给变量进行赋值,称为解构赋值。


【资料图】

解构赋值在代码书写上简单易懂,语义清晰明了,方便对复杂对象中数据字段的获取。

在解构中,解构的源,位于解构赋值表达式的右边,而解构的目标,在解构表达式的左边。

(1),数组的解构赋值

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。

let [foo, [[bar], baz]] = [1, [[2], 3]];foo // 1bar // 2baz // 3let [ , , third] = ["foo", "bar", "baz"];third // "baz"let [x, , y] = [1, 2, 3];x // 1y // 3let [head, ...tail] = [1, 2, 3, 4];head // 1tail // [2, 3, 4]let [x, y, ...z] = ["a"];x // "a"y // undefinedz // []
登录后复制

本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。 解构不成功,值会等于undefined。另一种情况是不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组。这种情况下,解构依然可以成功。

对于 Set 结构,也可以使用数组的解构赋值。

let [x, y, z] = new Set(["a", "b", "c"]);x // "a"
登录后复制

解构赋值允许指定默认值。

let [foo = true] = [];foo // truelet [x, y = "b"] = ["a"]; // x="a", y="b"let [x, y = "b"] = ["a", undefined]; // x="a", y="b"let [x = 1] = [null];x // null
登录后复制

注意,ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效。如果一个数组成员是null,默认值就不会生效,因为null不严格等于undefined。

function f() {  console.log("aaa");}let [x = f()] = [1];
登录后复制

上面代码中,因为x能取到值,所以函数f根本不会执行。上面的代码其实等价于下面的代码。

(2),对象的解构赋值

对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

let { bar, foo } = { foo: "aaa", bar: "bbb" };foo // "aaa"bar // "bbb"let { baz } = { foo: "aaa", bar: "bbb" };baz // undefined
登录后复制

对象的解构赋值,可以很方便地将现有对象的方法,赋值到某个变量。

// 例一let { log, sin, cos } = Math;// 例二const { log } = console;log("hello") // hello
登录后复制

上面代码的例一将Math对象的对数、正弦、余弦三个方法,赋值到对应的变量上,使用起来就会方便很多。例二将console.log赋值到log变量。

let { foo: baz } = { foo: "aaa", bar: "bbb" };baz // "aaa"foo // error: foo is not defined
登录后复制

上面代码中,foo是匹配的模式,baz才是变量。真正被赋值的是变量baz,而不是模式foo。 对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。

与数组一样,解构也可以用于嵌套结构的对象。

let obj = {  p: [    "Hello",    { y: "World" }  ]};let { p: [x, { y }] } = obj;x // "Hello"y // "World"
登录后复制
默认值

对象的解构也可以指定默认值。

var {x = 3} = {x: undefined};x // 3var {x = 3} = {x: null};x // null
登录后复制

(3),字符串的解构赋值

类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。

let {length : len} = "hello";len // 5
登录后复制

(4)数值和布尔值的解构赋值

解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。

let {toString: s} = 123;s === Number.prototype.toString // truelet {toString: s} = true;s === Boolean.prototype.toString // true
登录后复制

(5),函数参数的解构赋值

function add([x, y]){  return x + y;}add([1, 2]); // 3
登录后复制

(6),用途

1)交换变量的值

let x = 1;let y = 2;[x, y] = [y, x];
登录后复制

2)从函数返回多个值 函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。

// 返回一个数组function example() {  return [1, 2, 3];}let [a, b, c] = example();// 返回一个对象function example() {  return {    foo: 1,    bar: 2  };}let { foo, bar } = example();
登录后复制

3)函数参数的定义 解构赋值可以方便地将一组参数与变量名对应起来。

// 参数是一组有次序的值function f([x, y, z]) { ... }f([1, 2, 3]);// 参数是一组无次序的值function f({x, y, z}) { ... }f({z: 3, y: 2, x: 1});
登录后复制

4)提取 JSON 数据 解构赋值对提取 JSON 对象中的数据,尤其有用。

let jsonData = {  id: 42,  status: "OK",  data: [867, 5309]};let { id, status, data: number } = jsonData;console.log(id, status, number);// 42, "OK", [867, 5309]
登录后复制

5)遍历 Map 结构 任何部署了 Iterator 接口的对象,都可以用for…of循环遍历。Map 结构原生支持 Iterator 接口,配合变量的解构赋值,获取键名和键值就非常方便。

const map = new Map();map.set("first", "hello");map.set("second", "world");for (let [key, value] of map) {  console.log(key + " is " + value);}// first is hello// second is world
登录后复制

如果只想获取键名,或者只想获取键值,可以写成下面这样。

// 获取键名for (let [key] of map) {  // ...}// 获取键值for (let [,value] of map) {  // ...}
登录后复制

2,字符串的增强

ES6 加强了对 Unicode 的支持,允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的 Unicode 码点。

"\uD842\uDFB7"// "?""\u20BB7"// " 7"
登录后复制

ES6 对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。

(1)字符串的遍历器接口

ES6 为字符串添加了遍历器接口,使得字符串可以被for…of循环遍历。

for (let codePoint of "foo") {  console.log(codePoint)}// "f"// "o"// "o"
登录后复制

(2)模板字符串

模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。

// 普通字符串`In JavaScript "\n" is a line-feed.`// 多行字符串`In JavaScript this is not legal.`console.log(`string text line 1string text line 2`);// 字符串中嵌入变量let name = "Bob", time = "today";`Hello ${name}, how are you ${time}?`
登录后复制

大括号内部可以放入任意的 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"
登录后复制

模板字符串之中还能调用函数。如果大括号中的值不是字符串,将按照一般的规则转为字符串。比如,大括号中是一个对象,将默认调用对象的toString方法。

function fn() {  return "Hello World";}`foo ${fn()} bar`// foo Hello World bar
登录后复制

字符串的新增方法

1,String.fromCodePoint() ES5 提供String.fromCharCode()方法,用于从 Unicode 码点返回对应字符,但是这个方法不能识别码点大于0xFFFF的字符。

2,String.raw() ES6 还为原生的 String 对象,提供了一个raw()方法。该方法返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串,往往用于模板字符串的处理方法。

String.raw`Hi\n${2+3}!`// 实际返回 "Hi\\n5!",显示的是转义后的结果 "Hi\n5!"String.raw`Hi\u000A!`;// 实际返回 "Hi\\u000A!",显示的是转义后的结果 "Hi\u000A!"
登录后复制

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

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

let s = "Hello world!";s.startsWith("Hello") // trues.endsWith("!") // trues.includes("o") // true
登录后复制

3,函数的增强

(1)标签模板

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

let a = 5;let b = 10;function tag(s, v1, v2) {  console.log(s[0]);  console.log(s[1]);  console.log(s[2]);  console.log(v1);  console.log(v2);  return "OK";}tag`Hello ${ a + b } world ${ a * b}`;// "Hello "// " world "// ""// 15// 50// "OK"
登录后复制

(2)函数参数增强:参数默认值

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

function log(x, y = "World") {  console.log(x, y);}log("Hello") // Hello Worldlog("Hello", "China") // Hello Chinalog("Hello", "") // Hello
登录后复制

(3)箭头函数的简化

箭头函数的this指向上级作用域

const name = "tony"    const person = {      name: "tom",      say: () => console.log(this.name),      sayHello: function () {        console.log(this.name)      },      sayHi: function () {        setTimeout(function () {          console.log(this.name)        }, 500)      },      asyncSay: function () {        setTimeout(()=>console.log(this.name), 500)      }    }    person.say()  //tony    person.sayHello() //tom    person.sayHi() //tony    person.asyncSay()  //tom
登录后复制

4.对象的扩展

属性的简洁表示法

ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。除了属性简写,方法也可以简写。

const foo = "bar";const baz = {foo};baz // {foo: "bar"}// 等同于const baz = {foo: foo};const o = {  method() {    return "Hello!";  }};// 等同于const o = {  method: function() {    return "Hello!";  }};
登录后复制

1、如果key与value变量名相同,省略:value 2、省略函数:function 3、计算属性:[Math.random()]

const bar = "bar"    const obj = {      bar,      fn () {        console.log("1111")      },      [Math.random()]: "123"    }    console.log(obj)
登录后复制

【推荐学习:javascript视频教程】

以上就是es6增强了哪些功能的详细内容,更多请关注php中文网其它相关文章!

关键词: 可以用来 原字符串