Kiểm tra xem biến là số hay chuỗi trong JavaScript


Câu trả lời:


442

Nếu bạn đang xử lý ký hiệu theo nghĩa đen và không phải là nhà xây dựng, bạn có thể sử dụng typeof :.

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

Nếu bạn đang tạo số và chuỗi thông qua một nhà xây dựng, chẳng hạn như var foo = new String("foo"), bạn nên ghi nhớ rằng typeofcó thể trở lại objectcho foo.

Có lẽ một phương pháp kiểm tra loại dễ kiểm soát hơn sẽ là sử dụng phương thức được tìm thấy trong underscore.js (nguồn chú thích có thể được tìm thấy ở đây ),

var toString = Object.prototype.toString;

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

Điều này trả về một boolean truecho sau:

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

69
tương ứng là "chuỗi" và "số"
Thilo

27
Điều này LAF không đúng! Có hai biểu diễn có thể có của một chuỗi. alert (typeof new String ()) sẽ xuất ra "Object". Tồi tệ hơn, javascript đôi khi sẽ chuyển đổi qua lại giữa hai đại diện phía sau hậu trường cho mục đích tối ưu hóa
George Mauer

3
@George Theo OP, chỉ các biến hiện có sẽ được kiểm tra.
Sampson

3
Chắc chắn, nhưng nói rằng tôi có hàm isString (str) {return typeof str === 'string'} một số chuyển đổi Java có thể đang sử dụng phương thức của tôi như thế var myString = new String("stuff I like"); isString(myString)này để trả về false. Ngoài ra, tôi không chắc chắn chính xác việc chuyển đổi backgroiund kéo dài bao lâu, tôi biết khi tôi gọi "hi" .length, "hi" được chuyển đổi thành một đối tượng, không chắc là nó sẽ được chuyển đổi trở lại sớm bao lâu hoặc nếu điều đó bị ràng buộc đến biến.
George Mauer

8
Đúng, nhưng dù sao bạn cũng muốn sử dụng đối tượng String?
Félix Saparelli

211

Cách tốt nhất để làm điều đó là sử dụng isNaNkiểu đúc +:

Cập nhật phương pháp tất cả trong:

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

Sử dụng regex tương tự:

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
Đây có vẻ là một giải pháp tốt nếu bạn muốn đếm các chuỗi phân tích thành số hợp lệ.
Trevor Burnham

2
FYI: nullbị ép buộc thành 0 và trả về đúng choisNumber(null);
Edward

1
có chuyện gì vớifunction is_number(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n);}
OneOfOne

1
Điều này cũng thất bại đối với một chuỗi như '123abc'.
tro

1
@ash Cảm ơn, tôi cũng đã cập nhật giải pháp cho trường hợp này.
BitOfUniverse

73

Cách tốt nhất mà tôi đã tìm thấy là kiểm tra một phương thức trên chuỗi, tức là:

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

hoặc nếu bạn muốn làm gì đó với số kiểm tra cho một thuộc tính số,

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

Điều này giống như "gõ vịt", tùy thuộc vào bạn, cách nào có ý nghĩa nhất. Tôi không có đủ nghiệp lực để bình luận, nhưng typeof thất bại cho các chuỗi và số được đóng hộp, tức là:

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

sẽ cảnh báo "đối tượng".


2
Tôi thấy điều này tốt hơn typeofvì nó luôn có thể kiểm tra một chuỗi, cho dù là đối tượng nguyên thủy hay chuỗi. Bạn chỉ cần kiểm tra một phương thức duy nhất cho loại bạn muốn.
ADTC

Từ quan điểm của một người phải duy trì mã, việc chọn đường dẫn này có thể gây nhầm lẫn. "Tại sao họ sử dụng chuỗi con và không vượt qua bất kỳ giá trị nào? Tôi thiếu logic kinh doanh nào ở đây?" Ít nhất, điều này cần phải được kết hợp với một bình luận giải thích logic liên quan.
Lemmings19

3
@ Lemmings19 Nó không thực sự gọi phương thức chuỗi con, nó chỉ kiểm tra xem x có phương thức chuỗi con hay không.
Alokito

1
Tôi thích ý tưởng về kiểu gõ vịt này nhưng điều này sẽ thất bại cho những thứ như thế {substring:"hello"}. Tôi biết với mục đích của mình, tôi chỉ kiểm tra thao tác cụ thể mà tôi cần thực hiện (mô đun) làm gì cho loại tôi cần kiểm tra (trên mô đun chuỗi trả về không xác định) sau đó kiểm tra xem thay vì lấy loại đó.
Tadhg McDonald-Jensen

30

