|
導(dǎo)讀網(wǎng)頁的本質(zhì)就是超級文本標(biāo)記語言,通過結(jié)合使用其他的Web技術(shù)(如:腳本語言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強(qiáng)大的網(wǎng)頁。因而,超級文本標(biāo)記語言是萬維網(wǎng)(Web)編程的基礎(chǔ),也就是說萬維網(wǎng)是建立... 網(wǎng)頁的本質(zhì)就是超級文本標(biāo)記語言,通過結(jié)合使用其他的Web技術(shù)(如:腳本語言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強(qiáng)大的網(wǎng)頁。因而,超級文本標(biāo)記語言是萬維網(wǎng)(Web)編程的基礎(chǔ),也就是說萬維網(wǎng)是建立在超文本基礎(chǔ)之上的。超級文本標(biāo)記語言之所以稱為超文本標(biāo)記語言,是因?yàn)槲谋局邪怂^“超級鏈接”點(diǎn)。 本篇文章給大家?guī)淼膬?nèi)容是關(guān)于ES6中Symbol相關(guān)知識的介紹(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。symbol是es6出的一種類型,他也是屬于原始類型的范疇(string, number, boolean, null, undefined, symbol) basiclet name = Symbol('xiaohesong')
typeof name // 'symbol'
let obj = {}
obj[name] = 'xhs'
console.log(obj[name]) //xhssymbol for這個東西是可共享,在創(chuàng)建的時候會檢查全局是否尋在這個key的symbol.如果存在就直接返回這個symbol,如果不存在就會創(chuàng)建,并且在全局注冊。 let uid = Symbol.for("uid");
let object = {
[uid]: "12345"
};
console.log(object[uid]); // "12345"
console.log(uid); // "Symbol(uid)"
let uid2 = Symbol.for("uid");
console.log(uid === uid2); // true
console.log(object[uid2]); // "12345"
console.log(uid2); // "Symbol(uid)"此處所說的共享是全局性的共享,類似于global scope,是整個大環(huán)境下的共享.symbol keyforlet uid = Symbol.for("uid");
console.log(Symbol.keyFor(uid)); // "uid"
let uid2 = Symbol.for("uid");
console.log(Symbol.keyFor(uid2)); // "uid"
let uid3 = Symbol("uid");
console.log(Symbol.keyFor(uid3)); // undefined全局注冊表不存在uid3這個共享的symbol.所以取不出對應(yīng)的key.由此可見,這個是獲取對應(yīng)的key. symbol 不可強(qiáng)制轉(zhuǎn)換let uid = Symbol('uid')
uid + ''這里會報錯,根據(jù)規(guī)范,他會把uid轉(zhuǎn)換成字符串進(jìn)行相加。如果真的相加,可以先String(uid)之后再相加,不過目前看來,似乎沒什么意義。 obj中symbol key的獲取let uid = Symbol('uid')
let obj = {
[uid]: 'uid'
}
console.log(Object.keys(obj)) // []
console.log(Object.getOwnPropertyNames(obj)) // []
console.log(Object.getOwnPropertySymbols(obj)) // [Symbol(uid)]es6針對這個,添加了Object.getOwnPropertySymbols方法。 是不是感覺很少用到Symbols.其實(shí)es6內(nèi)部用的還是不少的。 Symbol.hasInstance每個函數(shù)都有這個方法;蛟S你對這個方法不是很熟,他其實(shí)就是instanceof所做的事情。 沒錯,es6給你重寫了這個方法。 function Xiao(){}
const xiao = new Xiao
xiao instanceof Xiao // true實(shí)際上es6幫你那么干了 Xiao[Symbol.hasInstance](xiao) 這個是內(nèi)部的方法,不支持重寫,當(dāng)然,我們可以在原型上改寫。 Object.definePrototype(Xiao, Symbol.hasInstance, {
value: (v) : Boolean(v)
})
const x = new Xiao
x instanceof Xiao //true
0 instanceof Xiao //false
1 instanceof Xiao //true可以發(fā)現(xiàn),我們改寫他返回對應(yīng)的是否為boolean類型。 Symbol.isConcatSpreadable這個和其他的一些屬性不同,他是默認(rèn)不存在一些標(biāo)準(zhǔn)對象上。簡單的使用 let objs = {0: 'first', 1: 'second', length: 2, [Symbol.isConcatSpreadable]: true}
['arrs'].concat(objs) //["arrs", "first", "second"]Symbol.toPrimitive這個用的就多了,進(jìn)行類型轉(zhuǎn)換的時候,對象會進(jìn)行嘗試轉(zhuǎn)換成原始類型,就是通過
嗯,是不是感覺挺繞的,是啊,代碼闡述下嘛。 let obj = {
valueOf: function(){console.log('valueOf')},
toString: function(){console.log('toString')}
}
// console.log value is
obj + 2 //valueOf
obj == 2 // valueOf
Number(obj) // valueOf
String(obj) // toString通過上面的輸出,可以發(fā)現(xiàn)大多數(shù)的情況都是首先調(diào)用valueOf. function Temperature(degrees) {
this.degrees = degrees;
}
Temperature.prototype[Symbol.toPrimitive] = function(hint) {
console.log('hint is', hint)
};
let freezing = new Temperature(32);
freezing + 2 // ..
freezing / 2 // ..
...上面的類型,你可以試試。 以上就是ES6中Symbol相關(guān)知識的介紹(代碼示例)的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章! 網(wǎng)站建設(shè)是一個廣義的術(shù)語,涵蓋了許多不同的技能和學(xué)科中所使用的生產(chǎn)和維護(hù)的網(wǎng)站。 |
溫馨提示:喜歡本站的話,請收藏一下本站!