"foo" instanceof String //=> false
"foo" instanceof Object //=> false
true instanceof Boolean //=> false
true instanceof Object //=> false
false instanceof Boolean //=> false
false instanceof Object //=> false
// the tests against Object really don't make sense
Array literal dan Object literals match ...
[0,1] instanceof Array //=> true
{0:1} instanceof Object //=> true
Kenapa tidak semuanya? Atau, mengapa mereka semua tidak ?
Dan, apa yang mereka contoh?
Sama di FF3, IE7, Opera, dan Chrome. Jadi, setidaknya konsisten.
Kehilangan beberapa.
12.21 instanceof Number //=> false
/foo/ instanceof RegExp //=> true
javascript
literals
instanceof
Jonathan Lonowski
sumber
sumber
(new String()).valueOf();
typeof foo === 'string'
tidak cukup: lihat jawaban axkibe.typeof new String('')
pengembalian"object"
Saya menggunakan:
Karena dalam JavaScript string dapat berupa literal atau objek.
sumber
function isString(s) { return s.constructor === String; }
Berfungsi untuk literal dan objek string (setidaknya dalam V8)typeof
.Dalam JavaScript, segala sesuatu adalah objek (atau setidaknya dapat dianggap sebagai objek), kecuali primitif (boolean, null, angka, string, dan nilainya
undefined
(dan simbol dalam ES6)):Seperti yang Anda lihat objek, array dan nilainya
null
semua dianggap objek (null
adalah referensi ke objek yang tidak ada). Fungsi dibedakan karena mereka adalah tipe khusus objek yang bisa dipanggil . Namun mereka masih obyek.Di sisi lain literal
true
,0
,""
danundefined
tidak objek. Mereka adalah nilai primitif dalam JavaScript. Namun boolean, angka dan string juga memiliki konstruktorBoolean
,Number
danString
masing - masing yang membungkus primitif masing-masing untuk memberikan fungsionalitas tambahan:Seperti yang Anda lihat ketika nilai primitif dibungkus di dalam
Boolean
,Number
danString
konstruktor masing-masing menjadi objek. Theinstanceof
Operator hanya bekerja untuk benda (yang mengapa ia mengembalikanfalse
nilai-nilai primitif):Seperti yang Anda lihat keduanya
typeof
daninstanceof
tidak cukup untuk menguji apakah suatu nilai adalah boolean, angka atau string -typeof
hanya berfungsi untuk boolean primitif, angka dan string; daninstanceof
tidak berfungsi untuk boolean primitif, angka, dan string.Untungnya ada solusi sederhana untuk masalah ini. Implementasi default
toString
(yaitu seperti yang didefinisikan secara bawaanObject.prototype.toString
) mengembalikan[[Class]]
properti internal dari kedua nilai primitif dan objek:[[Class]]
Properti internal suatu nilai jauh lebih bermanfaat daripadatypeof
nilai itu. Kita dapat menggunakanObject.prototype.toString
untuk membuat versitypeof
operator kami sendiri (lebih bermanfaat) sebagai berikut:Semoga artikel ini membantu. Untuk mengetahui lebih lanjut tentang perbedaan antara primitif dan objek terbungkus, baca posting blog berikut: Kehidupan Rahasia Primitif JavaScript
sumber
null
juga merupakan nilai primitif (hanyatypeof
operator yang membingungkan)Anda dapat menggunakan properti konstruktor:
sumber
String
danBoolean
dalam contoh di atas, jadi jika Anda mengujiconstructor
properti variabel string yang dibuat di jendela lain (seperti popup atau bingkai) itu tidak akan sama dengan sederhanaString
, itu akan sama denganthatOtherWindowsName.String
.Object.prototype.toString.call('foo') === '[object String]'
d.constructor == String
? Misalnya dengan operator kesetaraan longgar.Anda dapat menggunakan ini, ini akan berfungsi untuk kedua kasus
var text="foo";
// typeof akan bekerjaString text= new String("foo");
// instanceof akan bekerjasumber
Ini didefinisikan dalam Bagian spesifikasi ECMAScript 7.3.19 Langkah 3 :
If Type(O) is not Object, return false.
Dengan kata lain, jika
Obj
inObj instanceof Callable
bukan objek, makainstanceof
hubungan arus pendek akanfalse
langsung.sumber
Saya yakin saya telah menemukan solusi yang layak:
sumber
https://www.npmjs.com/package/typeof
Mengembalikan representasi string dari
instanceof
(nama konstruktor)sumber
Bagi saya kebingungan yang disebabkan oleh
Jadi
"str" istanceof String
harus kembalitrue
karena cara kerja seperti di bawah ini:Hasil dari ekspresi # 1 dan # 2 saling bertentangan, jadi harus ada yang salah.
# 1 salah
Saya mengetahui bahwa itu disebabkan oleh
__proto__
properti non-standar, jadi gunakan yang standar:Object.getPrototypeOf
Sekarang tidak ada kebingungan antara ekspresi # 2 dan # 3
sumber
Object("str").__proto__
atauObject("str") instanceof String
.Atau Anda bisa membuat fungsi sendiri seperti:
pemakaian:
Keduanya harus kembali benar.
sumber