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
가장 좋은 방법은 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
내가 찾은 가장 좋은 방법은 문자열에서 메소드를 확인하는 것입니다.
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));
"개체"에 경고합니다.
당신이 찾고있는 것 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 () 함수 를 참조하십시오 .
값이 문자열 리터럴 또는 문자열 객체인지 확인하십시오.
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);
}
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 .
다음은 0 또는 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); }
그냥 1로 나눌 수 있습니까?
이 문제는 "123ABG"와 같은 문자열 입력이라고 가정합니다.
var Check = "123ABG"
if(Check == Check / 1)
{
alert("This IS a number \n")
}
else
{
alert("This is NOT a number \n")
}
내가 최근에 한 방법.
어, 어때요?
function IsString(obj) {
return obj !== undefined && obj != null && obj.toLowerCase !== undefined;
}
몇 달 후 추가 검토를 거친 후에 obj
는 메소드 또는 특성 이름이 toLowerCase
정의 된 오브젝트 만 보장 됩니다. 나는 내 대답이 부끄럽습니다. 최고 투표를 참조하십시오 typeof
.
var를 문자열로 변환하면 성능이 저하된다고 생각 합니다. 최신 브라우저에서 수행 된 이 테스트 는 그렇게 보여줍니다.
따라서 성능에 관심이 있다면 다음을 사용합니다.
typeof str === "string" || str instanceof String
변수가 문자열 인 경우 확인하기 위해 (당신이 사용하는 경우에도 var str = new String("foo")
, str instanceof String
true를 돌려 준다).
숫자인지 확인하려면 네이티브로 이동하십시오 isNaN
. 함수.
또는 그냥 반전을 사용하십시오 isNaN()
:
if(!isNaN(data))
do something with the number
else
it is a string
그리고 예, jQuery를 사용하는 $.isNumeric()
것이 더 재미 있습니다.
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"
참고로 jQuery를 사용하는 경우 참고하십시오.
$.isNumeric()
이것을 처리합니다. http://api.jquery.com/jQuery.isNumeric/ 에 대한 자세한 내용
typeof는 대부분의 경우 나에게 매우 잘 작동합니다. if 문을 사용해보십시오
if(typeof x === 'string' || typeof x === 'number') {
console.log("Your statement");
}
여기서 x는 선택한 변수 이름입니다.
내가 찾은 가장 좋은 방법은 양수와 음수를 생각하는 것입니다 : O'Reilly Javascript and DHTML Cookbook :
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'이 표시되고 역수가 발생할 수 없으므로 (123의 유형은 항상 숫자 임) 가장 간단한 정규 표현식을 사용하는 것이 가장 좋습니다 /^\-?\d+$/.test(var)
. 또는 부동 소수점, 정수 및 음수를 일치시키는 고급 기능입니다 /^[\-\+]?[\d]+\.?(\d+)?$/
. 중요한 측면은 .test
var가 문자열이 아닌 경우 예외를 throw하지 않으며 값이 무엇이든 될 수 있다는 것입니다.
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 만 가능합니다.
@BitOfUniverse의 대답은 좋으며 새로운 방법을 생각해 냈습니다.
function isNum(n) {
return !isNaN(n/0);
}
isNum('') // false
isNum(2) // true
isNum('2k') // false
isNum('2') //true
0
배당 할 수 없다는 것을 알고 있지만 여기서는 완벽하게 작동합니다.
아래 코드는 숫자에 대해서는 true를, 다른 것에 대해서는 false를 반환합니다.
!isNaN(+variable);
XOR 연산을 사용하여 숫자 또는 문자열을 감지 할 수 있습니다. number ^ 0은 항상 숫자를 출력으로 제공하고 string ^ 0은 0을 출력으로 제공합니다.
Example:
1) 2 ^ 0 = 2
2) '2' ^ 0 = 2
3) 'Str' ^ 0 = 0
간단히 사용
myVar.constructor == String
또는
myVar.constructor == Number
객체 또는 리터럴로 정의 된 문자열을 처리하고 저장하려면 도우미 함수를 사용하고 싶지 않습니다.
function IsNumeric(num) {
return ((num >=0 || num < 0)&& (parseInt(num)==num) );
}
파티에 매우 늦었다. 그러나 다음 입력은 한 번의 입력으로 문자열 또는 숫자인지 확인하려는 경우 항상 잘 작동했습니다.
return !!Object.prototype.toString.call(input).match(/\[object (String|Number)\]/);
변수가 숫자인지 확인하는 jsperf를 작성했습니다. 꽤 흥미로운! typeof는 실제로 성능을 사용합니다. typeof
숫자 이외의 다른 것을 사용하면 variable.constructor
자바 스크립트의 대부분의 데이터 유형이 Objects 이므로 일반적으로 1/3의 속도를냅니다 . 숫자는 아닙니다!
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);
};
이것에 대해 당신은 무엇을합니까?
const numberOrString='10'
const isNumber = !isNaN(numberOrString*1)
참고 URL : https://stackoverflow.com/questions/1303646/check-whether-variable-is-number-or-string-in-javascript
'Programing' 카테고리의 다른 글
방법 : C #에서 명령 줄 실행, STD OUT 결과 가져 오기 (0) | 2020.02.17 |
---|---|
플랫폼이 동일하더라도 "잘못된 형식의 프로그램을로드하려고했습니다" (0) | 2020.02.17 |
자바 스크립트에서 문자열을 여러 구분 기호로 분리하려면 어떻게합니까? (0) | 2020.02.17 |
주어진 두 날짜 사이의 일 수를 계산하는 방법은 무엇입니까? (0) | 2020.02.17 |
메소드 이름과 줄 번호를 인쇄하고 조건부로 NSLog를 비활성화하는 방법은 무엇입니까? (0) | 2020.02.17 |