Periksa apakah variabel angka atau string dalam JavaScript

Jawaban:

442

Jika Anda berurusan dengan notasi literal, dan bukan konstruktor, Anda dapat menggunakan typeof :.

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

Jika Anda membuat angka dan string melalui konstruktor, seperti var foo = new String("foo"), Anda harus ingat bahwa typeofmungkin kembali objectuntuk foo.

Mungkin metode yang lebih mudah memeriksa jenis akan menggunakan metode yang ditemukan di underscore.js (sumber beranotasi dapat ditemukan di sini ),

var toString = Object.prototype.toString;

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

Ini mengembalikan boolean trueuntuk yang berikut:

_.isString("Jonathan"); // true
_.isString(new String("Jonathan")); // true
Sampson
sumber
69
yang mengatakan "string" dan "angka" masing
Thilo
27
Ini tidak benar! Ada dua kemungkinan representasi string. alert (typeof String baru ()) akan menampilkan "Objek". Lebih buruk lagi, javascript sesekali akan mengkonversi bolak-balik antara dua representasi di belakang layar untuk tujuan optimasi
George Mauer
3
@ George Menurut OP, hanya variabel yang ada yang akan diuji.
Sampson
3
Tentu, tetapi katakan saya memiliki fungsi isString (str) {return typeof str === 'string'} beberapa Java-convert dapat menggunakan metode saya seperti var myString = new String("stuff I like"); isString(myString)ini mengembalikan false. Juga, saya tidak yakin berapa lama konversi backgroiund berlangsung, saya tahu kapan saya memanggil "hai". Panjang, "hai" akan dikonversi menjadi objek, tidak yakin seberapa cepat ia akan dikonversi kembali atau jika itu pernah terikat ke variabel.
George Mauer
8
Benar, tetapi apakah Anda ingin tetap menggunakan objek String?
Félix Saparelli
211

Cara terbaik untuk melakukannya adalah menggunakan isNaNcasting tipe +:

Metode all-in yang diperbarui:

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

Menggunakan regex yang sama:

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
BitOfUniverse
sumber
21
Ini terlihat seperti solusi yang baik jika Anda ingin menghitung string yang diuraikan sebagai angka yang valid.
Trevor Burnham
2
FYI: nulldipaksa menjadi 0 dan mengembalikan true untukisNumber(null);
Edward
1
apa yang salah denganfunction is_number(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n);}
OneOfOne
1
Ini juga gagal untuk string seperti '123abc'.
ash
1
@ash Terima kasih, saya telah memperbarui solusi untuk mengatasi kasus ini juga.
BitOfUniverse
73

Cara terbaik yang saya temukan adalah memeriksa metode di string, yaitu:

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

atau jika Anda ingin melakukan sesuatu dengan memeriksa nomor untuk properti nomor,

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

Ini seperti "mengetik bebek", terserah Anda mana cara yang paling masuk akal. Saya tidak memiliki cukup karma untuk berkomentar, tetapi typeof gagal untuk string dan angka kotak, yaitu:

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

akan mengingatkan "objek".

Alokito
sumber
2
Saya menemukan ini lebih baik daripada typeofkarena selalu dapat menguji string, apakah objek primitif atau String. Anda hanya perlu menguji metode yang unik untuk jenis yang Anda inginkan.
ADTC
Dari perspektif seseorang yang harus memelihara kode, memilih jalur ini bisa membingungkan. "Mengapa mereka menggunakan substring dan tidak memberikan nilai apa pun? Logika bisnis apa yang saya lewatkan di sini?" Paling tidak, ini perlu dipasangkan dengan komentar yang menjelaskan logika yang terlibat.
Lemmings19
3
@ Lemmings19 Ini sebenarnya tidak memanggil metode substring, ia hanya memeriksa apakah x memiliki metode substring.
Alokito
1
Saya suka ide mengetik bebek semacam ini tetapi ini akan gagal untuk hal-hal seperti {substring:"hello"}. Saya tahu untuk tujuan saya, saya hanya menguji apa operasi spesifik yang perlu saya lakukan (modulus) lakukan untuk tipe yang saya perlu periksa (pada modulus string pengembalian tidak terdefinisi) kemudian memeriksa untuk itu daripada mendapatkan jenis itu.
Tadhg McDonald-Jensen
30

Anda sedang mencari 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"));

Lihat JavaScript isNaN () Berfungsi di MDN.

