簡體   English   中英

檢查變量的類型

[英]Checking the type of a variable

找出變量是否為字符串(以及數字,布爾值等)的最佳方法是什么?

通常您會發現:

function isString(value) {
    return typeof value === 'string';
}

但是人們忘記了,也可以直接使用var foo = new String("bar");創建字符串對象var foo = new String("bar"); -那是一個好主意是完全不同的事情。

那么去這里要怎么走? 我可以想到-並且已經看到-各種方法(有些簡化):

// option 1
function isString(value) {
    return (typeof value === 'string') ||
           /^function String\(\)/.test(value.constructor + '');
}

要么

// option 2
function isString(value) {
    return (typeof value === 'string') ||
           (value.constructor === String);
}

要么

// option 3
function isString(value) {
    return (typeof value === 'string') ||
           value instanceof String;
}

是否有“最佳”方法來解決此問題? 還是全部等同?

在現有的三個選項中,第一個對我來說感覺很棘手,因為它使用正則表達式測試value.constructor的字符串表示value.constructor 它可以工作,但是仍然感覺很笨拙(也許只是我一個人)。

第二個選項僅適用於字符串文字,通過連接現有對象和使用new String()構造函數創建的對象而創建的new String() ,而第三個選項應使用new String()構造函數創建的對象或從其繼承的任何其他對象String() (我不確定JavaScript繼承;有人可以確認這一點嗎?)

constructor屬性還適用於圖元/文字,而不僅僅是使用new創建的包裝器對象。 這使得第二個選項中的typeof檢查非常多余:

function isString(value) {
    return value.constructor === String;
}

alert(isString("test1"));             // true
alert(isString(new String("test2"))); // true

然而,與第三個選項可能無法使用對象比其他的構造函數String()從繼承String()

我的答案以字符串為例來反映問題,但相同的想法也適用於NumberBooleanFunctionObjectArray和其他類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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