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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Symbol 数据类型

發布時間:2023/12/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Symbol 数据类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Symbol 數據類型
Symbol概述 symbol 是ES6 引入了一種新的基本數據類型(原始數據類型) Symbol ,表示獨一無二的值。它是 JavaScript 語言的第七種數據類型,前六種是: undefined 、 null 、布爾值(Boolean)、字符串 (String)、數值(Number)、對象(Object)。
每個從 Symbol() 返回的symbol值都是唯一的。一個symbol值能作為對象屬性的標識符;這是該數據 類型僅有的目的
Symbol數據類型的特點
1、Symbol的值是唯一的,用來解決命名沖突的問題
2、Symbol值不能與其他數據類型進行運算
3、Symbol定義得的對象的屬性不能使用for…in 循環遍歷,但是可以使用Reflect.ownKeys來獲取對象 的所有鍵名
Symbol語法與描述
Symbol([description])
description 可選 可選的,字符串類型。對symbol的描述,可用于調試但不是訪問symbol本身。
直接使用 Symbol() 創建新的symbol類型,并用一個可選的字符串作為其描述
let sym1 = Symbol(); let sym2 = Symbol(‘foo’); let sym3 = Symbol(‘foo’);
上面的代碼創建了三個新的symbol類型。 注意, Symbol(“foo”) 不會強制將字符串 “foo” 轉換成 symbol類型。它每次都會創建一個新的 symbol類型:
Symbol(“foo”) === Symbol(“foo”); // false
sym2===sym3;//false
下面帶有 new 運算符的語法將拋出 TypeError 錯誤
var sym = new Symbol(); // TypeError
這會阻止創建一個顯式的 Symbol 包裝器對象而不是一個 Symbol 值。圍繞原始數據類型創建一個顯式 包裝器對象從 ECMAScript 6 開始不再被支持。 然而,現有的原始包裝器對象,如 new Boolean 、 new String 以及 new Number ,因為遺留原因仍可被創建。
如果你真的想創建一個 Symbol 包裝器對象 ( Symbol wrapper object ),你可以使用 Object() 函 數:
var sym = Symbol(“foo”);
typeof sym; // “symbol”
var symObj = Object(sym);
typeof symObj; // “object”
Symbol創建對象的屬性
//Symbol定義得的對象的屬性不能使用for…in 循環遍歷,但是可以使用Reflect.ownKeys來獲取對象 的所有鍵名
let age = Symbol(“age”);
let sex = Symbol(“sex”);
let person = { name: ‘zhangsan’, [age]: 23, [sex]: ‘male’, [Symbol(‘test’)]: ‘test’ }
for (const key in person) {
//name zhangsan
console.log(key, person[key]);//name 屬性 }
//使用Reflect.ownKeys來獲取對象的所有鍵名
//[‘name’, Symbol(age), Symbol(sex), Symbol(test)]
let keys = Reflect.ownKeys(person)
//取出所有的值
keys.forEach(element => { console.log(person[element]) });
Symbol創建對象的屬性
let game = {
name: ‘俄羅斯方塊’,
up() { console.log(‘game中的向上移動’) },
down() { console.log(‘game中的向下移動’) }
}
//聲明一個對象
let methods = { up: Symbol(‘up’), down: Symbol(‘down’) }
//給game中添加一個up方法
game[methods.up] = function () { console.log(“后添加的up方法”) }
//給game中添加一個down方法
game[methods.down] = function () { console.log(“后添加的down方法”) }
//up方法的調用
game.up() gamemethods.up;
Symbol.for() 有時,我們希望重新使用同一個 Symbol 值, Symbol.for() 方法可以做到這一點。它接受一個字符串 作為參數,然后搜索有沒有以該參數作為名稱的 Symbol 值。如果有,就返回這個 Symbol 值,否則就 新建一個以該字符串為名稱的 Symbol 值,并將其注冊到全局。
let s1 = Symbol.for(‘foo’);
let s2 = Symbol.for(‘foo’);
s1 === s2 // true
上面代碼中, s1 和 s2 都是 Symbol 值,但是它們都是由同樣參數的 Symbol.for 方法生成的,所以實 際上是同一個值
Symbol.for() 與 Symbol() 這兩種寫法,都會生成新的 Symbol。它們的區別是,前者會被登記在全局 環境中供搜索,后者不會。 Symbol.for() 不會每次調用就返回一個新的 Symbol 類型的值,而是會先 檢查給定的 key 是否已經存在,如果不存在才會新建一個值。比如,如果你調用 Symbol.for(“cat”) 30 次,每次都會返回同一個 Symbol 值,但是調用 Symbol(“cat”) 30 次,會返 回 30 個不同的 Symbol 值
Symbol.for(“bar”) === Symbol.for(“bar”) // true
Symbol(“bar”) === Symbol(“bar”) // false
上面代碼中,由于 Symbol() 寫法沒有登記機制,所以每次調用都會返回一個不同的值。 Symbol.keyFor() 方法返回一個已登記的 Symbol 類型值的 key 。
let s1 = Symbol.for(“foo”);
Symbol.keyFor(s1) // “foo”
let s2 = Symbol(“foo”);
Symbol.keyFor(s2) // undefined
上面代碼中,變量 s2 屬于未登記的 Symbol 值,所以返回 undefined 。 注意, Symbol.for() 為 Symbol 值登記的名字,是全局環境的,不管有沒有在全局環境運行。
function foo() {
return Symbol.for(‘bar’);
}
const x = foo();
const y = Symbol.for(‘bar’);
console.log(x === y); // true
上面代碼中, Symbol.for(‘bar’) 是函數內部運行的,但是生成的 Symbol 值是登記在全局環境的。 所以,第二次運行 Symbol.for(‘bar’) 可以取到這個 Symbol 值。
Symbol.for() 的這個全局登記特性,可以用在不同的 iframe 或 service worker 中取到同一個值。
iframe = document.createElement(‘iframe’);
iframe.src = String(window.location);
document.body.appendChild(iframe);
iframe.contentWindow.Symbol.for(‘foo’) === Symbol.for(‘foo’) // true
上面代碼中,iframe 窗口生成的 Symbol 值,可以在主頁面得到。
內置的Symbol值 除了定義自己使用的 Symbol 值以外,ES6 還提供了 11 個內置的 Symbol 值,指向語言內部使用的方法。
Symbol.hasInstance
Symbol.isConcatSpreadable
Symbol.species Symbol.match
Symbol.replace
Symbol.search
Symbol.split
Symbol.iterator ==>對象的 Symbol.iterator 屬性,指向該對象的默認遍歷器方法
Symbol.toPrimitive
Symbol.toStringTag
Symbol.unscopables

總結

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

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