JavaScriptで変数が数値か文字列かを確認します


回答:


442

リテラル表記でコンストラクタではない場合は、typeof:を使用できます。

typeof "Hello World"; // string
typeof 123;           // number

あなたのような、コンストラクタを介して数値と文字列を作成している場合var foo = new String("foo")、あなたは心に留めておく必要がありますtypeof返すことがobjectためにfoo

おそらく、型をチェックするより確実な方法は、underscore.jsにあるメソッドを使用することです(注釈付きのソースはここにあります)。

var toString = Object.prototype.toString;

_.isString = function (obj) {
  return toString.call(obj) == '[object String]';
}

true次のブール値を返します。

_.isString("Jonathan"); // true
_.isString(new String("Jonathan")); // true

69
それぞれ「string」と「number」を示しています
Thilo

27
これは正しくありません。文字列には2つの表現があります。alert(typeof new String())は「オブジェクト」を出力します。さらに悪いことに、javascriptは、最適化の目的で舞台裏の2つの表現の間で前後に変換されることがあります
George Mauer

3
@George OPによると、既存の変数のみがテストされます。
サンプソン、

3
もちろん、関数isString(str){return typeof str === 'string'}があると言うと、Java-convertが私のメソッドを使用して、var myString = new String("stuff I like"); isString(myString)falseを返すことがあります。また、バックグラウンド変換がどのくらい続くか正確にわかりません。「hi」を呼び出したときにわかります。長さ、「hi」はオブジェクトに変換されます。再び変換されるまで、またはバインドされているかどうかはわかりません。変数に。
George Mauer、

8
本当ですが、とにかくStringオブジェクトを使用しますか?
フェリックスSaparelli

211

isNaN+型キャストを使用するのが最善の方法です。

更新されたオールインメソッド:

function isNumber(n) { return !isNaN(parseFloat(n)) && !isNaN(n - 0) }

正規表現を使用して同じ:

function isNumber(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n); } 

------------------------

isNumber('123'); // true  
isNumber('123abc'); // false  
isNumber(5); // true  
isNumber('q345'); // false
isNumber(null); // false
isNumber(undefined); // false
isNumber(false); // false
isNumber('   '); // false

21
これは、有効な数値として解析される文字列を数えたい場合の良い解決策のように見えます。
Trevor Burnham、

2
FYI:null0に強制変換され、Trueを返すisNumber(null);
Edward

1
何が問題になっているfunction is_number(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n);}
OneOfOne 2013

1
これは、「123abc」などの文字列の場合も失敗します。

1
@ashおかげで、このケースもカバーするようにソリューションを更新しました。
BitOfUniverse

73

私が見つけた最良の方法は、文字列のメソッドをチェックすることです。つまり、

if (x.substring) {
// do string thing
} else{
// do other thing
}

または、数値プロパティの数値チェックで何かしたい場合は、

if (x.toFixed) {
// do number thing
} else {
// do other thing
}

これは「ダックタイピング」のようなもので、どちらが最も意味があるかはあなた次第です。コメントするカルマが足りませんが、ボックス化された文字列と数値に対してtypeofは失敗します。

alert(typeof new String('Hello World'));
alert(typeof new Number(5));

「オブジェクト」に警告します。


2
これはtypeof、プリミティブオブジェクトでもStringオブジェクトでも、常に文字列をテストできるので、これよりも優れていると思います。必要なタイプに固有のメソッドをテストするだけです。
ADTC、2012

コードを保守する必要がある人の観点からすると、このパスを選択することは混乱を招く可能性があります。「なぜ彼らは部分文字列を使用し、値を渡さなかったのですか?ここにどんなビジネスロジックが欠けていますか?」少なくとも、これは関連するロジックを説明するコメントと組み合わせる必要があります。
Lemmings19

3
@ Lemmings19実際には部分文字列メソッドを呼び出すのではなく、xに部分文字列メソッドがあるかどうかを確認するだけです。
Alokito 2017年

1
私はこの種のアヒルのタイピングのアイデアが好き{substring:"hello"}ですが、のようなものには失敗します。私は目的のために、チェックする必要がある型に対して(モジュラス)実行する必要のある特定の操作をテストしたことを知っています(文字列ではモジュラスは未定義を返します)、その型を取得する代わりにそれをチェックしました。
Tadhg McDonald-Jensen 2018

30

あなたが探していますisNaN()

console.log(!isNaN(123));
console.log(!isNaN(-1.23));
console.log(!isNaN(5-2));
console.log(!isNaN(0));
console.log(!isNaN("0"));
console.log(!isNaN("2"));
console.log(!isNaN("Hello"));
console.log(!isNaN("2005/12/12"));

