[英]Check if value is a Symbol in JavaScript
如何檢查一個值是否是 JS 中的符號?
我沒有看到Symbol.isSymbol(x)
方法。 我對(x instanceof Symbol)
的測試似乎也不起作用。
用 typeof 檢查它:
typeof x === 'symbol'
2022 年更新:接受已接受的答案! 如果您在一個過時的環境中工作,以至於Symbol
需要填充,那么您已經知道了。 你會非常清楚地意識到這一點。 你會被它所困擾。 然后,當然,使用我的答案。 否則不要打擾。 typeof x === 'symbol'
幾乎絕對是你現在所需要的。
在 ES 2015 及更高版本中,只需要typeof x === 'symbol'
即可。 但是,如果您將代碼轉換為 ES 5.1 或更早版本,即使您使用的是內置Symbol
的 polyfill,它也不會起作用。
我見過的每個 polyfill,包括 babel-polyfill,都使用一個名為Symbol
的構造函數將 Symbol 實現為一個對象(即typeof x === 'object'
)。 因此,在這些情況下,您可以檢查Object.prototype.toString.call (x) === '[object Symbol]'
*。
綜上所述,我們得到:
function isSymbol (x) {
return typeof x === 'symbol'
|| typeof x === 'object' && Object.prototype.toString.call (x) === '[object Symbol]';
}
*請注意,我沒有在轉譯場景中使用instanceof
。 instanceof
的問題在於它只對在與斷言相同的全局上下文中創建的對象返回 true。 因此,如果網絡工作者將符號傳回您的頁面,或者在 iframe 之間傳遞符號,則x instanceof Symbol
將返回 false! 這對所有對象類型都是如此,包括內置函數。 instanceof
通常工作得很好,但是如果您的代碼有可能像我所描述的那樣處於“多幀”場景中,請謹慎使用!
最有效的方法是測試一個值的構造函數:
const result = (value && value.constructor === Symbol);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.