摘要:延續了這個傳統,新標準中主要通過在原型鏈上定義與相關的屬性來暴露更多的語言內部邏輯。關于描述執行時運行的內部方法。對于類似數組的對象,用于時,該對象整體作為新數組的元素,重置可改變默認行為。
由來
ES5的一個中心主旨是將JavaScript中的一些“神奇”的部分暴露出來,并詳盡定義了這些開發者們在當時模擬不了的功能。ES6延續了這個傳統,新標準中主要通過在原型鏈上定義與Symbol相關的屬性來暴露更多的語言內部邏輯。
MDN 關于well-known Symbol描述
執行instanceof時運行的內部方法。
每個函數都有一個Symbol.hasInstance 方法,用于確定對象是否為函數實例。該方法被定義在Function.prototype中,所有對象都繼承了instanceof屬性的默認行為,且這個方法不可寫、不可配置和枚舉。
obj instanceof Array; // 等同于 Array[Symbol.hasInstance](obj);
怎么改寫一個不可寫的屬性呢?這個要使用Object.defineProperty()這個方法了。可以通過以下方法進行改寫instanceof 方法實現。
function SObject() {} Object.defineProperty(SObject, Symbol.hasInstance, { value: function(v) { return false; } }); let obj = new SObject(); console.log(obj instanceof SObject); //falseSymbol.isConcatSpreadable
對于數組對象,默認情況下,用于concat時,會按數組元素展開然后進行連接(數組元素作為新數組的元素)。重置Symbol.isConcatSpreadable可以改變默認行為。
對于類似數組的對象,用于concat時,該對象整體作為新數組的元素,重置Symbol.isConcatSpreadable可改變默認行為。
let collection = { 0: "Hello", 1: "world", length: 2, [Symbol.isConcatSpreadable]: true } let messages = [ "Hi"].concat(collection); console.log(messages.length); // 3 console.log(messages); // (3)?["Hi", "Hello", "world"] var alpha = ["a", "b", "c"], numeric = [1, 2, 3]; numeric[Symbol.isConcatSpreadable] = false; var alphaNumeric = alpha.concat(numeric); console.log(alphaNumeric); // 結果: ["a", "b", "c", [1, 2, 3] ]
是不是很神奇?我們現在可以編輯影響一些內部函數了!
還有更多內部暴露的方法。
更多屬性參考MDN
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105620.html
摘要:通過使用其構造函數,可以將一個值的類型轉換為另一種類型。如果使用兩次,可用于將該值轉換為相應的布爾值。 編譯自:[1] + [2] – [3] === 9!? Looking into assembly code of coercion.全文從兩個題目來介紹類型轉換、寬松相等以及原始值的概念: [1] + [2] – [3] === 9 如果讓 a == true && a == fa...
摘要:稍后我們再詳細剖析,接下來先看一個問題。還內建了一些在之前沒有暴露給開發者的,它們代表了內部語言行為。使用,可能有不少朋友一開始就想到這種方式,簡單貼一下閱讀更多 在 JavaScript 環境下,可以讓表達式 a == true && a == false 為 true 嗎? 就像下面這樣,可以在控制臺打印出 ’yeah: // code here if (a == true && ...
摘要:文章內容分兩部分前半部分為迭代器模式概念后半部分為中迭代器上半部分開始迭代器模式提供一種方法順序訪問一個聚合對象中的各個元素,而又不需要暴露該對象的內部表示。下半部分開始的迭代器迭代器等同于遍歷器。執行該函數,會返回一個遍歷器對象。 showImg(https://segmentfault.com/img/bVbuyaZ?w=800&h=600); 文章內容分兩部分: 前半部分為 迭...
摘要:通常,它做為一個偏功能性的標記來表示,在全劇中它是唯一的。并且使用來生成,會在存入當前全局上下文中一個結構中,我們稱它為顧名思義,它是全局的,所以使用時我們需要謹慎,尤其是在大型項目中。 ES6中基礎類型增加到了7種,比上一個版本多了一個Symbol,貌似出現了很長時間,但卻因沒有使用場景,一直當作一個概念層來理解它,我想,用它的最好的方式,還是要主動的去深入了解它吧,所以我從基礎部分...
閱讀 3024·2021-09-22 14:59
閱讀 1864·2021-09-22 10:02
閱讀 2108·2021-09-04 16:48
閱讀 2260·2019-08-30 15:53
閱讀 2967·2019-08-30 11:27
閱讀 3403·2019-08-29 18:35
閱讀 961·2019-08-29 17:07
閱讀 2669·2019-08-29 13:27