ES6 引入了一種新的原始數據類型 Symbol ,表示獨一無二的值,最大的用法是用來定義對象的惟一屬性名。正則表達式
a = Symbol('sss')
b = Symbol('sss')
a === b //false
複製代碼
返回由給定的 key 找到的 symbol,不然就是返回新建立的 symbol。數組
Symbol.keyFor() 返回一個已登記的 Symbol 類型值的 key。安全
let sym = Symbol.for("foo")
Symbol.keyFor(sym) // "foo"
複製代碼
ES6 引入了四種新的原始數據結構。bash
ES6 提供了新的數據結構 Set。它相似於數組,可是成員的值都是惟一的,沒有重複的值。數據結構
首先,WeakSet 的成員只能是對象,而不能是其餘類型的值。app
其次,WeakSet 中的對象都是弱引用,即垃圾回收機制不考慮WeakSet對該對象的引用,也就是說,若是其餘對象都再也不引用該對象,那麼垃圾回收機制會自動回收該對象所佔用的內存。(WeakMap同)函數
它相似於對象,也是鍵值對的集合,可是「鍵」的範圍不限於字符串,各類類型的值(包括對象)均可以看成鍵。ui
首先,WeakMap只接受對象做爲鍵名(null除外),不接受其餘類型的值做爲鍵名。this
其次,WeakMap的鍵名所指向的對象,不計入垃圾回收機制。spa
Map和Set中對象的引用都是強類型化的,並不會容許垃圾回收。這樣一來,若是Map和Set中引用了再也不須要的大型對象,如已經從DOM樹中刪除的DOM元素,那麼其回收代價是昂貴的。WeakMap和WeakSet儲存 DOM節點,而不用擔憂這些節點從文檔移除時,會引起內存泄漏。
Proxy 與 Reflect 是 ES6 爲了操做對象引入的 API 。
Proxy 能夠對目標對象的讀取、函數調用等操做進行攔截,而後進行操做處理。它不直接操做對象,而是像代理模式,經過對象的代理對象進行操做,在進行這些操做時,能夠添加一些須要的額外操做。
let handle = {
get: function(target,key){
console.log('setting' + key)
return target[key] // 不是target.key
},
set: function(target, key, value) {
console.log('setting ' + key)
target[key] = value
}
}
let proxy = new Proxy(target, handler)
proxy.name // 實際執行 handler.get
proxy.age = 25 // 實際執行 handler.set
// getting name
// setting age
// 25
複製代碼
try {
Object.defineProperty(target, property, attributes)
// success
} catch (e) {
// failure
}
if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}
複製代碼
// 老寫法
'assign' in Object // true
// 新寫法
Reflect.has(Object, 'assign') // true
複製代碼
Proxy(target, {
set: function(target, name, value, receiver) {
var success = Reflect.set(target, name, value, receiver)
if (success) {
console.log('property ' + name + ' on ' + target + ' set to ' + value)
}
return success
}
})
複製代碼
三個方法均可以接受兩個參數,須要搜索的字符串,和可選的搜索起始位置索引。
這三個方法只返回布爾值,若是須要知道子串的位置,仍是得用 indexOf 和 lastIndexOf 。
repeat():返回新的字符串,表示將字符串重複指定次數返回。
'x'.repeat(3) // "xxx"
複製代碼
接受兩個參數,第一個參數是指定生成的字符串的最小長度,第二個參數是用來補全的字符串。若是沒有指定第二個參數,默認用空格填充。
'x'.padStart(5, 'ab') // 'ababx'
'x'.padStart(4, 'ab') // 'abax'
'x'.padEnd(5, 'ab') // 'xabab'
'x'.padEnd(4, 'ab') // 'xaba'
複製代碼
它們的行爲與trim()一致,trimStart()消除字符串頭部的空格,trimEnd()消除尾部的空格。它們返回的都是新字符串,不會修改原始字符串。
標籤模板是一個函數的調用,其中調用的參數是模板字符串。
alert`Hello world!`
// alert('Hello world!')
複製代碼
ES6 提供了二進制和八進制數值的新的寫法,分別用前綴0b(或0B)和0o(或0O)表示。
它們與傳統的全局方法isFinite()和isNaN()的區別在於,傳統方法先調用Number()將非數值的值轉爲數值,再進行判斷,而這兩個新方法只對數值有效,對於非數值一概返回false。
ES6 將全局方法parseInt()和parseFloat(),移植到Number對象上面,行爲徹底保持不變。
Number.isInteger()用來判斷一個數值是否爲整數。
ES6 在Number對象上面,新增一個極小的常量Number.EPSILON。根據規格,它表示 1 與大於 1 的最小浮點數之間的差。
JavaScript 可以準確表示的整數範圍在-2^53到2^53之間(不含兩個端點),超過這個範圍,沒法精確表示這個值。 Number.isSafeInteger()則是用來判斷一個整數是否落在這個範圍以內。
ES6 在 Math 對象上新增了 17 個數學相關的靜態方法,這些方法只能在 Math 中調用。
1 ** 2 // 1
2 ** 2 ** 3 // 256
複製代碼
Array.from()
Array.from方法用於將兩類對象轉爲真正的數組:相似數組的對象(array-like object)和可遍歷(iterable)的對象(包括 ES6 新增的數據結構 Set 和 Map)。
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
// ES5的寫法
var arr1 = [].slice.call(arrayLike) // ['a', 'b', 'c']
// ES6的寫法
let arr2 = Array.from(arrayLike) // ['a', 'b', 'c']
複製代碼
Array.of()
Array.of方法用於將一組值,轉換爲數組。
Array.of(3, 11, 8) // [3,11,8]
複製代碼
find:用於找出第一個符合條件的數組成員,而後返回該成員。若是沒有符合條件的成員,則返回undefined。
findIndex:返回第一個符合條件的數組成員的位置,若是全部成員都不符合條件,則返回-1。
[1, 4, -5, 10].find((n) => n < 0) // -5
[1, 4, -5, 10].findIndex((n) => n < 0) //2
複製代碼
copyWithin(target, start, end)
數組實例的copyWithin方法,在當前數組內部,將指定位置的成員複製到其餘位置(會覆蓋原有成員),而後返回當前數組。參數1:被修改的起始索引,參數2:被用來覆蓋的數據的起始索引,參數3(可選):被用來覆蓋的數據的結束索引,默認爲數組末尾。
[1, 2, 3, 4, 5].copyWithin(0, 3, 4) // [4, 2, 3, 4, 5]
複製代碼
fill(value, start, end)
fill方法使用給定值,填充一個數組。
['a', 'b', 'c'].fill(7, 1, 2) // ['a', 7, 'c']
複製代碼
keys()是對鍵名的遍歷、values()是對鍵值的遍歷,entries()是對鍵值對的遍歷。
Array.prototype.includes方法返回一個布爾值,表示某個數組是否包含給定的值,與字符串的includes方法相似。
[1, 2, 3].includes(2) // true
複製代碼
flat()用於將嵌套的數組「拉平」,變成一維的數組。flat()方法的參數是一個整數,表示想要拉平的層數,默認爲1。
flatMap()方法對原數組的每一個成員執行一個函數,而後對返回值組成的數組執行flat()方法。
[1, 2, [3, [4, 5]]].flat(2) // [1, 2, 3, 4, 5]
[2, 3, 4].flatMap((x) => [x, x * 2]) // [2, 4, 3, 6, 4, 8]
複製代碼
const foo = 'bar'
const baz = {foo}
baz // {foo: "bar"}
// 等同於
const baz = {foo: foo}
複製代碼
super 關鍵字
關鍵字super,指向當前對象的原型對象。
Object.is(value1, value2)
用來比較兩個值是否嚴格相等,與(===)基本相似。
Object.assign()
用於對象的合併,將源對象(source)的全部可枚舉屬性,複製到目標對象(target)。
const target = { a: 1 }
const source1 = { b: 2 }
const source2 = { c: 3 }
Object.assign(target, source1, source2)
target // {a:1, b:2, c:3}
複製代碼
Object.getOwnPropertyDescriptors()
返回指定對象全部自身屬性(非繼承屬性)的描述對象。
Object.setPrototypeOf(),Object.getPrototypeOf()
設置或讀取一個對象的原型對象。
Object.keys(),Object.values(),Object.entries()
返回一個數組,成員是參數對象自身的(不含繼承的)全部可遍歷(enumerable)屬性的鍵名/鍵值/鍵值對數組
Object.fromEntries()
Object.fromEntries()方法是Object.entries()的逆操做,用於將一個鍵值對數組轉爲對象。