Jakob Gade
sumber
3
Saya merasa aneh bahwa mereka akan memilih operasi terbalik untuk nama metode. Tampaknya lebih intuitif untuk dipanggil isNumber ().
Nathan Taylor
12
Ini sebenarnya bukan operasi terbalik dari 'isNumber'. NaN adalah nilai khusus angka dalam javascript. isNaN mengonversi semua yang disediakan untuk menjadi nomor dan memeriksa apakah hasilnya NaN atau tidak. Untuk string seperti "25", Anda mendapatkan hasil yang salah.
Chetan Sastry
1
Saya baru saja menguji dengan "25" dan hasilnya salah - seperti yang saya harapkan.
Jakob Gade
2
NaN adalah nilai khusus dalam IEEE 754 Standard untuk Binary Floating-Point Arithmetic, bukan hanya JavaScript. (Ya, tepatnya: "9007199254740990 (yaitu, (2 ^ 53) -2) nilai" Not-a-Number "berbeda dari Standar IEEE diwakili dalam ECMAScript sebagai nilai NaN khusus tunggal." )
NickFitz
2
Ingatlah bahwa isNaNpengembalian falseuntuk null(tetapi trueuntuk undefined).
Toni
28

Periksa apakah nilainya berupa string literal atau objek String:

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

Tes unit:

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

Memeriksa nomornya serupa:

function isNumber(o) {
    return typeof o == "number" || (typeof o == "object" && o.constructor === Number);
}
snorbi
sumber
1
(o.constructor === String) dengan sendirinya tampaknya cukup, bahkan untuk string literal.
Chris Noe
2
Ini akan menyebabkan pengecualian jika o === null
TJ.
3
Saya menyukai solusi ini. Untuk menghindari pengecualian meskipun untuk kasus nol, gunakan o ["constructor"] alih-alih o.constructor
dreamerkumar
2
@VishalKumar Jadi ini adalah semua satu kebutuhan: function is (type, value) { return value["constructor"] === type; }?
ceving
22

Karena ES2015 cara yang benar untuk memeriksa apakah suatu variabel memiliki angka yang valid Number.isFinite(value)

Contoh:

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
adius
sumber
1
Ini tidak memiliki dukungan di Internet Explorer. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
davedeecoder
1
Tidak berfungsi pada String, yang merupakan pertanyaan asli.
Eric Grange
18

Coba ini,

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

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

if(isInteger("1a11")) {
   console.log( 'Integer' );
} else {
   console.log( 'Non Integer' );
}
</script>
adatapost
sumber
coba '-2'. itu mengembalikan false.
KChen
1
Mengapa Anda menyimpan (atau tidak mengedit) jawaban yang tidak berfungsi? ... Perhatikan, angka negatif juga bisa berupa bilangan bulat.
Ason
13

Cara terbaik untuk melakukan ini:

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

Ini memenuhi uji kasus berikut:

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));
Sitch
sumber
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

Atau sesuaikan untuk mengembalikan jenis yang tidak dikenal:

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

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

Pembaruan 12 Mei 2012: Contoh lengkap di Javascript: A Better typeof .

mrrena
sumber
Masih ada ruang untuk perbaikan realTypeOf: realTypeOf(NaN) -> "Number"perilaku yang sama seperti yang typeofdisepakati tetapi masih jauh dari ideal.
Maks
9

Berikut adalah pendekatan yang didasarkan pada gagasan untuk memaksa input ke angka atau string dengan menambahkan nol atau string nol, dan kemudian melakukan perbandingan kesetaraan yang diketik.

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

Untuk beberapa alasan yang tak terduga, x===x+0tampaknya berkinerja lebih baik daripadax===+x .

Apakah ada kasus di mana ini gagal?

Dalam nada yang sama:

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

Ini tampaknya sedikit lebih cepat daripada salah satu x===true || x===falseatau typeof x==="boolean"(dan jauh lebih cepat daripadax===Boolean(x) ).

Lalu ada juga

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

Semua ini tergantung pada keberadaan operasi "identitas" khusus untuk setiap jenis yang dapat diterapkan pada nilai apa pun dan secara andal menghasilkan nilai dari jenis yang dimaksud. Saya tidak bisa memikirkan operasi semacam itu untuk kencan.

Untuk NaN, ada

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

Ini pada dasarnya adalah versi garis bawah, dan seperti berdiri sekitar empat kali lebih cepat daripada isNaN(), tetapi komentar dalam sumber garis bawah menyebutkan bahwa "NaN adalah satu-satunya angka yang tidak sama dengan dirinya sendiri" dan menambahkan tanda centang untuk _.isNumber. Mengapa? Benda apa lagi yang tidak akan menyamai diri mereka sendiri? Juga, garis bawah menggunakan - x !== +xtetapi apa bedanya+ sini?