MDNのJavaScript isNaN()関数を参照してください。


3
メソッド名に対して逆の操作を選択するのは不思議です。isNumber()を呼び出す方が直感的に思えます。
ネイサンテイラー

12
これは実際には「isNumber」の逆操作ではありません。NaNは、JavaScriptの数値の特別な値です。isNaNは、指定されたすべてを数値に変換し、結果がNaNかどうかをチェックします。「25」のような文字列の場合、不正な結果が得られます。
Chetan Sastry、

1
私は「25」でテストしたところ、期待したようにfalseが返されました。
ジェイコブゲード

2
NaNは、IEEE 754標準の2進浮動小数点演算の特別な値であり、JavaScriptだけではありません。(正確には、「9007199254740990(つまり、(2 ^ 53)-2)IEEE規格の個別の「Not-a-Number」値は、ECMAScriptでは単一の特別なNaN値として表されます。」
NickFitz

2
ことを覚えておいてくださいisNaNリターンfalseのためにnull(ただしtrueundefined)。
トニ

28

値が文字列リテラルまたは文字列オブジェクトかどうかを確認します。

function isString(o) {
    return typeof o == "string" || (typeof o == "object" && o.constructor === String);
}

単体テスト:

function assertTrue(value, message) {
    if (!value) {
        alert("Assertion error: " + message);
    }
}

function assertFalse(value, message)
{
    assertTrue(!value, message);
}

assertTrue(isString("string literal"), "number literal");
assertTrue(isString(new String("String object")), "String object");
assertFalse(isString(1), "number literal");
assertFalse(isString(true), "boolean literal");
assertFalse(isString({}), "object");

番号の確認も同様です。

function isNumber(o) {
    return typeof o == "number" || (typeof o == "object" && o.constructor === Number);
}

1
(o.constructor === String)文字列リテラルであっても、それ自体で十分のようです。
クリス・ノエ

2
o === null
TJの

3
私はこのソリューションが大好きでした。nullの場合でも例外を回避するには、o.constructorの代わりにo ["constructor"]を使用します
dreamerkumar

2
@VishalKumarしたがって、これはすべて1つのニーズですfunction is (type, value) { return value["constructor"] === type; }
15

22

ES2015以降、変数が有効な数値を保持しているかどうかを確認する正しい方法は Number.isFinite(value)

例:

Number.isFinite(Infinity)   // false
Number.isFinite(NaN)        // false
Number.isFinite(-Infinity)  // false

Number.isFinite(0)          // true
Number.isFinite(2e64)       // true

Number.isFinite('0')        // false
Number.isFinite(null)       // false

1
これはInternet Explorerではサポートされていません。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
davedeecoder

1
元の質問である文字列では機能しません。
エリックグランジ

18

これを試して、

<script>
var regInteger = /^-?\d+$/;

function isInteger( str ) {    
    return regInteger.test( str );
}

if(isInteger("1a11")) {
   console.log( 'Integer' );
} else {
   console.log( 'Non Integer' );
}
</script>

「-2」を試してください。falseを返します。
KChen

1
機能しない回答を保持する(または編集しない)理由を教えてください。...負の数は整数にすることもできます。
エイソン

13

これを行う最良の方法:

function isNumber(num) {
  return (typeof num == 'string' || typeof num == 'number') && !isNaN(num - 0) && num !== '';
};

これは、以下のテストケースを満たします。

assertEquals("ISNUMBER-True: 0", true, isNumber(0));
assertEquals("ISNUMBER-True: 1", true, isNumber(-1));
assertEquals("ISNUMBER-True: 2", true, isNumber(-500));
assertEquals("ISNUMBER-True: 3", true, isNumber(15000));
assertEquals("ISNUMBER-True: 4", true, isNumber(0.35));
assertEquals("ISNUMBER-True: 5", true, isNumber(-10.35));
assertEquals("ISNUMBER-True: 6", true, isNumber(2.534e25));
assertEquals("ISNUMBER-True: 7", true, isNumber('2.534e25'));
assertEquals("ISNUMBER-True: 8", true, isNumber('52334'));
assertEquals("ISNUMBER-True: 9", true, isNumber('-234'));

assertEquals("ISNUMBER-False: 0", false, isNumber(NaN));
assertEquals("ISNUMBER-False: 1", false, isNumber({}));
assertEquals("ISNUMBER-False: 2", false, isNumber([]));
assertEquals("ISNUMBER-False: 3", false, isNumber(''));
assertEquals("ISNUMBER-False: 4", false, isNumber('one'));
assertEquals("ISNUMBER-False: 5", false, isNumber(true));
assertEquals("ISNUMBER-False: 6", false, isNumber(false));
assertEquals("ISNUMBER-False: 7", false, isNumber());
assertEquals("ISNUMBER-False: 8", false, isNumber(undefined));
assertEquals("ISNUMBER-False: 9", false, isNumber(null));

13
//testing data types accurately in JavaScript (opposed to "typeof")
//from http://bonsaiden.github.com/JavaScript-Garden/
function is(type, obj) {
    var clas = Object.prototype.toString.call(obj).slice(8, -1);
    return obj !== undefined && obj !== null && clas === type;
}

//basic usage
is('String', 'test'); // true
is('Array', true); // false

または、未知の型を返すようにそれを適応させます:

function realTypeOf(obj) {
    return Object.prototype.toString.call(obj).slice(8, -1);
}

//usage
realTypeOf(999); // 'Number'

2012年5月12日更新:JavaScriptでの 完全な例:A Better typeof


まだ改善の余地がありrealTypeOfます。realTypeOf(NaN) -> "Number"これはtypeof合意されたのと同じ動作ですが、理想からは程遠いです。
最大

9

次に、ゼロまたはnull文字列を追加して入力を数値または文字列に強制変換し、型付きの等価比較を行うという考え方に基づくアプローチを示します。

function is_number(x) { return x === x+0;  }
function is_string(x) { return x === x+""; }

いくつかの計り知れない理由で、x===x+0よりもパフォーマンスが良いようですx===+x

これが失敗するケースはありますか?

同じように:

function is_boolean(x) { return x === !!x; }

これは、穏やかに速くよりもどちらかのように見えるx===true || x===falsetypeof x==="boolean"(とはるかに高速よりx===Boolean(x))。

それからまたあります

function is_regexp(x)  { return x === RegExp(x); }

これらはすべて、任意の値に適用でき、問題の型の値を確実に生成できる、各型に固有の「同一性」操作の存在に依存します。このような日付の操作は考えられません。

NaNの場合、

function is_nan(x) { return x !== x;}

これは基本的にはアンダースコアのバージョンであり、現状ではの約4倍高速ですisNaN()が、アンダースコアソースのコメントでは、「NaNはそれ自体と等しくない唯一の数値」であり、_。isNumberのチェックが追加されています。どうして?他のどのオブジェクトが自分自身と等しくないでしょうか?また、アンダースコアは使用x !== +xしますが、どのような違いがありますか+ここでますか?

次に、偏執症のために:

function is_undefined(x) { return x===[][0]; }

またはこれ

function is_undefined(x) { return x===void(0); }

1
x!== + xは、最初にxを数値に変換しようとします。
エイドリアンバーソロミュー14

8

1で割り切れますか?

問題は「123ABG」のような文字列入力であると思います

var Check = "123ABG"

if(Check == Check / 1)
{
alert("This IS a number \n")
}

else
{
alert("This is NOT a number \n")
}

最近私がやった方法です。


それが数値の文字列である場合、trueを返すことを彼が望んでいるとは思わない。多分===を使用してください
Curtis

7

ええと、どうですか:

function IsString(obj) {
    return obj !== undefined && obj != null && obj.toLowerCase !== undefined;
}

数か月後にさらに検討した結果、これobjは、メソッド名またはプロパティ名がtoLowerCase定義されているオブジェクトであることのみを保証しています。私の答えは恥ずかしいです。トップ投票をご覧くださいtypeof


7

または単にの逆を使用しますisNaN()

if(!isNaN(data))
  do something with the number
else
  it is a string

そして、そうです、jQueryを使用する方が、お金を稼ぐの$.isNumeric()により楽しいです。


isNaN('123')引数は数値文字列で数値型ではありませんが、falseを
返し

6

varを文字列に変換すると、パフォーマンスが低下すると思います。少なくとも、最新のブラウザで実行されたこのテストでは、そうです。

パフォーマンスを気にするなら、私はこれを使います:

typeof str === "string" || str instanceof String

変数が文字列であるかどうかをチェックするため(使用する場合でもvar str = new String("foo")str instanceof String trueを返します)。

それが数字であるかどうかのチェックに関しては、私はネイティブのために行きisNaNます:; 関数。


5

jQueryはこれを使用します。

function isNumber(obj) {
  return !isNaN( parseFloat( obj ) ) && isFinite( obj );
}

4

このソリューションは、ここで発生した問題の多くを解決します!

これは、私がこれまで使用した中で最も信頼できる方法です。私はこれを発明しなかったし、どこで最初にそれを見つけたか思い出せない。しかし、それは他のテクニックが失敗するところで機能します:

// Begin public utility /getVarType/
// Returns 'Function', 'Object', 'Array',
// 'String', 'Number', 'Boolean', or 'Undefined'
getVarType = function ( data ){
  if (undefined === data ){ return 'Undefined'; }
  if (data === null ){ return 'Null'; }
  return {}.toString.call(data).slice(8, -1);
};  
// End public utility /getVarType/

正しさの例

var str = new String();
console.warn( getVarType(str) ); // Reports "String"    
console.warn( typeof str );      // Reports "object"

var num = new Number();
console.warn( getVarType(num) ); // Reports "Number"
console.warn( typeof num );      // Reports "object"

var list = [];
console.warn( getVarType( list ) ); // Reports "Array"
console.warn( typeof list );        // Reports "object"

2
そして、それは本当に遅いです。

あなたのデータを取得する場所Tarazaburoは、私は知りませんが、少しbenchmarkiningは順序である:
マイケルMikowski

これは「本当に遅い」とは思いません。100万回を超えるテスト速度で、typeofChromeのネイティブメソッドの速度(0.788秒と1.481秒)の半分以上です。改善された結果を考慮すると、これは確かに許容できるパフォーマンスです。なぜ「本当に遅い」と思いますか?多分それは-IE6 / 7/8で?しかし、これらのブラウザではすべてが「本当に遅い」のです。
Michael Mikowski 2013年

まあ、私はすでにベンチマークを行っていたのでそれを言った。jsperf.com/check-typeof-number-againで新しい小さなものをまとめるとtypeof100倍速くなりますが、何が欠けていますか?

タイプをチェックするとき、3m ops / sがほとんどのコードにとって問題ではないという事実を見逃しています。私はそれを「本当に遅い」とは決して言いません。私のベンチマークは次のようになりました:var i、k、start = + new Date(); for(i = 0; i <1000000; i ++){k = typeof( 'foo'); k = typeof(123.5); }; end = + new Date(); console.log(end-start);
マイケルミ


4

ほとんどの場合、typeofは私にとって非常にうまく機能します。あなたはifステートメントを使用して試すことができます

if(typeof x === 'string' || typeof x === 'number') {
    console.log("Your statement");
}

ここで、xは任意の変数名です


この答えは、最も賛成されたものに何を追加しますか?
Bartek Banachewicz 2016年

2
シンプルさと明快さ?
Tim Erickson、2016

3

私が見つけた正と負の数も考える最良の方法は次のとおりです: O'Reilly JavaScriptとDHTMLクックブック

function isNumber(elem) {
var str = elem.value;
var oneDecimal = false;
var oneChar = 0;
// make sure value hasn't cast to a number data type
str = str.toString( );
for (var i = 0; i < str.length; i++) {
    oneChar = str.charAt(i).charCodeAt(0);
    // OK for minus sign as first character
    if (oneChar =  = 45) {
        if (i =  = 0) {
            continue;
        } else {
            alert("Only the first character may be a minus sign.");
            return false;
        }
    }
    // OK for one decimal point
    if (oneChar =  = 46) {
        if (!oneDecimal) {
            oneDecimal = true;
            continue;
        } else {
            alert("Only one decimal is allowed in a number.");
            return false;
        }
    }
    // characters outside of 0 through 9 not OK
    if (oneChar < 48 || oneChar > 57) {
        alert("Enter only numbers into the field.");
        return false;
    }
}
return true;

}


3

えっ?正規表現を使うだけ!:)