Bạn đang tìm kiếm 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"));

Xem Hàm JavaScript isNaN () tại MDN.


3
Tôi thấy lạ là họ sẽ chọn thao tác nghịch đảo cho tên phương thức. Có vẻ trực quan hơn để gọi isNumber ().
Nathan Taylor

12
Nó không thực sự là một hoạt động nghịch đảo của 'isNumber'. NaN là một giá trị đặc biệt của số trong javascript. isNaN chuyển đổi mọi thứ được cung cấp cho nó thành số và kiểm tra xem kết quả có phải là NaN hay không. Đối với các chuỗi như "25", bạn nhận được kết quả không chính xác.
Chastan

1
Tôi vừa thử nghiệm với "25" và nó trả về sai - như tôi mong đợi.
Jakob Gade

2
NaN là một giá trị đặc biệt trong Tiêu chuẩn IEEE 754 cho Số học dấu phẩy động nhị phân, không chỉ là một thứ JavaScript. (Vâng, để được chính xác: "các 9007199254740990 (có nghĩa là, (2 ^ 53) -2) riêng biệt‘Không-một-số’giá trị của các tiêu chuẩn IEEE được trình bày trong ECMAScript là một giá trị duy nhất đặc biệt NaN." )
NickFitz

2
Hãy nhớ rằng isNaNtrả về falsecho null(nhưng truecho undefined).
Toni

28

Kiểm tra xem giá trị là một chuỗi ký tự hoặc đối tượng Chuỗi:

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

Bài kiểm tra đơn vị:

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");

Kiểm tra một số tương tự:

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

1
(o.constructor === String) dường như là đủ, ngay cả đối với các chuỗi ký tự.
Chris Noe

2
Điều này sẽ gây ra ngoại lệ nếu o === null
TJ.

3
Tôi yêu giải pháp này. Để tránh trường hợp ngoại lệ cho trường hợp null, hãy sử dụng o ["constructor"] thay vì o.constructor
dreamerkumar

2
@VishalKumar Vậy đây là tất cả một nhu cầu : function is (type, value) { return value["constructor"] === type; }?
ceving

22

Kể từ ES2015, cách chính xác để kiểm tra xem một biến có giữ số hợp lệ không Number.isFinite(value)

Ví dụ:

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
Điều này không có hỗ trợ trên Internet Explorer. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
Khăn

1
Không hoạt động trên String, đó là câu hỏi ban đầu.
Eric Grange

18

Thử cái này,

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

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

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

thử '-2'. nó trả về sai
KChen

1
Tại sao bạn giữ (hoặc không chỉnh sửa) một câu trả lời không hoạt động? ... Xin lưu ý, số âm cũng có thể là số nguyên.
Ason

13

Cách tốt nhất để làm điều này:

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

Điều này thỏa mãn các trường hợp thử nghiệm sau:

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

Hoặc điều chỉnh nó để trả về một kiểu không xác định:

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

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

Ngày 12 tháng 5 năm 2012 Cập nhật: Ví dụ đầy đủ tại Javascript: Loại tốt hơn .


Vẫn còn chỗ để cải thiện liên quan realTypeOf: realTypeOf(NaN) -> "Number"đó là hành vi tương tự như typeofđã thỏa thuận nhưng vẫn còn xa lý tưởng.
Tối đa

9

Đây là một cách tiếp cận dựa trên ý tưởng ép đầu vào vào một số hoặc chuỗi bằng cách thêm chuỗi 0 hoặc chuỗi rỗng, sau đó thực hiện so sánh bằng nhau được gõ.

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

Đối với một số lý do không thể hiểu được, x===x+0dường như thực hiện tốt hơn x===+x.

Có trường hợp nào thất bại?

Trong cùng một tĩnh mạch:

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

Điều này dường như nhanh hơn một chút x===true || x===falsehoặc typeof x==="boolean"(và nhanh hơn nhiều x===Boolean(x)).

Rồi cũng có

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

Tất cả những điều này phụ thuộc vào sự tồn tại của một hoạt động "nhận dạng" cụ thể cho từng loại có thể được áp dụng cho bất kỳ giá trị nào và tạo ra một giá trị của loại được đề cập một cách đáng tin cậy. Tôi không thể nghĩ về một hoạt động như vậy cho ngày.

Đối với NaN, có

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

Đây về cơ bản là phiên bản của gạch dưới và vì nó nhanh hơn khoảng bốn lần isNaN(), nhưng các ý kiến ​​trong nguồn gạch dưới đề cập rằng "NaN là số duy nhất không bằng chính nó" và thêm một kiểm tra cho _.isNumber. Tại sao? Những đối tượng khác sẽ không bằng chính họ? Ngoài ra, gạch dưới sử dụng - x !== +xnhưng sự khác biệt có thể +ở đây là gì?