Kemudian untuk paranoid:

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

atau ini

function is_undefined(x) { return x===void(0); }
c-senyum
sumber
1
x! == + x upaya pertama untuk mengonversi x menjadi angka.
Adrian Bartholomew
8

Bisakah Anda membaginya dengan 1?

Saya berasumsi bahwa masalahnya adalah input string seperti: "123ABG"

var Check = "123ABG"

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

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

Hanya cara saya melakukannya baru-baru ini.

Luke
sumber
Saya tidak berpikir dia ingin kembali benar jika itu adalah serangkaian angka. Mungkin menggunakan ===
Curtis
7

eh, bagaimana kalau saja:

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

Setelah ditinjau lebih lanjut berbulan-bulan kemudian, jaminan ini hanya objobjek yang memiliki metode atau nama properti yang toLowerCaseditentukan. Saya malu dengan jawaban saya. Silakan lihat typeofsalah satu yang terpilih .

ZagNut
sumber
7

Atau cukup gunakan invert dari isNaN():

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

Dan ya, menggunakan jQuery $.isNumeric()lebih menyenangkan.

osomanden
sumber
isNaN('123')memberikan false, meskipun argumennya adalah string numerik dan bukan tipe numerik
JustAMartin
6

Saya pikir mengkonversi var ke string mengurangi kinerja, setidaknya tes ini dilakukan di browser terbaru.

Jadi jika Anda peduli tentang kinerja, saya akan, saya akan menggunakan ini:

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

untuk memeriksa apakah variabel tersebut adalah string (bahkan jika Anda menggunakan var str = new String("foo"),str instanceof String akan mengembalikan true).

Adapun memeriksa apakah itu nomor saya akan pergi untuk asli isNaN:; fungsi.

Roland
sumber
5

jQuery menggunakan ini:

function isNumber(obj) {
  return !isNaN( parseFloat( obj ) ) && isFinite( obj );
}
Bounasser Abdelwahab
sumber
4

Solusi ini menyelesaikan banyak masalah yang diangkat di sini!

Sejauh ini, ini adalah metode paling andal yang saya gunakan. Saya tidak menciptakan ini, dan tidak dapat mengingat di mana saya awalnya menemukannya. Tapi itu berfungsi ketika teknik lain gagal:

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

Contoh kebenaran

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"
Michael Mikowski
sumber
2
Dan itu sangat lambat.
Tarazaburo, saya tidak tahu dari mana Anda mendapatkan data Anda, tetapi benchmarking kecil ada di urutan:
Michael Mikowski
Saya tidak menemukan ini "sangat lambat". Menguji kecepatan lebih dari 1 juta iterasi, saya merasa tidak lebih buruk dari setengah kecepatan typeofmetode asli (0,788 vs 1,481) di Chrome. Ini tentu saja kinerja yang dapat diterima mengingat hasil yang ditingkatkan. Menurut Anda mengapa ini "sangat lambat?" Mungkin itu - di IE6 / 7/8? Tapi semuanya "sangat lambat" di browser tersebut.
Michael Mikowski
Yah, saya katakan itu karena saya sudah melakukan benchmarking. Kumpulkan yang baru di jsperf.com/check-typeof-number-again , dan typeof100x lebih cepat, apa yang saya lewatkan?
Anda melewatkan fakta bahwa 3m ops / s bukan masalah bagi sebagian besar kode saat memeriksa jenis. Saya tidak akan menyebut itu "sangat lambat" dengan ukuran apa pun. Benchmark saya terlihat seperti ini: var i, k, start = + Date baru (); untuk (i = 0; i <1000000; i ++) {k = typeof ('foo'); k = typeof (123.5); }; end = + Date baru (); console.log (akhir - mulai);
Michael Mikowski
4

typeof bekerja sangat baik bagi saya dalam banyak kasus. Anda dapat mencoba menggunakan pernyataan if

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

di mana x adalah nama variabel apa pun pilihan Anda

Tanah
sumber
Apa yang ditambahkan jawaban ini di atas yang paling banyak dipilih?
Bartek Banachewicz
2
Kesederhanaan dan kejelasan?
Tim Erickson
3

cara terbaik yang saya temukan yang juga memikirkan angka positif dan negatif adalah dari: O'Reilly Javascript dan 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;

}