function isInteger(val) {
  return val.match(/^[0-9]$/)
}

function isFloat(val) {
  return val.match(/^[0-9]*/\.[0-9]+$/)
}

3

typeofを含む '1234'のような文字列は 'string'を示し、その逆は起こり得ない(typeof 123は常に数値になる)ため、単純な正規表現を使用するのが最善です/^\-?\d+$/.test(var)。または、浮動小数点数、整数、負の数を照合するためのより高度な方法です/^[\-\+]?[\d]+\.?(\d+)?$/ 。重要な点.testは、varが文字列でない場合でも例外をスローせず、値は何でもかまいません。

var val, regex = /^[\-\+]?[\d]+\.?(\d+)?$/;

regex.test(val)       // false 
val = '1234';
regex.test(val)       // true
val = '-213';
regex.test(val)       // true
val = '-213.2312';
regex.test(val)       // true
val = '+213.2312';
regex.test(val)       // true
val = 123;
regex.test(val)       // true
val = new Number(123);
regex.test(val)       // true
val = new String('123');
regex.test(val)       // true
val = '1234e';
regex.test(val)       // false 
val = {};
regex.test(val)       // false 
val = false;
regex.test(val)       // false 
regex.test(undefined) // false 
regex.test(null)      // false 
regex.test(window)    // false 
regex.test(document)  // false 

