|
| 1 | +## `typeof` operatörü |
| 2 | + |
| 3 | +The `typeof` operatörü ([`instanceof`](#types.instanceof) ile birlikte) |
| 4 | +herhalde JavaScript'in en büyük tasarım hatalarından biridir, çünkü neredeyse |
| 5 | +**tamamen arızalıdır**. |
| 6 | + |
| 7 | +`instanceof` operatörünün sınırlı kullanımı olsa da, `typeof` operatörünün |
| 8 | +gerçekte tek bir pratik kullanımı vardır, ve bunun da bir nesnenin tipini |
| 9 | +kontrol etmekle ilgili **yoktur**. |
| 10 | + |
| 11 | +> **Not:** `typeof` fonksiyon sentaksı (mesela ``typeof(obj)`), ile de |
| 12 | +> çağrılabilse de bu gerçek bir fonksiyon çağrısı değildir. İki parantezin |
| 13 | +> içindeki ifadenin döndürdüğü değer typeof operatöre verilir. `typeof` diye |
| 14 | +> bir fonksiyon yoktur. |
| 15 | +
|
| 16 | +### JavaScript tip tablosu |
| 17 | + |
| 18 | + Değer Sınıf Tip |
| 19 | + ------------------------------------- |
| 20 | + "foo" String string |
| 21 | + new String("foo") String object |
| 22 | + 1.2 Number number |
| 23 | + new Number(1.2) Number object |
| 24 | + true Boolean boolean |
| 25 | + new Boolean(true) Boolean object |
| 26 | + new Date() Date object |
| 27 | + new Error() Error object |
| 28 | + [1,2,3] Array object |
| 29 | + new Array(1, 2, 3) Array object |
| 30 | + new Function("") Function function |
| 31 | + /abc/g RegExp object (function in Nitro/V8) |
| 32 | + new RegExp("meow") RegExp object (function in Nitro/V8) |
| 33 | + {} Object object |
| 34 | + new Object() Object object |
| 35 | + |
| 36 | +Yukarıdaki tabloda *Tip* sütunu `typeof` operatörünün verdiği sonucu gösterir. |
| 37 | +Açıkça görülebileceği gibi, bu sonuç tutarlı olmaktan çok uzaktır. |
| 38 | + |
| 39 | +*Sınıf* sütunu bir nesnenin dahili `[[Class]]` özelliğini gösterir. |
| 40 | + |
| 41 | +> **Spesifikasyondan:** `[[Class]]` özelliğinin değeri şu katarlardan biri |
| 42 | +> olabilir: `Arguments`, `Array`, `Boolean`, `Date`, `Error`, |
| 43 | +> `Function`, `JSON`, `Math`, `Number`, `Object`, `RegExp`, `String`. |
| 44 | +
|
| 45 | +`[[Class]]` özelliğinin değerini almak için `Object.prototype` 'ın `toString` |
| 46 | +metodu kullanılmalıdır. |
| 47 | + |
| 48 | +### Bir nesnenin sınıfı |
| 49 | + |
| 50 | +Spesifikasyona göre `[[Class]]` değerine erişmenin tek yolu |
| 51 | +`Object.prototype.toString` kullanmaktır. |
| 52 | + |
| 53 | + function is(type, obj) { |
| 54 | + var clas = Object.prototype.toString.call(obj).slice(8, -1); |
| 55 | + return obj !== undefined && obj !== null && clas === type; |
| 56 | + } |
| 57 | + |
| 58 | + is('String', 'test'); // true |
| 59 | + is('String', new String('test')); // true |
| 60 | + |
| 61 | +Yukarıdaki örnekte, `Object.prototype.toString` çağrıldığında |
| 62 | +[this](#function.this) 'in değeri `[[Class]]` değeri aranan nesne olarak |
| 63 | +atanmış olmaktadır. |
| 64 | + |
| 65 | +> **ES5 Notu:** Kolaylık sağlamak için `Object.prototype.toString` 'in `null` |
| 66 | +> ve `undefined` için verdiği değerler `Object` 'ten `Null` ve `Undefined` 'a |
| 67 | +> **değiştirildi**. |
| 68 | +
|
| 69 | +### Bir değişkenin tanımlandığını kontrol etmek |
| 70 | + |
| 71 | + typeof foo !== 'undefined' |
| 72 | + |
| 73 | +Yukarıdaki satır `foo` değişkeninin tanımlanıp tanımlanmadığını belirler; |
| 74 | +tanımlanmamış bir değişkene erişmek bir `ReferenceError` hatası oluştur. |
| 75 | +`typeof` operatörünün tek kullanışlı olduğu şey işte budur. |
| 76 | + |
| 77 | +### Sonuç |
| 78 | + |
| 79 | +Bir nesnenin tipini kontrol etmek için `Object.prototype.toString` 'in |
| 80 | +kullanılması şiddetle tavsiye edilir; çünkü bunu yapmanın tek güvenilir yoludur. |
| 81 | +Yukarıdaki tip tablosunda gösterildiği gibi, `typeof` operatörünün bazı |
| 82 | +sonuçları spesifikasdyonda tanımlanmamıştır; bu nedenle, çeşitli platformlarda |
| 83 | +farklılık gösterebilirler. |
| 84 | + |
| 85 | +Bir değişkenin tanımlandığını kontrol etmek dışında, `typeof` operatörün |
| 86 | +kullanımından **her ne pahasına olursa olsun** kaçınılmalıdır. |
| 87 | + |
0 commit comments