一、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-hant/n/153450.html
微信掃一掃
支付寶掃一掃