【前端知識】JavaScript——Symbol類型
- 什么是Symbol(符號)類型?
? Symbol是原始值,且Symbol實例是唯一、不可變的。Symbol的用途是確保對象屬性使用唯一標識符,不會發(fā)生屬性沖突的危險。Symbol創(chuàng)建唯一記號,進而用作非字符串形式的對象屬性。
- 如何使用Symbol?
function foo() {
let sym = Symbol();
console.log(typeof sym);
}
foo(); // symbol
- 全局符號注冊表
// 創(chuàng)建新符號
let newSymbol = Symbol.for('foo');
console.log(typeof newSymbol); // symbol
// 重用已有符號
let copySymbol = Symbol.for('foo');
console.log(newSymbol === copySymbol); // true
// 即使采用相同的符號描述,在全局注冊表中定義的符號跟使用 Symbol()定義的符號也并不等同
let localSymbol = Symbol('foo');
let globalSymbol = Symbol.for('foo');
console.log(localSymbol === globalSymbol); // false
// 查詢已注冊的符號
let s = Symbol.for('foo');
console.log(Symbol.keyFor(s)); // foo
- 使用符號作為屬性
let s1 = Symbol('foo'),
s2 = Symbol('bar'),
s3 = Symbol('baz'),
s4 = Symbol('qux');
// 方式一:
let o = {
[s1]: 'foo val'
};
// 這樣也可以:o[s1] = 'foo val';
console.log(o); // {Symbol(foo): foo val}
// 方式二:
Object.defineProperty(o, s2, {value: 'bar val'});
console.log(o); // {Symbol(foo): foo val, Symbol(bar): bar val}
// 方式三:
Object.defineProperties(o, {
[s3]: {value: 'baz val'},
[s4]: {value: 'qux val'}
});
console.log(o);
// {Symbol(foo): foo val, Symbol(bar): bar val,
// Symbol(baz): baz val, Symbol(qux): qux val}
- 常用內(nèi)置符號
? 內(nèi)置符號是全局函數(shù) Symbol 的普通字符串屬性,指向一個符號的實例。所有內(nèi)置符號屬性都是不可寫、不可枚舉、不可配置的
- Symbol.asyncIterator
? Symbol.asyncIterator 作為一個屬性表示“一個方法,該方法返回對象默認的 AsyncIterator。由 for-await-of 語句使用”。for-await-of 循環(huán)會利用這個函數(shù)執(zhí)行異步迭代操作。循環(huán)時,它們會調(diào)用以Symbol.asyncIterator為鍵的函數(shù),并期望這個函數(shù)會返回一個實現(xiàn)迭代器 API 的對象。
- Symbol.hasInstance
? Symbol.hasInstance 作為一個屬性表示“一個方法,該方法決定一個構造器對象是否認可一個對象是它的實例。由 instanceof 操作符使用”。instanceof 操作符可以用來確定一個對象實例的原型鏈上是否有原型。
- Symbol.isConcatSpreadable
? Symbol.isConcatSpreadable 作為一個屬性表示“一個布爾值,如果是 true,則意味著對象應該用 Array.prototype.concat()打平其數(shù)組元素”
- Symbol.iterator
? Symbol.iterator 作為一個屬性表示“一個方法,該方法返回對象默認的迭代器。由 for-of 語句使用”。換句話說,這個符號表示實現(xiàn)迭代器 API 的函數(shù)。
- Symbol.match
? Symbol.match 作為一個屬性表示“一個正則表達式方法,該方法用正則表達式去匹配字符串。由 String.prototype.match()方法使用”
- Symbol.replace
? Symbol.replace 作為一個屬性表示“一個正則表達式方法,該方法替換一個字符串中匹配的子串。由 String.prototype.replace()方法使用”。
- Symbol.search
? Symbol.search 作為一個屬性表示“一個正則表達式方法,該方法返回字符串中匹配正則表達式的索引。由 String.prototype.search()方法使用”
- Symbol.species
? Symbol.species 作為一個屬性表示“一個函數(shù)值,該函數(shù)作為創(chuàng)建派生對象的構造函數(shù)”。這個屬性在內(nèi)置類型中最常用,用于對內(nèi)置類型實例方法的返回值暴露實例化派生對象的方法。
- Symbol.split
? Symbol.split 作為一個屬性表示“一個正則表達式方法,該方法在匹配正則表達式的索引位置拆分字符串。由 String.prototype.split()方法使用”。
- Symbol.toPrimitive
? Symbol.toPrimitive 作為一個屬性表示“一個方法,該方法將對象轉換為相應的原始值。由 ToPrimitive 抽象操作使用”。
- Symbol.toStringTag
? Symbol.toStringTag 作為一個屬性表示“一個字符串,該字符串用于創(chuàng)建對象的默認字符串描述。由內(nèi)置方法 Object.prototype.toString()使用”。文章來源:http://www.zghlxwxcb.cn/news/detail-598912.html
- Symbol.unscopables
? Symbol.unscopables 作為一個屬性表示“一個對象,該對象所有的以及繼承的屬性,都會從關聯(lián)對象的 with 環(huán)境綁定中排除”。文章來源地址http://www.zghlxwxcb.cn/news/detail-598912.html
到了這里,關于【前端知識】JavaScript——Symbol類型的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!