日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ES6 Symbol基本用法

發布時間:2023/12/16 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 // true

Symbol.keyFor方法返回一個已登記的 Symbol 類型值的key。

let s1 = Symbol.for("foo");Symbol.keyFor(s1) // "foo"let s2 = Symbol("foo");Symbol.keyFor(s2) // undefined

總結

以上是生活随笔為你收集整理的ES6 Symbol基本用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。