php解析js的 arraybuffer_JS的所謂的第七種數據類型Symbol

首先,為什么說叫所謂呢?因為在2007年之前Js給予我們typeof解析數據類型的一共有六種(一直有爭議,但是我們暫時就按typeof來算)
'function''Number''Object''boolean''String''undefined'
但當我們去 typeof Symbol () 的時候,會驚奇的發現,返回了一個
‘symbol’
首先肯定要有疑問,這貨是啥?當然第一種想法其實就是肯定很強大。因為前六種已經強大的一種地步了,這貨肯定也一定非常強大。首先我們先帶著我們的好奇心一步一步來看看這個鬼東西。首先先驗證一下它是不是對象。通過我先說一下我對對象研究的他有三種機制:
  • 只要是對象就可以引用。

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

  • 對象都不相等。

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532078.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532078.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532078.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JAVA MYSQL從數據庫中提取圖片_java web將圖片存到儲數據庫和從數據庫中讀取圖片...

(Notice:以下所有經驗也是我根據網上的經驗整理的,如有侵權可以聯系我刪除,Wx:IT_Ezra,QQ 654303408。 有問題討論也可聯系我,QQ同上。)一、分析一下基本流程從前臺頁面獲取圖片,后臺接收圖片文件轉化成數據…

Ubuntu系統如何安裝和卸載CUDA和CUDNN

背景 最近在學習PaddlePaddle在各個顯卡驅動版本的安裝和使用,所以同時也學習如何在Ubuntu安裝和卸載CUDA和CUDNN,在學習過程中,順便記錄學習過程。在供大家學習的同時,也在加強自己的記憶。本文章以卸載CUDA 8.0 和 CUDNN 7.05 …

session.merge 緩存不更新_如何保證緩存與數據庫雙寫時的數據一致性?

在做系統優化時,想到了將數據進行分級存儲的思路。因為在系統中會存在一些數據,有些數據的實時性要求不高,比如一些配置信息。基本上配置了很久才會變一次。而有一些數據實時性要求非常高,比如訂單和流水的數據。所以這里根據數據…

java替換圖片中文字_Java 添加、替換、刪除Word中的圖片

文檔中,可以通過圖文混排的方式來增加內容的可讀性,相比純文本文檔,在內容展現方式上也更具美觀性。在給文檔添加圖片時,可設置圖片的文本環繞方式、旋轉角度、圖片高度/寬度等;另外,也可對文檔中已有的圖片…

kafka如何保證不重復消費又不丟失數據_Kafka寫入的數據如何保證不丟失?

我們暫且不考慮寫磁盤的具體過程,先大致看看下面的圖,這代表了 Kafka 的核心架構原理。Kafka 分布式存儲架構那么現在問題來了,如果每天產生幾十 TB 的數據,難道都寫一臺機器的磁盤上嗎?這明顯是不靠譜的啊!所以說,這…

不允許輸入特殊字符的正則表達式_JavaScript正則表達式常用技巧

正則表達式是用于匹配字符串中字符組合的模式。在 JavaScript 中,正則表達式也是對象。這些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 match、matchAll、replace、search 和 split 方法。正則表達式的掌握程度能粗略地看出程序員的技術底子&#xff…

latex 算法_GitHub項目awesome-latex-drawing新增內容(四):繪制貝葉斯網絡

