JavaScriptで変数が数値か文字列かを確認する方法を知っている人はいますか?
JavaScriptで変数が数値か文字列かを確認する方法を知っている人はいますか?
回答:
リテラル表記でコンストラクタではない場合は、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
var myString = new String("stuff I like"); isString(myString)
falseを返すことがあります。また、バックグラウンド変換がどのくらい続くか正確にわかりません。「hi」を呼び出したときにわかります。長さ、「hi」はオブジェクトに変換されます。再び変換されるまで、またはバインドされているかどうかはわかりません。変数に。
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
null
0に強制変換され、Trueを返すisNumber(null);
function is_number(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n);}
私が見つけた最良の方法は、文字列のメソッドをチェックすることです。つまり、
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));
「オブジェクト」に警告します。
typeof
、プリミティブオブジェクトでもStringオブジェクトでも、常に文字列をテストできるので、これよりも優れていると思います。必要なタイプに固有のメソッドをテストするだけです。
{substring:"hello"}
ですが、のようなものには失敗します。私は目的のために、チェックする必要がある型に対して(モジュラス)実行する必要のある特定の操作をテストしたことを知っています(文字列ではモジュラスは未定義を返します)、その型を取得する代わりにそれをチェックしました。
あなたが探しています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()関数を参照してください。
isNaN
リターンfalse
のためにnull
(ただしtrue
用undefined
)。
値が文字列リテラルまたは文字列オブジェクトかどうかを確認します。
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);
}
function is (type, value) { return value["constructor"] === type; }
。
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
これを試して、
<script>
var regInteger = /^-?\d+$/;
function isInteger( str ) {
return regInteger.test( str );
}
if(isInteger("1a11")) {
console.log( 'Integer' );
} else {
console.log( 'Non Integer' );
}
</script>
これを行う最良の方法:
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));
//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
合意されたのと同じ動作ですが、理想からは程遠いです。
次に、ゼロまたは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===false
かtypeof 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); }
jQueryはこれを使用します。
function isNumber(obj) {
return !isNaN( parseFloat( obj ) ) && isFinite( obj );
}
このソリューションは、ここで発生した問題の多くを解決します!
これは、私がこれまで使用した中で最も信頼できる方法です。私はこれを発明しなかったし、どこで最初にそれを見つけたか思い出せない。しかし、それは他のテクニックが失敗するところで機能します:
// 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"
typeof
Chromeのネイティブメソッドの速度(0.788秒と1.481秒)の半分以上です。改善された結果を考慮すると、これは確かに許容できるパフォーマンスです。なぜ「本当に遅い」と思いますか?多分それは-IE6 / 7/8で?しかし、これらのブラウザではすべてが「本当に遅い」のです。
typeof
100倍速くなりますが、何が欠けていますか?
ほとんどの場合、typeofは私にとって非常にうまく機能します。あなたはifステートメントを使用して試すことができます
if(typeof x === 'string' || typeof x === 'number') {
console.log("Your statement");
}
ここで、xは任意の変数名です
私が見つけた正と負の数も考える最良の方法は次のとおりです: 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;
}
えっ?正規表現を使うだけ!:)
function isInteger(val) {
return val.match(/^[0-9]$/)
}
function isFloat(val) {
return val.match(/^[0-9]*/\.[0-9]+$/)
}
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だけで十分です。
typeof
演算子を使用して、変数のタイプを確認できます。
typeof variable
以下のコードは、数値に対してはtrueを返し、それ以外に対してはfalseを返します。
!isNaN(+variable);
typeof
演算子を簡単に使用できます!@JustAMartin
number
が、「123」、「abc」、またはその他の引用符付きリテラルを渡す場合、それは文字列であり、数値に解析できるかどうかは関係ありません。
XOR演算を使用して、数値または文字列を検出できます。 数値^ 0は常に数値を出力として与え、文字列^ 0は出力として0を与えます。
Example:
1) 2 ^ 0 = 2
2) '2' ^ 0 = 2
3) 'Str' ^ 0 = 0
シンプルで完全:
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'));
変数が数値であるかどうかのチェックで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
彼らは恐ろしく遅かったが、。
数字を検出するために、JavaScriptの次の文章:Douglas CrockfordによるGood Partsが関連します。
isFinite関数はNaNおよびInfinityを拒否するため、値を数値として使用できるかどうかを判断する最良の方法です。残念ながら、isFiniteはそのオペランドを数値に変換しようとするため、値が実際に数値でない場合は適切なテストではありません。独自のisNumber関数を定義することもできます。
var isNumber = function isNumber(value) { return typeof value === 'number' &&
isFinite(value);
};