ES6 Symbol基本用法
一、什么是 Symbol
Symbol 是 ES6 新出的一種數據類型,可以簡單理解為 唯一的量,獨一無二的值。
symbol: 記號,標記;被標記過了,可不就唯一了嘛。
二、為什么會有 Symbol
ES5的對象的屬性名都是字符串,這樣很容易造成命名沖突,可能會重寫原有對象的屬性或者方法。
于是,就新搞出了一種新的數據類型——Symbol。
它是一種基本數據類型,不能使用 new 命令。
三、基本用法
let s1 = Symbol([1,2]); let s2 = Symbol('bar');console.log(s1) console.log(s2)Symbol 是可以接受一個字符串作為參數的,僅用來對 Symbol 實例進行描述。
let s3 = Symbol('foo'); let s4 = Symbol('foo');s3 === s4 // false參數只是描述,另外,如果傳入的參數是一個對象的話(無論是數組對象,還是object對象),會執行對象的toString()方法
let s1 = Symbol({a:1}); let s2 = Symbol([1,2]); let s3 = Symbol({toString:()=>2})console.log(s1)//Symbol([object object]) console.log(s2)//Symbol(1,2) console.log(s3)//Symbol(2)//Symbol不允許和其他數據類型的值進行運算,否則會報錯,但是可以轉為字符串或者布爾值。四、作為屬性名使用
作為屬性名使用時不能用點形式,必須放在括號內,如果用點,聲明的是普通屬性名,而不是Symbol,如下
let mySymbol = Symbol()let a = {} a.mySymbol = 'yes' a[mySymbol] = 'hello'console.log(a["mySymbol"])//yes console.log(a[mySymbol])//hello需要注意的是,作為屬性名使用時,是不會被for…in、for…of、Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回的,但他并不是私有屬性,用Object.getOwnPropertySymbols()這個方法,可以獲取到所有的Symbol屬性名,還有一個新API,就是Reflect.ownKeys,它返回所有鍵值,包括常規屬性。
let mySymbol= Symbol(1) let a={[mySymbol]:1,name:2}for(let i in a){console.log(i+"in")}//nameinfor(let i of Object.keys(a)){console.log(i+"Object.keys")}//nameObject.keysfor(let i of Reflect.ownKeys(a)){console.log(i)}//name Symbol(1)for(let i of Object.getOwnPropertySymbols(a)){console.log(i)}//Symbol(1)我們可以利用這一特點,為對象設置一些即沒暴露出去,又再內部能使用的方法。let size = Symbol('size');class Collection {constructor() {this[size] = 0;this.x = 1}add() {this[size]++;}sizeOf() {return this[size];}}let x = new Collection();x.add()console.log(x.sizeOf())//1console.log(Object.keys(x)) // ['x']console.log(Object.getOwnPropertyNames(x)) // ['x']console.log(Object.getOwnPropertySymbols(x)) // [Symbol(size)]當調用x.add()方法后,內部Symbol值size是改變了,但是類外部,是訪問不到實例屬性的。
五、symbol.for和symbol.keyFor
Symbol.for可以使用相同的Symbol的值,它接受一個字符串作為參數,然后搜索有沒有以該參數作為名稱的 Symbol 值。如果有,就返回這個 Symbol 值,否則就新建并返回一個以該字符串為名稱的 Symbol 值。
let s1 = Symbol.for('foo');let s2 = Symbol.for('foo');s1 === s2 // trueSymbol.keyFor方法返回一個已登記的 Symbol 類型值的key。
let s1 = Symbol.for("foo");Symbol.keyFor(s1) // "foo"let s2 = Symbol("foo");Symbol.keyFor(s2) // undefined總結
以上是生活随笔為你收集整理的ES6 Symbol基本用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Bookinfo应用测试Kuma服务
- 下一篇: delphi 各新版本特性收集