日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

php解析js的 arraybuffer_JS的所谓的第七种数据类型Symbol

發(fā)布時(shí)間:2025/3/8 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php解析js的 arraybuffer_JS的所谓的第七种数据类型Symbol 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
首先,為什么說叫所謂呢?因?yàn)樵?007年之前Js給予我們typeof解析數(shù)據(jù)類型的一共有六種(一直有爭議,但是我們暫時(shí)就按typeof來算)'function''Number''Object''boolean''String''undefined'但當(dāng)我們?nèi)?typeof Symbol () 的時(shí)候,會(huì)驚奇的發(fā)現(xiàn),返回了一個(gè)‘symbol’首先肯定要有疑問,這貨是啥?當(dāng)然第一種想法其實(shí)就是肯定很強(qiáng)大。因?yàn)榍傲N已經(jīng)強(qiáng)大的一種地步了,這貨肯定也一定非常強(qiáng)大。首先我們先帶著我們的好奇心一步一步來看看這個(gè)鬼東西。首先先驗(yàn)證一下它是不是對(duì)象。通過我先說一下我對(duì)對(duì)象研究的他有三種機(jī)制:
  • 只要是對(duì)象就可以引用。

  • 只要是對(duì)象都可以賦予私有屬性。

  • 對(duì)象都不相等。

