<code>typeof</code>操作符用于傳回正在使用值的類型。
在《JavaScript啟示錄》中<code>new RegExp()</code>介紹會傳回<code>function</code>,但是事實上我在chrome控制台中看到的是<code>object</code>。
于是我<code>console.log(new RegExp('^[0-9]+$'))</code>,列印出來的是字元串<code>/^[0-9]+$/</code>。
綜上可以看出現版本<code>RegExp</code>和<code>String Number</code>一樣屬于JavaScript的原始值。
<code>Math</code>作為JavaScript中的靜态對象回傳回什麼呢?
是以<code>Math</code>的<code>__proto__</code>還是<code>Object</code>,<code>typeof</code>還能傳回對象的屬性和方法的類型。
1.判斷某個變量是否已定義
2.區分原始值和複雜值(對象值)
因為複雜值往往傳回<code>object</code>,當然有個例外就是原始值裡面的<code>null</code>也傳回<code>object</code>,然後<code>function</code>作為<code>Object</code>的執行個體也是複雜值。
3.檢測某個變量是否是函數
當使用閉包時判斷是函數後再進行下一步。
通過使用<code>instanceof</code>操作符,可以确定一個對象是否是特定構造函數的執行個體,傳回<code>true</code>或<code>false</code>。 <code>instanceof</code>隻适用于構造函數建立傳回的複雜對象和執行個體。 任何時間判斷一個對象(複雜值)是否是<code>Object</code>的執行個體時,它都将傳回<code>true</code>,因為所有對象都繼承自<code>Object()</code>構造函數。
判斷在一個繼承關系中執行個體是否屬于它的父類。
<code>in</code>操作符可以檢查一個對象的屬性,包括來自原型鍊的屬性,<code>hasOwnProperty()</code>方法可以檢查來自非原型鍊屬性的對象。
例如現在有一個對象<code>let obj = {name: 'mazey'};</code>,<code>name</code>是它自身定義的屬性,<code>toString</code>是它從原型鍊上繼承下來的屬性。
是以in操作符查找的範圍更廣一點,可以用<code>hasOwnProperty()</code>判斷是否是對象自身的屬性,而不是通過類似<code>obj.prototype.foo = 'foo';</code>這樣定義的。
在實際項目中經常使用<code>for...in...</code>來周遊對象中可枚舉的屬性,但是<code>for...in...</code>常常把原型<code>obj.prototype.xxx</code>中的屬性也列舉出來,是以在循環的時候可以加上<code>hasOwnProperty()</code>方法判斷下。
1.<code>typeof</code>可以判斷使用值的類型,注意<code>null</code>傳回<code>object</code>。 2.<code>instanceof</code>驗證構造函數構造出來的執行個體,可以用來判斷一個對象是否屬于一個父類。 3.<code>hasOwnProperty</code>方法常常與<code>in</code>操作符搭配使用,用來周遊一個對象自身的屬性。
若想把一個對象的自身屬性完全删除,要使用<code>delete</code>操作符。
需要注意的是<code>delete</code>不會删除原型鍊上的屬性。
每個對象的屬性都分為可枚舉和不可枚舉屬性,可以使用<code>propertyIsEnumerable()</code>方法來檢查哪些屬性是可枚舉的。
每個對象都有一個<code>propertyIsEnumerable</code>方法。此方法可以确定對象中指定的屬性是否可以被<code>for...in</code>(for...in語句以任意順序周遊一個對象的可枚舉屬性。對于每個不同的屬性,語句都會被執行)循環枚舉,但是通過原型鍊繼承的屬性除外。如果對象沒有指定的屬性,則此方法傳回<code>false</code>。
有的資料說隻要能被<code>for..in</code>周遊的屬性就是可枚舉的,實際上要排除從原型鍊上繼承下來的屬性,隻有自身的屬性是可枚舉的。
是以可枚舉的屬性一定能被<code>for..in</code>循環周遊出來,但是<code>for...in</code>循環周遊出來的屬性不一定是可枚舉的,需排除從原型鍊上繼承下來的屬性,這裡可以通過<code>hasOwnProperty()</code>方法過濾掉不可枚舉屬性。
JavaScript中typeof,instanceof,hasOwnProperty,in的用法和差別
GitHub:mazeyqian
Blog:blog.mazey.net