実際の型を探している場合は、typeofだけで十分です。


3

@BitOfUniverseの答えはいいです、そして私は新しい方法を思いつきます:

function isNum(n) {
    return !isNaN(n/0);
}

isNum('')  // false
isNum(2)   // true
isNum('2k') // false
isNum('2')  //true

私は0配当できないことを知っていますが、ここで関数は完全に機能します。


2

型チェック

typeof演算子を使用して、変数のタイプを確認できます。

typeof variable

値チェック

以下のコードは、数値に対してはtrueを返し、それ以外に対してはfalseを返します。

!isNaN(+variable);

var variable = '123'; console.log(!isNaN(+ variable)); 文字列で数値型ではありませんが、真となります
JustAMartin

「123」は数字だからです!変数の型を知りたい場合は、typeof演算子を簡単に使用できます!@JustAMartin
Amir Fo

はい、しかし元々の質問は、文字列型の変数と数値型の変数を区別することでした。'123`は文字列のままです。123を渡す場合、答えは正しいはずですnumberが、「123」、「abc」、またはその他の引用符付きリテラルを渡す場合、それは文字列であり、数値に解析できるかどうかは関係ありません。
JustAMartin

@JustAMartin OK回答を編集しました。
Amir Fo

1

XOR演算を使用して、数値または文字列を検出できます。 数値^ 0は常に数値を出力として与え、文字列^ 0は出力として0を与えます。

