有人知道在JavaScript中如何检查一个变量是数字还是字符串吗?
有人知道在JavaScript中如何检查一个变量是数字还是字符串吗?
如果你正在处理字面量符号,而不是构造函数,你可以使用typeof:
typeof "Hello World"; // string
typeof 123; // number
var foo = new String("foo")
,则应记住typeof
可能会返回object
用于foo
。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".length 时,"hi"被转换为一个对象,不确定它何时再次转换回去,或者是否与变量绑定。 - George Mauer最佳做法是使用 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,并且对于 isNumber(null)
返回真。 - Edwardfunction is_number(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n);}
有什么问题? - OneOfOne我发现最好的方法是检查字符串上的方法,例如:
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
更好,因为它可以始终测试字符串,无论是原始字符串还是字符串对象。你只需要测试所需类型的唯一方法即可。 - ADTC{substring:"hello"}
这样的东西会失效。我知道为了我的目的,我只需测试我需要执行的具体操作(模数)在我需要检查的类型上所做的操作(对于字符串模数返回未定义),然后检查它而不是获取它的类型。 - Tadhg McDonald-Jensen从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
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
对于 null
返回 false
(但对于 undefined
返回 true
)。 - Toni检查一个值是字符串文字还是String对象:
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; }
? - ceving试试这个:
<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(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'));
最佳执行方法:
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
的行为相同,但仍远非理想。 - Max