您好,登錄后才能下訂單哦!
本篇內容介紹了“es6增強的功能有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
es6增強的功能:1、解構賦值,允許按照一定的模式,從數組或對象中提取值,給變量進行賦值。2、為字符串添加了遍歷器接口,使得字符串可以被"for…of循環遍歷。3、模板字符串,是增強版的字符串。4、標簽模板,是函數調用的一種特殊形式。5、為函數的參數設置默認值。6、箭頭函數的this指向上級作用域。7、允許在大括號里面,直接寫入變量和函數,作為對象的屬性和方法。
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"
解構賦值允許指定默認值。
注意,ES6 內部使用嚴格相等運算符(===),判斷一個位置是否有值。所以,只有當一個數組成員嚴格等于undefined,默認值才會生效。如果一個數組成員是null,默認值就不會生效,因為null不嚴格等于undefined。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
function f() {
console.log('aaa');
}
let [x = f()] = [1];
上面代碼中,因為x能取到值,所以函數f根本不會執行。上面的代碼其實等價于下面的代碼。
(2),對象的解構賦值
對象的解構與數組有一個重要的不同。數組的元素是按次序排列的,變量的取值由它的位置決定;而對象的屬性沒有次序,變量必須與屬性同名,才能取到正確的值。
對象的解構賦值,可以很方便地將現有對象的方法,賦值到某個變量。 上面代碼的例一將Math對象的對數、正弦、余弦三個方法,賦值到對應的變量上,使用起來就會方便很多。例二將console.log賦值到log變量。 上面代碼中,foo是匹配的模式,baz才是變量。真正被賦值的是變量baz,而不是模式foo。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
let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"
foo // error: foo is not defined
對象的解構賦值的內部機制,是先找到同名屬性,然后再賦給對應的變量。真正被賦值的是后者,而不是前者。
與數組一樣,解構也可以用于嵌套結構的對象。
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) {
// ...
}
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)是增強版的字符串,用反引號(`)標識。它可以當作普通字符串使用,也可以用來定義多行字符串,或者在字符串中嵌入變量。
大括號內部可以放入任意的 JavaScript 表達式,可以進行運算,以及引用對象屬性。 模板字符串之中還能調用函數。如果大括號中的值不是字符串,將按照一般的規則轉為字符串。比如,大括號中是一個對象,將默認調用對象的toString方法。// 普通字符串
`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}?`
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"
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()方法。該方法返回一個斜杠都被轉義(即斜杠前面再加一個斜杠)的字符串,往往用于模板字符串的處理方法。
3, 實例方法:includes(), startsWith(), endsWith()String.raw`Hi\n${2+3}!`
// 實際返回 "Hi\\n5!",顯示的是轉義后的結果 "Hi\n5!"
String.raw`Hi\u000A!`;
// 實際返回 "Hi\\u000A!",顯示的是轉義后的結果 "Hi\u000A!"
傳統上,JavaScript 只有indexOf方法,可以用來確定一個字符串是否包含在另一個字符串中。ES6 又提供了三種新方法。
includes():返回布爾值,表示是否找到了參數字符串。
startsWith():返回布爾值,表示參數字符串是否在原字符串的頭部。
endsWith():返回布爾值,表示參數字符串是否在原字符串的尾部。
let s = 'Hello world!';
s.startsWith('Hello') // true
s.endsWith('!') // true
s.includes('o') // true
(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
ES6 允許在大括號里面,直接寫入變量和函數,作為對象的屬性和方法。這樣的書寫更加簡潔。除了屬性簡寫,方法也可以簡寫。
1、如果key與value變量名相同,省略:valueconst foo = 'bar';
const baz = {foo};
baz // {foo: "bar"}
// 等同于
const baz = {foo: foo};
const o = {
method() {
return "Hello!";
}
};
// 等同于
const o = {
method: function() {
return "Hello!";
}
};
2、省略函數:function
3、計算屬性:[Math.random()]
const bar = 'bar'
const obj = {
bar,
fn () {
console.log('1111')
},
[Math.random()]: '123'
}
console.log(obj)
“es6增強的功能有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。