2016-09-05 5 views
0

これまでの内容は?xがObjectであるがStringオブジェクトでないかどうかをチェックする方法

const isNotNullObject = function (x) { 
    return (typeof x === "object" && x !== null); 
}; 

これは、配列とオブジェクトで正常に動作します。しかし、Stringオブジェクトに対しても!

isNotNullObject(String(5)) 
false 
isNotNullObject(new String(5)) 
true 

どのようなタイプの文字列でも欲しいのは偽です。私は呼び出しコードを制御できないことに注意してください。 new自分自身を削除することはできません。パフォーマンス上の理由からできるだけ同等であるかどうかを確認するだけの新しいStringを作成しないソリューションが必要です。

+0

なぜ 'typeof演算のx == "オブジェクト" && typeof演算のX!= "文字列"'は、以下を参照してください? – ifvictr

+0

@ifvictrはちょうど言った! – Stuart

+1

しかし、文字列オブジェクト*は*オブジェクトです。それらをそのまま扱い、あなたの呼び出し元が文字列を折り返さないことを知っていることを前提とします。 – Bergi

答えて

3

使用instance of

return (typeof x === "object" && !(x instanceof String) && x !== null) 

const isNotNullObject = function(x) { 
 
    return (typeof x === "object" && !(x instanceof String) && x !== null); 
 
}; 
 

 
console.log(
 
    isNotNullObject(String(5)), 
 
    isNotNullObject(new String(5)) 
 
)

+0

これはフレーム間では動作しません。 – Bergi

+0

@Bergi:フレームの意味 –

+0

http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/またはhttp://stackoverflow.com/q/を参照してください。 22289727/1048572 – Bergi

0

オブジェクト/文字列/配列の種類を確認するには多くの方法があります。

  • Object.prototype.toString.apply(X)

    //その性能を使用してtype of X演算子を使用すると、

  • Object.getPrototypeOf(X)

  • X.constructor最悪です。

ここで、Xは、オブジェクト/配列/文字列/番号または何でもかまいません。パフォーマンスの比較のために画像

enter image description here

関連する問題