Alex Peta
sumber
3

Errr? Cukup gunakan ekspresi reguler! :)

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

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

karena string seperti '1234' dengan typeof akan menampilkan 'string', dan kebalikannya tidak akan pernah terjadi (typeof 123 akan selalu berupa angka), yang terbaik adalah menggunakan regex sederhana /^\-?\d+$/.test(var). Atau yang lebih maju untuk mencocokkan float, bilangan bulat dan angka negatif, /^[\-\+]?[\d]+\.?(\d+)?$/ Sisi penting .testadalah bahwa ia TIDAK akan melempar pengecualian jika var bukan string, nilainya bisa apa saja.

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 

Jika Anda mencari tipe nyata, maka typeof saja yang akan dilakukan.

pocesar
sumber
3

@ Jawaban BitOfUniverse baik, dan saya menemukan cara baru:

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

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

Saya tahu 0tidak bisa dividen, tapi di sini fungsinya bekerja dengan sempurna.

towry
sumber
2

Ketik memeriksa

Anda dapat memeriksa jenis variabel dengan menggunakan typeofoperator:

typeof variable

Pengecekan nilai

Kode di bawah ini mengembalikan true untuk angka dan false untuk hal lain:

!isNaN(+variable);
Amir Fo
sumber
var variable = '123'; console.log (! isNaN (+ variabel)); memberi benar meskipun itu adalah string dan bukan tipe angka
JustAMartin
Karena '123' adalah angka! Jika Anda ingin mengetahui jenis variabelnya, Anda dapat dengan mudah menggunakan typeofoperator! @JustAMartin
Amir Fo
Ya, tetapi pertanyaan awal adalah untuk membedakan variabel tipe-string dari variabel tipe-angka. '123` masih berupa string. Jika saya melewati 123, jawabannya harus numbertetapi jika saya melewati '123' atau 'abc' atau literal lainnya yang dikutip, itu adalah string, dan tidak masalah apakah itu dapat diurai menjadi angka atau tidak.
JustAMartin
@JustAMartin Oke saya mengedit jawaban saya.
Amir Fo
1

Operasi XOR dapat digunakan untuk mendeteksi angka atau string. angka ^ 0 akan selalu memberikan angka sebagai output dan string ^ 0 akan memberikan 0 sebagai output.

Example: 
   1)  2 ^ 0 = 2
   2)  '2' ^ 0  = 2
   3)  'Str' ^ 0 = 0
Himanshu Shekhar
sumber
1

Sederhana dan menyeluruh:

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

Kasus uji:

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'));
MarredCheese
sumber
0

Cukup gunakan

myVar.constructor == String

atau

myVar.constructor == Number

jika Anda ingin menangani string yang didefinisikan sebagai objek atau literal dan menyimpan Anda tidak ingin menggunakan fungsi pembantu.

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

Sangat terlambat ke pesta; Namun, berikut ini selalu bekerja dengan baik untuk saya ketika saya ingin memeriksa apakah beberapa input adalah string atau angka dalam satu kesempatan.

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

Membuat jsperf pada pemeriksaan jika variabel adalah angka. Cukup menarik! typeof sebenarnya memiliki penggunaan kinerja. Menggunakan typeofuntuk apa pun selain angka, biasanya bergerak 1/3 kecepatan sebagai avariable.constructor karena mayoritas tipe data dalam javascript adalah Objects; angka tidak!

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

typeof variable === 'number'| tercepat | jika Anda ingin nomor, seperti 5, dan bukan '5'
typeof parseFloat(variable) === 'number' | tercepat | jika Anda ingin nomor, seperti 5, dan '5'

isNaN()lebih lambat, tapi tidak terlalu lambat. Saya memiliki harapan tinggi untuk parseIntdan parseFloat, namun mereka sangat lambat.

Jemiloii
sumber
0

Untuk mendeteksi angka, bagian berikut dari JavaScript: Bagian Baik oleh Douglas Crockford relevan:

Fungsi isFinite adalah cara terbaik untuk menentukan apakah suatu nilai dapat digunakan sebagai angka karena ia menolak NaN dan Infinity. Sayangnya, isFinite akan mencoba untuk mengubah operan menjadi angka, jadi itu bukan tes yang baik jika nilai sebenarnya bukan angka. Anda mungkin ingin mendefinisikan fungsi isNumber Anda sendiri:

var isNumber = function isNumber(value) { return typeof value === 'number' &&
            isFinite(value);
};
Stephen Niedzielski
sumber