JavaScript'te ilkelundefined
öğeler (booleans, null, sayı, dize ve değer (ve ES6'daki sembol)) dışında her şey bir nesnedir (veya en azından bir nesne olarak ele alınabilir):
console.log(typeof true); // boolean
console.log(typeof 0); // number
console.log(typeof ""); // string
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof []); // object
console.log(typeof {}); // object
console.log(typeof function () {}); // function
Gördüğünüz gibi, diziler ve değerlerin null
tümü nesneler olarak kabul edilir ( null
var olmayan bir nesneye referanstır). İşlevler ayırt edilebilir, çünkü bunlar özel olarak çağrılabilir nesnelerdir. Ancak hala nesnelerdir.
Değişmezleri Öte yandan true
, 0
,""
ve undefined
değil nesneleri vardır. Bunlar JavaScript'teki ilkel değerlerdir. Ancak boolean, sayı ve dizeleri de kurucuya sahip Boolean
, Number
ve String
ek işlevsellik sağlamak amacıyla kendi temelögeye sarmak hangi sırasıyla:
console.log(typeof new Boolean(true)); // object
console.log(typeof new Number(0)); // object
console.log(typeof new String("")); // object
İlkel değerlerin ne zaman sarıldığını görebileceğiniz gibi Boolean
,Number
ve String
kurucular sırasıyla onlar nesneler haline gelir. instanceof
Operatörü yalnızca (döndürür neden olan nesneler için çalışır false
ilkel değerler için):
console.log(true instanceof Boolean); // false
console.log(0 instanceof Number); // false
console.log("" instanceof String); // false
console.log(new Boolean(true) instanceof Boolean); // true
console.log(new Number(0) instanceof Number); // true
console.log(new String("") instanceof String); // true
Her ikisini de görebileceğiniz typeof
ve instanceof
bir değerin bir boolean, sayı veya dize olup olmadığını test etmek için yetersiz - typeof
yalnızca ilkel boole, sayı ve dize için çalışır; ve instanceof
ilkel boolelar, sayılar ve karakter dizileri için çalışmaz.
Neyse ki bu sorunun basit bir çözümü var. Varsayılan uygulaması toString
(yani yerel olarak tanımlandığı gibi)Object.prototype.toString
) [[Class]]
, hem ilkel değerlerin hem de nesnelerin dahili özelliğini döndürür :
function classOf(value) {
return Object.prototype.toString.call(value);
}
console.log(classOf(true)); // [object Boolean]
console.log(classOf(0)); // [object Number]
console.log(classOf("")); // [object String]
console.log(classOf(new Boolean(true))); // [object Boolean]
console.log(classOf(new Number(0))); // [object Number]
console.log(classOf(new String(""))); // [object String]
[[Class]]
Bir değerin iç özelliği, değerden çok daha kullanışlıdır typeof
. KullanabilirizObject.prototype.toString
typeof
Operatörün kendi (daha kullanışlı) versiyonumuzu aşağıdaki gibi oluşturmak için :
function typeOf(value) {
return Object.prototype.toString.call(value).slice(8, -1);
}
console.log(typeOf(true)); // Boolean
console.log(typeOf(0)); // Number
console.log(typeOf("")); // String
console.log(typeOf(new Boolean(true))); // Boolean
console.log(typeOf(new Number(0))); // Number
console.log(typeOf(new String(""))); // String
Umarım bu makale yardımcı olmuştur. İlkel öğeler ve sarılmış nesneler arasındaki farklar hakkında daha fazla bilgi için aşağıdaki blog gönderisini okuyun: JavaScript İlkellerinin Gizli Yaşamı