一、Symbol數據類型是什麼意思?
Symbol是ES6引入的一種新的基本數據類型,表示一種獨一無二的值,可以用來作為對象屬性名,避免對象屬性名的衝突問題。
在JavaScript中,任何類型的值都可以作為對象的屬性名,這就導致了可能會出現屬性名衝突的情況。而使用Symbol作為屬性名,則可以有效解決這個問題。每個Symbol都是唯一的,這意味著即使在不同的對象中使用同一個Symbol作為屬性名,它們也不會衝突。
Symbol可以通過Symbol函數創建,也可以通過Symbol類的靜態屬性直接獲取預定義的Symbol值。例如:
// 使用Symbol函數創建Symbol值 let sym1 = Symbol("foo"); let sym2 = Symbol("foo"); console.log(sym1 === sym2); // false // 通過Symbol類的靜態屬性獲取預定義的Symbol值 let sym3 = Symbol.iterator; let sym4 = Symbol.iterator; console.log(sym3 === sym4); // true
二、Symbol數據類型的作用
Symbol的主要作用是用來作為對象屬性名,這樣可以避免屬性名衝突問題。除此之外,Symbol還有一些其他的用途:
1、定義類的私有屬性
通過Symbol定義的屬性是不可枚舉的,在ES6之前,要定義類的私有屬性只能使用變數或者函數作用域區分,如下代碼所示:
function Person(name) { let age = 10; // 定義私有屬性 this.getName = function() { return name; } this.getAge = function() { return age; } } let person = new Person("Tom"); console.log(person.getName()); // "Tom" console.log(person.age); // undefined console.log(person.getAge()); // 10
使用Symbol定義私有屬性的代碼:
const age = Symbol("age"); // 定義私有屬性 class Person { constructor(name) { this.name = name; this[age] = 10; } getName() { return this.name; } getAge() { return this[age]; } } let person = new Person("Tom"); console.log(person.getName()); // "Tom" console.log(person[age]); // undefined console.log(person.getAge()); // 10
2、定義常量
由於每個Symbol都是唯一的,這就可以用來定義常量,如下代碼所示:
const COLOR_RED = Symbol("color-red"); const COLOR_GREEN = Symbol("color-green"); const COLOR_BLUE = Symbol("color-blue"); function getBackgroundColor(color) { switch (color) { case COLOR_RED: return "red"; case COLOR_GREEN: return "green"; case COLOR_BLUE: return "blue"; default: return "white"; } } console.log(getBackgroundColor(COLOR_RED)); // "red" console.log(getBackgroundColor(COLOR_GREEN)); // "green" console.log(getBackgroundColor(COLOR_BLUE)); // "blue"
三、Symbol數據類型的使用場景
Symbol的主要使用場景是在對象中作為屬性名,以及定義類的私有屬性,還可以用來定義常量。
在對象中使用Symbol作為屬性名可以避免屬性名衝突問題,並且可以使對象的屬性更加清晰明了。例如可以使用Symbol.iterator定義一個對象的迭代器,使其支持for…of循環。
const obj = { [Symbol.iterator]() { let i = 0; return { next() { i++; if (i <= 3) { return { value: i, done: false }; } else { return { value: undefined, done: true }; } } } } }; for (let item of obj) { console.log(item); } // 輸出 // 1 // 2 // 3
四、Symbol數據類型怎麼用?
Symbol可以通過Symbol函數創建,也可以通過Symbol類的靜態屬性直接獲取預定義的Symbol值。Symbol創建時可以給其一個可選的描述符。
// 使用Symbol函數創建Symbol值 let sym1 = Symbol("foo"); // 通過Symbol類的靜態屬性獲取預定義的Symbol值 let sym2 = Symbol.iterator; console.log(sym1); // Symbol(foo) console.log(sym2); // Symbol(Symbol.iterator)
可以使用Symbol作為對象的屬性名,以及定義類的私有屬性、常量等。例如:
const age = Symbol("age"); // 定義私有屬性 const COLOR_RED = Symbol("color-red"); // 定義常量 let obj = { name: "Tom", [age]: 10, // 使用Symbol作為私有屬性名 [COLOR_RED]: "#FF0000" // 使用Symbol定義常量 }; console.log(obj.name); // "Tom" console.log(obj[age]); // 10 console.log(obj[COLOR_RED]); // "#FF0000"
五、與Symbol數據類型相關的其他數據類型
1、COBOL數據類型S9
S9是COBOL編程語言中的一種常見的數據類型,表示帶符號的數字。與Symbol數據類型沒有直接相關性。
2、Decimal數據類型
Decimal數據類型是在.NET Framework中使用的一種用於精確表示小數的數據類型,與Symbol數據類型沒有直接相關性。
3、Smallint數據類型
Smallint是SQL編程語言中的一種整數數據類型,表示可以存儲的整數範圍為-32768到32767。與Symbol數據類型沒有直接相關性。
4、JavaScript中Symbol類型
JavaScript中的Symbol類型是ES6之後引入的一種新的基本數據類型。與本文中討論的Symbol數據類型是同一個類型。
5、數據類型Sym改成Double
將Symbol數據類型改成Double數據類型沒有任何實際意義,在JavaScript中Double不是一種基本數據類型。
結束語
Symbol是ES6引入的一種新的基本數據類型,主要用於作為對象屬性名,可以有效避免屬性名衝突問題。除此之外,還可以使用Symbol定義類的私有屬性、常量等。雖然Symbol的應用場景相對較少,但是在特定的場景下確實能夠很好地解決問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/153450.html