一、Symbol類型介紹
Symbol類型是JavaScript ES6新增的一種數據類型,它可以作為對象屬性的標識符使用。Symbol類型的值是唯一的,且不可變更。Symbol類型的值可以作為對象屬性名,這樣就可以避免對象屬性名的衝突。
二、Symbol類型是字元串嗎?
Symbol類型與字元串類型不同,Symbol類型的值是獨一無二的,不可變性的。
三、Symbol類型數據
Symbol類型數據是一種基本數據類型,可以使用Symbol()構造函數創建。每次調用Symbol()函數都會創建一個新的Symbol值。可以給Symbol()函數傳遞一個字元串參數,這個字元串是Symbol值的描述信息,便於調試。但是不能依靠這個參數來判斷兩個Symbol值是否相等。
// 創建一個Symbol類型的值 let symbol1 = Symbol(); let symbol2 = Symbol("description"); console.log(symbol1); // Symbol() console.log(symbol2); // Symbol(description)
四、Symbol類型叫什麼?
Symbol類型的英文名稱為「Symbol」,中文名稱為「符號」。
五、Symbol類型有什麼作用?
主要的作用是創建具有唯一標識符的對象屬性,以避免屬性名的衝突。除此之外,Symbol類型還可以用於控制對象的行為,例如:迭代器(Iterator),元屬性(MetaProperty)等。
六、Symbol類型是什麼?
Symbol類型是JavaScript中基本數據類型之一,它是一種預定義好的對象,可以使用Symbol()構造函數來創建。
七、Symbol類型可變嗎?
Symbol類型的值是不可變的,即使我們能夠訪問到它們,但是也不能修改它們。一旦創建一個Symbol類型的值,就會一直存在於內存中。
八、Symbol類型的值可以轉換為數字嗎?
不能。
九、js Symbol類型
在JavaScript ES6之前,JavaScript沒有原生的Symbol類型。可以使用字元串或其他常量來表示唯一標識符,但這些標識符並不是真正意義上的唯一的。
與其他現代編程語言一樣,JavaScript引入了Symbol類型,作為一種真正的、唯一的標識符。和其它基本數據類型一樣,Symbol類型的值也具備以下特點:
- Symbol值可以轉換成字元串和布爾值類型,但它們本身不是字元串或布爾值。
- Symbol值可以作為對象的屬性名使用,而字元串類型的屬性名則不會避開屬性名的污染。
- 標準庫中已經定義好了許多Symbol值,我們可以直接使用它們。
十、Symbol的所有形式
1、Symbol.iterator
Symbol.iterator是用來定義一個對象的默認迭代器的。當一個對象需要被迭代時,只需要實現一個Symbol.iterator方法即可。比如,在for…of循環中使用數組、字元串、Map、Set等數據結構對象的時候,就是用該對象的Symbol.iterator方法來生成一個迭代器對象。
// 使用Symbol.iterator來定義對象的default迭代器 let obj = { data: [1,2,3], [Symbol.iterator]() { let index = 0; let data = this.data; let len = data.length; return { next() { if (index < len) { return { value: data[index++], done: false }; } else { return { value: undefined, done: true }; } } }; } }; // 執行迭代器 for (let i of obj) { console.log(i); }
2、Symbol.hasInstance
Symbol.hasInstance是一個用來檢查一個對象是否為某個構造函數的實例的方法。
class CustomNumber { static [Symbol.hasInstance](instance) { return typeof instance === "number" } } console.log(1 instanceof CustomNumber); // true console.log("foo" instanceof CustomNumber); // false
3、Symbol.isConcatSpreadable
Symbol.isConcatSpreadable定義數組是否可以展開為單獨的參數,被concat方法使用。默認情況下,可遍歷的都可以被展開。
let arr1 = [1,2,3]; let arr2 = [4,5,6]; arr2[Symbol.isConcatSpreadable] = false; console.log(arr1.concat(arr2)); // [1,2,3,[4,5,6]]
4、Symbol.toPrimitive
Symbol.toPrimitive是一個類型轉換函數,用於將一個對象轉換為原始值。在將對象轉換為原始值時,會優先使用該對象上的這個方法。該方法接受一個字元串參數,表示轉換的類型。
// Symbol.toPrimitive方法實現 let user = { name: "John", money: 1000, [Symbol.toPrimitive](hint) { console.log(hint); // 'string'/'number'/'default' return hint == "string" ? `{name: "${this.name}"}` : this.money; } }; // 對象轉換為字元串值 console.log(`User: ${user}`); // User: {name: "John"} // 對象轉換為數字值 console.log(+user); // 1000 // 對象和數字相加 console.log(user + 100); // 1100
五、總結
JavaScript Symbol類型作為一種唯一的標識符類型,可以有效的解決對象屬性名衝突的問題,也可以通過迭代器、元屬性等形式對對象進行控制和操作。需要注意的是,Symbol類型的值是不可變的,不能轉換為數字和字元串類型。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/150744.html