Sau đó cho hoang tưởng:

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

hoặc cái này

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

1
x! == + x lần đầu tiên cố gắng chuyển x thành số.
Adrian Bartholomew

8

Bạn chỉ có thể chia nó cho 1?

Tôi giả sử vấn đề sẽ là một chuỗi đầu vào như: "123ABG"

var Check = "123ABG"

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

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

Chỉ là một cách tôi đã làm nó gần đây.


Tôi không nghĩ anh ấy muốn nó trở lại đúng nếu đó là một chuỗi số. Có thể sử dụng ===
Curtis

7

ừ, thế còn

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

Sau khi xem xét thêm nhiều tháng sau đó, bảo đảm này chỉ objlà một đối tượng có tên phương thức hoặc thuộc tính toLowerCaseđược xác định. Tôi xấu hổ về câu trả lời của tôi. Xin vui lòng xem typeofmột trong những bình chọn hàng đầu .


7

Hoặc chỉ sử dụng đảo ngược của isNaN():

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

Và vâng, sử dụng jQuery $.isNumeric()là thú vị hơn cho buck.


isNaN('123')cho sai, mặc dù đối số là một chuỗi số và không phải là kiểu số
JustAMartin

6

Tôi nghĩ rằng việc chuyển đổi var thành một chuỗi làm giảm hiệu suất, ít nhất thử nghiệm này được thực hiện trong các trình duyệt mới nhất cho thấy như vậy.

Vì vậy, nếu bạn quan tâm đến hiệu suất, tôi sẽ, tôi sẽ sử dụng điều này:

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

để kiểm tra xem biến có phải là một chuỗi không (ngay cả khi bạn sử dụng var str = new String("foo"), str instanceof Stringsẽ trả về true).

Để kiểm tra xem đó có phải là số tôi sẽ dùng cho người bản địa không : isNaN; chức năng.


5

jQuery sử dụng điều này:

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

4

Giải pháp này giải quyết nhiều vấn đề được nêu ra ở đây!

Đây là phương pháp đáng tin cậy nhất mà tôi đã sử dụng cho đến nay. Tôi đã không phát minh ra điều này, và không thể nhớ lại nơi tôi đã tìm thấy nó ban đầu. Nhưng nó hoạt động khi các kỹ thuật khác thất bại:

// 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/

Ví dụ về tính đúng đắn

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
Và nó rất chậm.

Tarazaburo, tôi không biết bạn lấy dữ liệu ở đâu, nhưng một chút điểm chuẩn là theo thứ tự:
Michael Mikowski

Tôi không thấy điều này "thực sự chậm". Thử nghiệm tốc độ hơn 1 triệu lần lặp, tôi thấy nó không typeofthua kém một nửa tốc độ của phương thức gốc (0,788 so với 1,481 giây) trên Chrome. Đây chắc chắn là hiệu suất chấp nhận được khi xem xét kết quả được cải thiện. Tại sao bạn nghĩ rằng nó "thực sự chậm?" Có lẽ đó là - trong IE6 / 7/8? Nhưng mọi thứ đều "rất chậm" trong các trình duyệt đó.
Michael Mikowski

Vâng, tôi đã nói rằng bởi vì tôi đã thực hiện điểm chuẩn. Kết hợp một cái nhỏ mới tại jsperf.com/check-typeof-number-againtypeofnhanh hơn 100 lần, tôi còn thiếu điều gì?

Bạn đang thiếu thực tế rằng 3 ops / s không phải là vấn đề đối với hầu hết các mã khi kiểm tra loại. Tôi sẽ không gọi đó là "thực sự chậm" bằng bất kỳ biện pháp nào. Điểm chuẩn của tôi trông như thế này: var i, k, start = + new Date (); for (i = 0; i <1000000; i ++) {k = typeof ('foo'); k = typeof (123,5); }; kết thúc = + ngày mới (); console.log (kết thúc - bắt đầu);
Michael Mikowski


4

typeof hoạt động rất tốt cho tôi trong hầu hết các trường hợp. Bạn có thể thử sử dụng câu lệnh if

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

Trong đó x là bất kỳ tên biến nào bạn chọn


Câu trả lời này thêm gì vào câu trả lời nhiều nhất?
Bartek Banachewicz

2
Đơn giản và rõ ràng?
Tim Erickson

3

cách tốt nhất tôi tìm thấy cũng nghĩ về số dương và số âm là từ: O'Reilly Javascript và 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;

}


3