那么var a = Symbol();a.b = 10;// ?賦予私有屬性a.b // undefined看來這貨不是個(gè)對(duì)象,既然不是對(duì)象我們來看看它的一些別的特性。首先在 api 上 Symbol 提供了兩個(gè)方法第一個(gè)是 for 另外一個(gè)是 keyFor 。var s1 = Symbol.for('abc');var s2 = Symbol.for('abc');Symbol() === Symbol() //falses1 === s2 //trueSymbol.keyFor(s1)// 'abc'當(dāng)然這兩個(gè)看起來比較容易 似乎就是一個(gè)賦予一個(gè)值然后就會(huì)把原來的值吐出來,當(dāng)然真是原來的值么?帶著這樣的疑問我又繼續(xù)做了一些實(shí)驗(yàn)。var s1 = Symbol.for([1,2,3]);Symbol.keyFor(s1); // "1,2,3" 字符串的 1,2,3 var s1 = Symbol.for(function (){});Symbol.keyFor(s1); "function (){}" 字符串的fn;你會(huì)發(fā)現(xiàn)這貨你存的東西只會(huì)以字符串的東西吐出來。當(dāng)然這個(gè)東西官方說由于每一個(gè) Symbol 值都是不相等的,這意味著 Symbol 值可以作為標(biāo)識(shí)符,用于對(duì)象的屬性名,就能保證不會(huì)出現(xiàn)同名的屬性。這對(duì)于一個(gè)對(duì)象由多個(gè)模塊構(gòu)成的情況非常有用,能防止某一個(gè)鍵被不小心改寫或覆蓋。也就是說可以作為存在 json 中讓 key 永遠(yuǎn)不相等。OK ,那么就完全可以這樣: var a = {}; a[Symbol()]= 'Hello!'; a[Symbol()]= 'Hello!'; a[Symbol()]= 'Hello!'; console.log(a); Object Symbol(): "Hello!" Symbol(): "Hello!" Symbol(): "Hello!" __proto__: Object 你會(huì)發(fā)現(xiàn)出現(xiàn)了連續(xù)的三個(gè) a的屬性 都是hello 并且沒有覆蓋 。也就是說這么寫的話可以有效的防止其json重名問題,不過拿起來就非常費(fèi)勁了。 for(var i in a){ console.log(i +',' +a[i]) //沒有任何的東西 }當(dāng)然這就比較可以可疑了,json 用 symbol 存上東西了,但是又用 for in 拿不到。也就說如果直接這么賦值 json 認(rèn),但是 for in 循環(huán)不認(rèn),而且咱們也拿不到。但是換一種方式就沒問題了。用變量存的話,雖然雖然 for in 拿不到,但是咱們可以拿到值。var a = Symbol('aaa'); b = {}; b[a] = 10 ; console.log(b[a])//10輕松拿到值。其實(shí)不難看出來 Symbol 對(duì) for in 不是很友好,但是 對(duì) json 很友好。這時(shí)如果使用別的方法拿值呢?顧名思義,Object.getOwnPropertyNames() 是拿對(duì)象私有屬性的的方法,我們來試試。 let b = {}; b[Symbol()]=10; b[Symbol()]=15; Object. getOwnPropertyNames(b) //可以理解為:其實(shí) Symbol 不作為 b 的私有屬性存在。拿能不能拿到呢?其實(shí)也能拿到。他提供了一個(gè) getOwnPropertySymbols 方法可以讓我找到存在內(nèi)存里的 Symbol 。例如: let a = {}; a[Symbol()]=10; a[Symbol()]=15; Object.getOwnPropertySymbols(a) //[Symbol(),Symbol()] //這里面以數(shù)組的形式返回了 咱們使用的兩個(gè)Symbol(); Object.getOwnPropertySymbols(a)[0]//Symbol() 第一個(gè)Symbol() a[Object.getOwnPropertySymbols(a)[0]]//10 拿到存在的這個(gè)值。其實(shí)知道是數(shù)組后 我們就可以循環(huán)? obj.getOwnPropertySymbols(a) 這個(gè)東西 然后輸出值了。其實(shí)說回來只是換了一種方法拿值,存值。而這種方法更安全更隱蔽而已。而Symbol還有一些比較特殊的特性。js中的~(按位非) 是一個(gè)比較強(qiáng)勢(shì)的轉(zhuǎn)換number的東西。例如:~NaN //-1~function (){}//-1~undefined //-1var a = function (){};~a() //-1~new a() //-1基本任何東西都能轉(zhuǎn)成number,而:~Symbol //-1~Symbol() //報(bào)錯(cuò)似乎說明了 其跟function 有著本質(zhì)的區(qū)別,另外呢,Symbol值不能與其他類型的值進(jìn)行運(yùn)算,會(huì)報(bào)錯(cuò)。var sym = Symbol('My symbol');"your symbol is " + sym // TypeError: can't convert symbol to string es5之前的報(bào)錯(cuò)`your symbol is ${sym}` // TypeError: can't convert symbol to string es6字符串照樣的報(bào)錯(cuò)另外,Symbol值也可以轉(zhuǎn)為布爾值,但是不能轉(zhuǎn)為數(shù)值。這些都是Symbol的一些小特性。var sym = Symbol();Boolean(sym) // true!sym // falseNumber(sym) // TypeErrorsym + 2 // TypeError其實(shí)來說Symbol作為一個(gè)新的數(shù)據(jù)類型 最強(qiáng)的而不是干以上的這些事而是一些配合原型方法的一些開關(guān),可以強(qiáng)化方法的使用。比如說 Symbol.isConcatSpreadable 這個(gè)方法,咱們都知道 正常的數(shù)組concat方法是連接字符串。let arr = ['c', 'd'];['a', 'b'].concat(arr2,'e') //['a','b','c','d','e'];而我們一旦把開關(guān)打開后會(huì)發(fā)現(xiàn)一些意想不到的結(jié)果。let arr2 = ['c', 'd'];arr2[Symbol.isConcatSpreadable] = false;['a', 'b'].concat(arr2, 'e') //['a','b',['c','d'],'e']會(huì)發(fā)現(xiàn)以數(shù)組的形式插入到里面了。當(dāng)然他還包括了一些別的方法,例如,他可以測試 ES6 新增的內(nèi)置對(duì)象方法 Symbol.toStringTag 。JSON[Symbol.toStringTag]:'JSON'Math[Symbol.toStringTag]:'Math'Module對(duì)象M[Symbol.toStringTag]:'Module'ArrayBuffer.prototype[Symbol.toStringTag]:'ArrayBuffer' DataView.prototype[Symbol.toStringTag]:'DataView'Map.prototype[Symbol.toStringTag]:'Map'Promise.prototype[Symbol.toStringTag]:'Promise'Set.prototype[Symbol.toStringTag]:'Set'%TypedArray%.prototype[Symbol.toStringTag]:'Uint8Array'等WeakMap.prototype[Symbol.toStringTag]:'WeakMap'WeakSet.prototype[Symbol.toStringTag]:'WeakSet'%MapIteratorPrototype%[Symbol.toStringTag]:'Map Iterator'%SetIteratorPrototype%[Symbol.toStringTag]:'Set Iterator'%StringIteratorPrototype%[Symbol.toStringTag]:'String Iterator'Symbol.prototype[Symbol.toStringTag]:'Symbol'Generator.prototype[Symbol.toStringTag]:'Generator'GeneratorFunction.prototype[Symbol.toStringTag]:'GeneratorFunction' 不過,用 ES5 之前的方法依然也可以檢驗(yàn)出來內(nèi)置對(duì)象,所以 Symbol 就是更規(guī)范化而已,就用 map 舉例。Object.prototype.toString.call(new Map())//'[object Map]'別的內(nèi)置對(duì)象也是同理。Symbol.unscopables 也是Symbol一個(gè)比較有意思的東西。可以找到對(duì)象內(nèi)哪些屬性被with排除。Object.keys(Array.prototype[Symbol.unscopables])//['copyWithin', 'entries', 'fill', 'find', 'findIndex', 'keys']以數(shù)組的形式返回 也就是說 這些屬性會(huì)被with排除。其實(shí)這些只是Smybol的冰山一角,更多的是Symbol是服務(wù)于ES6中。讓我們繼續(xù)慢慢探索好了。

總結(jié)

以上是生活随笔為你收集整理的php解析js的 arraybuffer_JS的所谓的第七种数据类型Symbol的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。