日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 精品h | 国内精久久久久久久久久人 | 欧美激情啪啪 | 亚洲影视精品 | 亚洲国产一级 | 国产一区二区视频播放 | 都市激情男人天堂 | 超碰在线网站 | 艳妇乳肉豪妇荡乳 | 欧美极品少妇xxxxⅹ免费视频 | 亚洲欧美视频在线播放 | 日韩三级小视频 | 妞干网av| 亚洲天堂2016 | 最近中文字幕mv | 欧美国产日韩综合 | aa视频在线观看 | 天天干天天日夜夜操 | 日本色偷偷 | 精品五月天 | 国内老熟妇对白xxxxhd | fc2ppv在线播放 | 免费毛片av| 久久wwww | 五月天社区 | 日韩欧美中字 | 91在线精品观看 | 夜夜免费视频 | 高跟肉丝丝袜呻吟啪啪网站av | 精品久久免费视频 | 综合色导航 | 国产精品呦呦 | 国产精品第72页 | 欧美性大战久久久 | 中国无码人妻丰满熟妇啪啪软件 | 女教师高潮黄又色视频 | xxxxwww一片 | 污片免费看| 欧美午夜精品一区二区蜜桃 | 日韩激情视频在线观看 | 亚洲最新色图 | 一区二区三区在线播放 | 亚洲午夜av | 精品在线观看免费 | 女性裸体视频网站 | 精品国产久 | 中文字幕午夜 | 亚洲午码 | 国产丝袜自拍 | 日本一本在线视频 | 丝袜+亚洲+另类+欧美+变态 | 97人人在线| 激情五月综合色婷婷一区二区 | 欧美久久久久久久久 | 欧美国产中文 | 免费观看黄色一级视频 | 欧美熟妇激情一区二区三区 | 欧美激情亚洲色图 | 日韩成人av片 | 久久精品国产欧美亚洲人人爽 | 亚洲国产成人精品无码区99 | 好吊日在线| 97超碰免费在线 | 99ri在线| 亚洲伊人婷婷 | 亚洲黄色在线观看视频 | 少妇高潮av久久久久久 | 野花社区视频在线观看 | 日日操夜夜操狠狠操 | 亚洲激情电影在线 | 99热在线这里只有精品 | 午夜黄色 | 亚洲av无码专区在线电影 | 中文字幕在线视频免费 | 人妻少妇被猛烈进入中文字幕 | 中文字字幕在线中文乱码 | 亚洲毛毛片| 欧美日韩加勒比 | 超碰在线视屏 | 强迫凌虐淫辱の牝奴在线观看 | av在线免费观看不卡 | 亚洲第五页 | 国产男女视频在线观看 | 亚洲清纯国产 | 国产午夜电影 | 三级网站免费看 | 国产成人综合一区二区三区 | 国产在线精品一区 | 久久免费视频网站 | 亲嘴扒胸摸屁股激烈网站 | 国产精彩视频 | 亚洲图片综合网 | 你操综合 | 色狠狠一区 | 日本高清三区 | 我不卡av | 精品网站999www | 嫩模一区 | 欧美黑丝少妇 |