Example: 
   1)  2 ^ 0 = 2
   2)  '2' ^ 0  = 2
   3)  'Str' ^ 0 = 0

1

シンプルで完全:

function isNumber(x) {
  return parseFloat(x) == x
};

テストケース:

console.log('***TRUE CASES***');
console.log(isNumber(0));
console.log(isNumber(-1));
console.log(isNumber(-500));
console.log(isNumber(15000));
console.log(isNumber(0.35));
console.log(isNumber(-10.35));
console.log(isNumber(2.534e25));
console.log(isNumber('2.534e25'));
console.log(isNumber('52334'));
console.log(isNumber('-234'));
console.log(isNumber(Infinity));
console.log(isNumber(-Infinity));
console.log(isNumber('Infinity'));
console.log(isNumber('-Infinity'));

console.log('***FALSE CASES***');
console.log(isNumber(NaN));
console.log(isNumber({}));
console.log(isNumber([]));
console.log(isNumber(''));
console.log(isNumber('one'));
console.log(isNumber(true));
console.log(isNumber(false));
console.log(isNumber());
console.log(isNumber(undefined));
console.log(isNumber(null));
console.log(isNumber('-234aa'));

0

単に使う

myVar.constructor == String

または

myVar.constructor == Number

オブジェクトまたはリテラルとして定義された文字列を処理して保存する場合は、ヘルパー関数を使用しないでください。



0

パーティーにとても遅れました。ただし、一部の入力が文字列または数値のいずれかであるかどうかを一度に確認したい場合は、次の方法で常にうまくいきます。

return !!Object.prototype.toString.call(input).match(/\[object (String|Number)\]/);

0

変数が数値であるかどうかのチェックでjsperfを作成しました。かなり面白いです!typeofには実際にパフォーマンスの用途があります。typeof数字以外のものを使用するとvariable.constructor、JavaScriptのデータ型の大部分がオブジェクトであるため、通常、速度は3分の1になります。数字は違います!

http://jsperf.com/jemiloii-fastest-method-to-check-if-type-is-a-number

typeof variable === 'number'| 最速| 「5」ではなく5などの数値が必要な場合
typeof parseFloat(variable) === 'number'| 最速| 5や '5'などの数値が必要な場合

isNaN()遅いですが、それほど遅くはありません。私はのために高い期待を持っていたparseIntし、parseFloat彼らは恐ろしく遅かったが、。


0

数字を検出するために、JavaScriptの次の文章:Douglas CrockfordによるGood Partsが関連します。

isFinite関数はNaNおよびInfinityを拒否するため、値を数値として使用できるかどうかを判断する最良の方法です。残念ながら、isFiniteはそのオペランドを数値に変換しようとするため、値が実際に数値でない場合は適切なテストではありません。独自のisNumber関数を定義することもできます。

var isNumber = function isNumber(value) { return typeof value === 'number' &&
            isFinite(value);
};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.