近期,我們整理和開源了一個基于LaTeX的科技繪圖項目,并將其取名為awesome-latex-drawing(GitHub網址為:https://github.com/xinychen/awesome-latex-drawing),案例包括貝葉斯網絡、圖模型、矩陣/張量示意圖…

python123動物重量排序_python進階

面向對象oopclass Student(object):def __init__(self,name,score)self.name nameself.score scoredef print_score(self)print(%s: %s % (self.name,self.score))給對象發消息實際上就是調用對象對應的關聯函數,我們稱之為對象的方法(Method)。面向對象的程序寫出…

mysql中的生日應該是什么類型_MySQL中的定點數類型

上一篇文章我們嘮叨了浮點數,知道了浮點數存儲小數是不精確的。本篇繼續嘮叨一下MySQL中的另一種存儲小數的方式 —— 定點數。浮點數文章閃現:什么, 0.3 - 0.2 ≠ 0.1 ? 什么鬼定點數類型正因為用浮點數表示小數可能會有不精確的情況,在一些…

python怎么制作圖像_python數字圖像處理(5):圖像的繪制

實際上前面我們就已經用到了圖像的繪制,如:io.imshow(img)這一行代碼的實質是利用matplotlib包對圖片進行繪制,繪制成功后,返回一個matplotlib類型的數據。因此,我們也可以這樣寫:importmatplotlib.pyplot …

axios代理跨域 cli4_vuecli 3.0之跨域請求代理配置及axios路徑配置 莫小龍

vue-cli 3.0之跨域請求代理配置及axios路徑配置問題:在前后端分離的跨域請求中,報跨域問題配置:vue.config.js:module.exports {runtimeCompiler: true,publicPath: /, // 設置打包文件相對路徑devServer: {// open: process.pla…

string轉為char數組_StringBuilder的區別是什么?String是不可變?一點課堂(多岸學院)...

String和StringBuffer、StringBuilder的區別可變性簡單的來說:String 類中使用 final 關鍵字字符數組保存字符串,private final char value[],所以 String 對象是不可變的。而StringBuilder 與 StringBuffer 都繼承自 AbstractStringBuild…

python去年軟件排行_2017年編程語言排行榜,Python位居榜首(C語言需求最大)

最近IEEE Spectrum 發布了編程語言交互式排行榜,為很多學習代碼的朋友們詳解各類代碼語言的需求和占有率。為學習代碼的朋友們能更加重視哪一種編程語言而有一個明確的方向。下面排行榜123網為你公布2017年編程語言排行榜,Python位居榜首(C語言需求最大)。2017年編程…

mysql test數據庫_mysql數據庫test

Re介紹一下CentOS下MySQL數據庫的安裝與配置方法MySQL數據庫配置的具體步驟:1、編輯MySQL的配置文件,使用vi /etc/my.cnf[rootsample ~]# vi /etc/my.cnf  ← 編輯MySQL的配置文件[mysqld]datadir/var/lib/mysqlsocket/var/lib/mysql/mysql.sock# Defau…

mysql 升級 openssl_【1分鐘教程】LNMP架構應用實戰 Openssl升級操作

由于實際生產環境需求,需要將LNMP環境中的openssl版本升級至目前最新版本openssl-1.1.0c,這玩意升級還真的不是一般的麻煩,由于它與系統各種服務都有相關的聯系,比如ssh服務等,因此,升級非常的繁瑣,所以今天…

miui秒解bl鎖_MIUI12解鎖bl篇(原諒我的過失,接上篇文章)

求原諒真心求原諒由于我的疏忽,上期教程不完整,對大家造成不便在這里給大家真誠道歉!對不起!請收下我的膝蓋!!!我的上個教程小米手機MIUI系統降級任意版本通用教程,MIUI12→MIUI9因為…

腐蝕rust服務器命令_【使用 Rust 寫 Parser】2. 解析Redis協議

系列所有文章https://zhuanlan.zhihu.com/p/115017849?zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/139387293?zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/146455601?zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/186217695?zhuanlan.zhihu.com在基本熟悉 n…

python中dic_python之dic {字典}(重要指數*****)

1. 什么是字典{name: 汪峰, age: 18} 鍵:值 別的語言鍵值對數據鍵: 必須是可哈希(不可變的數據類型),并且是唯一的值: 任意可以保存任意類型的數據字典是無序的python3.6版本以上,默認定義了順序,python3.5以下是隨機顯示不能進?切片?作. 它只能通過key來獲取dict中的數據字典…

python裝飾器帶參數函數二階導數公式_一文搞定Python裝飾器,看完面試不再慌

本文始發于個人公眾號:TechFlow,原創不易,求個關注今天是Python專題的第12篇文章,我們來看看Python裝飾器。一段囧事差不多五年前面試的時候,我就領教過它的重要性。那時候我Python剛剛初學乍練,看完了廖雪…

centos7源碼安裝mysql報錯_CentOS7 下源碼安裝MySQL數據庫 8.0.11

本文主要向大家介紹了CentOS7 下源碼安裝MySQL數據庫 8.0.11,通過具體的內容向大家展現,希望對大家學習MySQL數據庫有所幫助。CentOS7 下源碼安裝MySQL 8.0.11系統環境:CentOS7, 內核:Linux 3.10.0-862.el7.x86_64如果…