2017-06-01 8 views
2

は私が typeofをキーワードと文字列の比較を行う多くの場所を見てきたし、それは、明らかなよう文字列オブジェクト、定数文字列であるかを返します未定義私が見ることを期待するなどそれらは定数として定義されていますが、そうではないようです(MDN hereにリストされています)。私はコードで使用されている文字列の複製が魔法のように見えるのは好きではありません。現在の解決方法は、const自分自身でコードを定義することですが、JSはこれらを知っているようですが、どうして私はそれらにアクセスできないのですか? (またはIができますか?)JavaScriptでは、typeofから返される定数文字列はどこから来たのですか?

魔法の文字列:これは魔法の文字列の無重複以来、少し良さそうですが、私はconstとして定義する必要がありますなぜ私は表示されません

if(typeof myObject === 'object') {} 

const TYPE_OBJECT = 'object'; 

if(typeof myObject === TYPE_OBJECT) {} 
if(typeof myOtherObject === TYPE_OBJECT) {} 

それとも、これはあまりにも不器用なようだ:

if(typeof myObject === Object.name.toLowerCase()) {} 
if(typeof "hello" === String.name.toLowerCase()) {} 

は、より良い方法またはこれらの定数は、どこかで構築されているがありますか?

+0

[ECMAScript 2015 - 12.5.6 'typeof'オペレータ](http://www.ecma-international.org/ecma-262/6.0/#sec-typeof-operator) – Andreas

+0

あなたがしていることは、次のようですあなたが私に尋ねるならば、最も合理的な方法です。 – sweaver2112

+0

@Andreasは、MDNドキュメントのように返される定数文字列を示しているので、仕様へのリンクを投稿してくれてありがとうございますが、これらの定数にアクセスできるかどうか尋ねていました。 – deejbee

答えて

0

これらの文字列定数は、あらかじめ定義された定数として使用できません。しかし、文字列リテラルを自分で指定したくない場合は、その逆を行い、入力したいくつかの基本値にtypeofを適用し、返された文字列で定数を定義することができます。例えば:

const TYPES = Object.freeze({ 
 
    OBJECT: typeof {}, 
 
    UNDEFINED: typeof undefined, 
 
    BOOLEAN: typeof true, 
 
    NUMBER: typeof 1, 
 
    STRING: typeof "", 
 
    FUNCTION: typeof eval, 
 
    SYMBOL: typeof Symbol() 
 
}); 
 

 
console.log(TYPES); 
 

 
// Use it: 
 
let myObject = { "test": 123 }; 
 
console.log(typeof myObject === TYPES.OBJECT); // true

0

私は、これらの文字列はから来に持っているという推定がどこか誤謬だと思います。 JavaScriptは仕様であり、この点に関しては、typeofは、仕様に記載されている定義済みの値の1つを持つことができる文字列を返す演算子です。これらがどこから来るかは、実装に依存します。

さらに、typeof myObject === Object.name.toLowerCase()またはtypeof myObject === TYPE_OBJECTのようなものは「裸の」文字列を使用するよりもよく見えるかもしれませんが、typeof myObject === 'object'はよく知られたパターンです。別のものを使用することで、コードの可読性が低下します。他の2つの変種は、いくつかの眉を上げ、人々にこの行の内容を尋ねるよう促します。

非常に最初からJSにSymbolが存在していた場合、typeofはちょうどSymbolを返すと思います。残念なことに、後方互換性のために、文字列を返す必要があります。

関連する問題