簡體   English   中英

檢查值是否是 JavaScript 中的符號

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM