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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ES6 Symbol 数据类型

發(fā)布時(shí)間:2025/3/12 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ES6 Symbol 数据类型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ES6-Symbol 類型


  • ES5 除類數(shù)組對象(類數(shù)組對象名可以為數(shù)字,對象必須有 length 屬性,可以用數(shù)組下標(biāo)的方式訪問對象屬性,但不能通過點(diǎn)的方式訪問)外,對象屬性名都是字符串,這很容易造成屬性名的沖突。而且 JavaScript 是弱類型語言,屬性名沖突不會報(bào)錯(cuò),處于代碼執(zhí)行順序后面的屬性值會覆蓋前面的屬性值(屬性值容易被篡改),這樣對象的屬性就不能保證是我們想要的。

  • ES6 引入了Symbol數(shù)據(jù)類型很好地解決了對象屬性名沖突的問題。

  • Symbol表示 獨(dú)一無二的值 ,它是原始數(shù)據(jù)類型,不能用 new

  • ES6之后JavaScript就有了7種數(shù)據(jù)類型,分別是:Number 、String 、Boolean 、null 、undefined 、Object 、Symbol

  • 基本用法


    Symbol 函數(shù)棧不能用 new 命令,因?yàn)?Symbol 是原始數(shù)據(jù)類型,不是對象。可以接受一個(gè)字符串作為參數(shù),為新創(chuàng)建的 Symbol 提供描述,用來顯示控制臺或者作為字符串的時(shí)候使用,便于區(qū)分。

    let name = Symbol('name'); console.log(name); // Symbol(name); console.log(typeof name); // "symbol"

    特點(diǎn)

  • Symbol 函數(shù)棧不能用 new 命令,因?yàn)?Symbol 是原始數(shù)據(jù)類型,不是對象;

  • Symbol 表示獨(dú)一無二的值,因此帶有相同參數(shù)的兩個(gè) Symbol 值也不相等;

  • // 沒有參數(shù)的情況 let name1 = Symbol(); let name2 = Symbol();name1 === name2 // false// 有參數(shù)的情況 let name1 = Symbol('foo'); let name2 = Symbol('foo');name1 === name2 // false
  • Symbol 不能進(jìn)行隱式類型轉(zhuǎn)換
  • let name = Symbol('foo'); console.log('你好,' + name); // 報(bào)錯(cuò):Cannot convert a Symbol value to a string(無法將symbol值轉(zhuǎn)換為字符串)console.log(`你好,${name}`); // 報(bào)錯(cuò):Cannot convert a Symbol value to a string(無法將symbol值轉(zhuǎn)換為字符串)console.log(name + 1); // 報(bào)錯(cuò):Cannot convert a Symbol value to a number(無法將symbol值轉(zhuǎn)換為數(shù)值)
  • Symbol 值可以顯式轉(zhuǎn)為字符串
  • let name = Symbol('foo'); console.log(String(name)); // "Symbol(foo)" console.log(name.toString); // "Symbol(foo)"
  • Symbol 值不能轉(zhuǎn)化為數(shù)字
  • let name = Symbol('foo'); console.log(Number.name); // 報(bào)錯(cuò):Cannot convert a Symbol value to a number(無法將symbol值轉(zhuǎn)換為數(shù)值)
  • Symbol 值可以轉(zhuǎn)換為布爾值
  • let name = Symbol('foo'); console.log(Boolean(name)); // true console.log(!name); // false

    Symbol 應(yīng)用場景


  • 作為對象屬性名
  • 用 Symbol 聲明的對象名不能用 key.value 的形式獲取對象的屬性值,要用 [ ],原因:
    1. ES5中對象 .(點(diǎn)) 運(yùn)算符獲取的屬性名是字符串, 用 key.value 的形式會將屬性名識別為字符串,新建一個(gè)屬性名給對象,無法和 Symbol 屬性區(qū)別
    2. 方括號中帶雙引號的屬性名表示字符串屬性,不帶雙引號的屬性名表示 Symbol 屬性,一次區(qū)別二者

    let sy = Symbol();// 寫法 1 let syObject = {}; syObject[sy] = 'symbol'; console.log(syObject); // {Symbol(): "symbol"}// 寫法 2 let syObject = {[sy]: "symbol" }; console.log(syObject); // {Symbol(): "symbol"}// 寫法 3 let syObject = {}; Object.defineProperty(syObject, sy, {value: "symbol"}); console.log(syObject); // {Symbol(): "symbol"}// 萬萬不能用點(diǎn) syObject[sy]; // "symbol"; syObject.sy; // 'undefined' // 因?yàn)?syObject.sy === syObject["sy"]
  • Symbol 值作為屬性名時(shí),該屬性是公有屬性不是私有屬性,可以在類的外部訪問。但是不會出現(xiàn)在 for...in、for...of 的循環(huán)中,也不會被 Object.keys() 、Object.getOwnPropertyNames() 返回。如果要讀取一個(gè)對象的 Symbol 屬性,可以通過 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。
  • let sy = Symbol(); let syObject = {}; syObject[sy] = "symbol"; console.log(syObject); // {Symbol(): "symbol"}for (let i in syObject) {console.log(i); // 無輸出 }Object.keys(syObject); // [] Object.getOwnpropertyNames(syObject); // [] Object.getOwnpropertySymbols(syObject); // [Symbol()] Reflect.ownKeys(syObject); // [Symbol()]

    Symbol的方法

  • Symbol.for()
  • 作用:用于將描述相同的 Symbol 變量指向同一個(gè) Symbol 值

    let a1 = Symbol.for('a');let a2 = Symbol.for('a');a1 === a2 // truetypeof a1 // "symbol"typeof a2 // "symbol"let a3 = Symbol('a');a1 === a3 // false
    • Symbol() 和 Symbol.for() 的相同點(diǎn):
    • 它們定義的值類型都為 “Symbol”;
    • Symbol() 和 Symbol.for() 的不同點(diǎn):
    • Symbol() 定義的值每次都是新建,即使描述相同值也不相等;
    • Symbol() 定義的值會先檢查給定的描述是否已經(jīng)存在,如果不存在才會新建一個(gè)值,并把這個(gè)值登記在全局環(huán)境中供搜索,Symbol.for() 定義相同描述的值時(shí)會被搜索到,描述相同則他們就是一個(gè)值。
  • Symbol.keyFor()
  • 作用:用來檢測該字符串參數(shù)作為名稱的 Symbol 值是否已被登記,返回一個(gè)已登記的 Symbol 類型值的 key

    let a1 = Symbol.for('a'); Symbol.keyFor(a1); // "a" let a2 = Symbol('a'); Symbol.keyFor(a2); // undefined// a1已經(jīng)用Symbol.for()登記過,因此返回的key為"a",而a2沒有被登記,因此返回undefined

    Symbol的屬性

  • Symbol.prototype.descirption
  • description用于返回 Symbol 數(shù)據(jù)的描述

    // Symbol() 定義的數(shù)據(jù) let a = Symbol('acc'); console.log(a.description); // "acc" Symbol.keyFor(a); // undefined// Symbol.for() 定義的數(shù)據(jù) let a1 = Symbol.for('acc'); console.log(a1.description); // "acc" Symbol.keyFor(a1); // "acc"// 未指定描述的數(shù)據(jù) let a2 = Symbol.(); console.log(a1.description); // undefined

    description屬性和Symbol.keyFor()方法的區(qū)別是:description 能返回所有 Symbol 數(shù)據(jù)類型的描述,而 Symbol.keyFor() 只能返回 Symbol.for() 在全局注冊過的描述。

    總結(jié)

    以上是生活随笔為你收集整理的ES6 Symbol 数据类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。