Symbols 是 ES6 引入了一個新的數據類型 ,它為 JS 帶來了一些好處,尤其是對象屬性時。 但是,它們能為我們做些字符串不能做的事情呢?
在深入探討 Symbol 之前,讓我們先看看一些 JavaScript 特性,許多開發人員可能不知道這些特性。
背景
js 中的數據類型總體來說分為兩種,他們分別是:值類型 和 引用類型
值類型(基本類型):數值型(Number),字符類型(String),布爾值型(Boolean),null 和 underfined
引用類型(類):函數,對象,數組等
值類型理解:變量之間的互相賦值,是指開辟一塊新的內存空間,將變量值賦給新變量保存到新開辟的內存里面;之后兩個變量的值變動互不影響,例如:
var a = 10; //開辟一塊內存空間保存變量a的值“10”;var b = a; //給變量 b 開辟一塊新的內存空間,將 a 的值 “10” 賦值一份保存到新的內存里;//a 和 b 的值以后無論如何變化,都不會影響到對方的值;
一些語言,比如 C,有引用傳遞和值傳遞的概念。JavaScript 也有類似的概念,它是根據傳遞的數據類型推斷的。如果將值傳遞給函數,則重新分配該值不會修改調用位置中的值。但是,如果你修改的是引用類型,那么修改后的值也將在調用它的地方被修改。
引用類型理解:變量之間的互相賦值,只是指針的交換,而并非將對象(普通對象,函數對象,數組對象)復制一份給新的變量,對象依然還是只有一個,只是多了一個指引~~;例如:
var a = { x: 1, y: 2 }; //需要開辟內存空間保存對象,變量 a 的值是一個地址,這個地址指向保存對象的空間;var b = a; // 將a 的指引地址賦值給 b,而并非復制一給對象且新開一塊內存空間來保存;// 這個時候通過 a 來修改對象的屬性,則通過 b 來查看屬性時對象屬性已經發生改變;值類型(神秘的 NaN 值除外)將始終與具有相同值的另一個值類型的完全相等,如下:
const first = "abc" + "def";const second = "ab" + "cd" + "ef";console.log(first === second); // true
但是完全相同結構的引用類型是不相等的:
const obj1 = { name: "Intrinsic" };const obj2 = { name: "Intrinsic" };console.log(obj1 === obj2); // false// 但是,它們的 .name 屬性是基本類型:console.log(obj1.name === obj2.name); // true對象在 JavaScript 語言中扮演重要角色,它們的使用無處不在。對象通常用作鍵/值對的集合,然而,以這種方式使用它們有一個很大的限制: 在 symbol 出現之前,對象鍵只能是字符串,如果試圖使用非字符串值作為對象的鍵,那么該值將被強制轉換為字符串,如下:
const obj = {};obj.foo = 'foo';obj['bar'] = 'bar';obj[2] = 2;obj[{}] = 'someobj';console.log(obj);// { '2': 2, foo: 'foo', bar: 'bar', '[object Object]': 'someobj' }
新聞熱點
疑難解答
圖片精選