es6增強的功能:1、解構賦值,允許依照一定的模式,從陣列或物件中提取值,並賦予變數賦值。 2.為字串添加了遍歷器接口,使得字串可以被"for…of循環遍歷。3、模板字串,是增強版的字串。4、標籤模板,是函數呼叫的一種特殊形式。 5.為函數的參數設定預設值。6、箭頭函數的this指向上級作用域。7、允許在大括號裡面,直接寫入變數和函數,作為物件的屬性和方法。
本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。
es6允許依照一定的模式,從陣列或物件中提取值,給變數賦值,稱為解構賦值。解構賦值在程式碼書寫上簡單易懂,語義清晰明了,方便對複雜物件中資料欄位的取得。
# #在解構中,解構的源,位於解構賦值表達式的右邊,而解構的目標,在解構表達式的左邊。
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 对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。
ES6 为字符串添加了遍历器接口,使得字符串可以被for…of循环遍历。
for (let codePoint of 'foo') { console.log(codePoint) } // "f" // "o" // "o"
模板字符串(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
(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"
ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面。
function log(x, y = 'World') { console.log(x, y); } log('Hello') // Hello World log('Hello', 'China') // Hello China log('Hello', '') // Hello
箭头函数的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 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。除了属性简写,方法也可以简写。
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中文網其他相關文章!