Ơ? Chỉ cần sử dụng các biểu thức thông thường! :)

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

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

3

vì một chuỗi là '1234' với typeof sẽ hiển thị 'chuỗi' và điều ngược lại không bao giờ xảy ra (kiểu 123 sẽ luôn là số), tốt nhất là sử dụng biểu thức chính quy đơn giản /^\-?\d+$/.test(var). Hoặc nâng cao hơn để khớp với số float, số nguyên và số âm, /^[\-\+]?[\d]+\.?(\d+)?$/ Mặt quan trọng của .testnó là KHÔNG ném ngoại lệ nếu var không phải là một chuỗi, giá trị có thể là bất cứ thứ gì.

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 

Nếu bạn đang tìm kiếm loại thực, thì một mình typeof sẽ làm.


3

Câu trả lời của @ BitOfUniverse là tốt và tôi nghĩ ra một cách mới:

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

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

Tôi biết 0không thể chia cổ tức, nhưng ở đây chức năng hoạt động hoàn hảo.


2

Kiểm tra loại

Bạn có thể kiểm tra loại biến bằng cách sử dụng typeoftoán tử:

typeof variable

Kiểm tra giá trị

Mã dưới đây trả về true cho các số và false cho bất kỳ thứ gì khác:

!isNaN(+variable);

biến var = '123'; console.log (! isNaN (+ biến)); cho đúng mặc dù nó là một chuỗi và không phải là một loại số
JustAMartin

Bởi vì '123' là một con số! Nếu bạn muốn biết loại biến, Bạn có thể dễ dàng sử dụng typeoftoán tử! @JustAMartin
Amir cho

Có, nhưng câu hỏi ban đầu là phân biệt bất kỳ biến được gõ chuỗi nào với các biến được gõ số. '123` vẫn là một chuỗi. Nếu tôi vượt qua 123, câu trả lời sẽ là numbernhưng nếu tôi vượt qua '123' hoặc 'abc' hoặc bất kỳ chữ được trích dẫn nào khác, thì đó là một chuỗi và không thành vấn đề nếu nó có thể được phân tích thành một số hay không.
JustAMartin

@JustAMartin Ok tôi đã chỉnh sửa câu trả lời của mình.
Amir cho

1

Hoạt động XOR có thể được sử dụng để phát hiện số hoặc chuỗi. số ^ 0 sẽ luôn cho số là đầu ra và chuỗi ^ 0 sẽ cho 0 là đầu ra.

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

1

Đơn giản và kỹ lưỡng:

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

Các trường hợp thử nghiệm:

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

Đơn giản chỉ cần sử dụng

myVar.constructor == String

hoặc là

myVar.constructor == Number

nếu bạn muốn xử lý các chuỗi được xác định là đối tượng hoặc bằng chữ và tiết kiệm, bạn không muốn sử dụng chức năng trợ giúp.


0
function IsNumeric(num) {
    return ((num >=0 || num < 0)&& (parseInt(num)==num) );
}

0

Đến bữa tiệc rất muộn; tuy nhiên, những điều sau đây luôn hoạt động tốt với tôi khi tôi muốn kiểm tra xem một số đầu vào là một chuỗi hay một số trong một lần chụp.

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

0

Tạo một jsperf khi kiểm tra nếu một biến là một số. Khá thú vị! typeof thực sự có một hiệu suất sử dụng. Sử dụng typeofcho bất cứ thứ gì ngoài số, thường có tốc độ bằng 1/3 variable.constructorvì phần lớn các loại dữ liệu trong javascript là Đối tượng; con số thì không!

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

typeof variable === 'number'| nhanh nhất | nếu bạn muốn một số, chẳng hạn như 5, chứ không phải '5'
typeof parseFloat(variable) === 'number'| nhanh nhất | nếu bạn muốn một số, chẳng hạn như 5 và '5'

isNaN()chậm hơn, nhưng không chậm hơn nhiều Tôi đã hy vọng rất cao parseIntparseFloat, tuy nhiên chúng chậm kinh khủng.


0

Để phát hiện các con số, đoạn văn sau từ JavaScript: Các bộ phận tốt của Douglas Crockford có liên quan:

Hàm isFinite là cách tốt nhất để xác định xem một giá trị có thể được sử dụng làm số hay không vì nó từ chối NaN và Infinity. Thật không may, isFinite sẽ cố gắng chuyển đổi toán hạng của nó thành một số, vì vậy đây không phải là một thử nghiệm tốt nếu một giá trị không thực sự là một số. Bạn có thể muốn xác định hàm isNumber của riêng mình:

var isNumber = function isNumber(value) { return typeof value === 'number' &&
            isFinite(value);
};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.