首頁 >web前端 >前端問答 >es6增強了哪些功能

es6增強了哪些功能

青灯夜游
青灯夜游原創
2022-11-21 15:36:393778瀏覽

es6增強的功能:1、解構賦值,允許依照一定的模式,從陣列或物件中提取值,並賦予變數賦值。 2.為字串添加了遍歷器接口,使得字串可以被"for…of循環遍歷。3、模板字串,是增強版的字串。4、標籤模板,是函數呼叫的一種特殊形式。 5.為函數的參數設定預設值。6、箭頭函數的this指向上級作用域。7、允許在大括號裡面,直接寫入變數和函數,作為物件的屬性和方法。

es6增強了哪些功能

本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

ES6對原有的語法進行增強


  • ##1,解構賦值

es6允許依照一定的模式,從陣列或物件中提取值,給變數賦值,稱為解構賦值。解構賦值在程式碼書寫上簡單易懂,語義清晰明了,方便對複雜物件中資料欄位的取得。


# #在解構中,解構的源,位於解構賦值表達式的右邊,而解構的目標,在解構表達式的左邊。

(1),數組的解構賦值

ES6 允許按照一定模式,從數組和物件中提取值,對變數進行賦值,稱為解構。

let [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1
bar // 2
baz // 3

let [ , , third] = ["foo", "bar", "baz"];
third // "baz"

let [x, , y] = [1, 2, 3];
x // 1
y // 3

let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]

let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []

本質上,這種寫法屬於“模式匹配”,只要等號兩邊的模式相同,左邊的變數就會被賦予對應的值。 解構不成功,值會等於undefined。另一種情況是不完全解構,即等號左邊的模式,只符合一部分的等號右邊的陣列。這種情況下,解構依然可以成功。對於Set 結構,也可以使用陣列的解構賦值。

let [x, y, z] = new Set(['a', 'b', 'c']);
x // "a"

#解構賦值允許指定預設值。

let [foo = true] = [];
foo // true
let [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 // 3

var {x = 3} = {x: null};
x // null
############(3),字串的解構賦值#########類似陣列的物件都有一個length屬性,因此還可以對這個屬性解構賦值。 ###
let {length : len} = 'hello';
len // 5
############(4)數值和布林值的解構賦值#########解構賦值時,如果等號右邊是數值和布林值,則會先轉為對象。 ###
let {toString: s} = 123;
s === Number.prototype.toString // true

let {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 1
string 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') // true
s.endsWith('!') // true
s.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 World
log('Hello', 'China') // Hello China
log('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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn