摘要:操作符還有可能是設計中最大缺陷,因為它幾乎是完全破損的。由于用法與調用函數的語法相似,因此常被誤以為是函數調用,實際上并不存在名為的函數,只是一個操作符而已。而列則表示對象內部的屬性。屬性文檔中明確地給出了獲得屬性的途徑,就是使用。
typeof 操作符(還有 instanceof)可能是 Javascript 設計中最大缺陷,因為它幾乎是完全破損的。由于 typeof 用法與調用函數的語法相似,因此常被誤以為是函數調用,實際上并不存在名為 typeof 的函數,typeof 只是一個操作符而已。
盡管 instanceof 仍然還有少數的應用場景,typeof 則只有一個實際的用途,但這個用途不能用來檢測對象的類型。
Value Class Type ------------------------------------- "foo" String string new String("foo") String object 1.2 Number number new Number(1.2) Number object true Boolean boolean new Boolean(true) Boolean object new Date() Date object new Error() Error object [1,2,3] Array object new Array(1, 2, 3) Array object new Function("") Function function /abc/g RegExp object (function in Nitro/V8) new RegExp("meow") RegExp object (function in Nitro/V8) {} Object object new Object() Object object
在上述表格中,Type 列表示 typeof 操作符的結果。而 Class 列則表示對象內部的 [[Class]] 屬性。
為了獲得 [[Class]] 屬性,我們需要使用 Object.prototype 的 toString 方法。
文檔中明確地給出了獲得 [[Class]] 屬性的途徑,就是使用 Object.prototype.toString。
function is(type, obj) { var clas = Object.prototype.toString.call(obj).slice(8, -1); return obj !== undefined && obj !== null && clas === type; } is("String", "test"); // true is("String", new String("test")); // true
上例中,Object.prototype.toString 被調用,this 被設置指向需要獲取其 [[Class]] 屬性值的對象。
測試變量是否定義文檔定義: [[Class]] 屬性的值只可能是下列字符串: Arguments, Array, Boolean, Date, Error, Function, JSON, Math, Number, Object, RegExp, String。
對 null 和 undefined 調用 Object.prototype.toString 方法時, 其返回值將由 Object 變成了 Null 和 Undefined。
typeof foo !== "undefined"
上述語句將會測試變量 foo 已定義與否,如果未定義而引用 foo 將會拋出 ReferenceError 錯誤,這實際上是 typeof 用處最大的地方。
總結為了檢測一個對象的類型,最可靠的方法就是使用 Object.prototype.toString,正如第一個表格上的內容,typeof 操作符并不能返回確切的對象類型,但是我們可以使用 typeof 操作符經常會被用來判斷變量是否定義。
其實 typeof 操作符還可以被用來測試變量是否為函數,@humphry 前輩的回答進一步豐富了 typeof 的用途:
參考《如何正確判斷js數據類型》
http://bonsaiden.github.io/JavaScript-Garden/#types.typeof
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78102.html
摘要:的操作符可以用來比較兩個操作數的構造函數。這是因為它們的構造函數不可能會是同一個對象。總結綜上所述,我們知道操作符最合適的使用壞境是比較兩個相同上下文背景下的自定義對象的構造函數,正如上篇介紹的操作符,其他壞境下使用作用不大。 Javascript 的 instanceof 操作符可以用來比較兩個操作數的構造函數 constructor。但這個只有在比較自定義對象才有意義。當用來比較 ...
摘要:并沒有類繼承模型,而是使用原型對象進行原型式繼承。我們舉例說明原型鏈查找機制當訪問一個對象的屬性時,會從對象本身開始往上遍歷整個原型鏈,直到找到對應屬性為止。原始類型有以下五種型。此外,試圖查找一個不存在屬性時將會遍歷整個原型鏈。 Javascript 并沒有類繼承模型,而是使用原型對象 prototype 進行原型式繼承。 盡管人們經常將此看做是 Javascript 的一個缺點,然...
摘要:數組的構造函數由于數組的構造函數在處理參數時的不確定性,因此強烈建議使用符號來創建一個新數組。總結綜上所述,我們應該盡量使用來創建新函數,而不是數組的構造函數,這樣代碼將有更好的可讀性。 數組的構造函數 由于數組的構造函數在處理參數時的不確定性,因此強烈建議使用 [] 符號來創建一個新數組。 [1, 2, 3]; // Result: [1, 2, 3] new Array(1, ...
摘要:前言大家好,小弟飛狐,愛學習,愛裝逼,樂于分享,初來乍到,請多多關照。特別注意一下,函數在中是對象,不是一種數據類型,這可是世界的一等公民。和,和的關系又很曖昧,后面細說,要不然會暈菜。基本數據類型,,,,,這五種基本數據類型是按值訪問的。 前言 大家好,小弟飛狐,愛學習,愛裝逼,樂于分享,初來乍到,請多多關照(~ o ~)~zZ。出道幾年,對JavaScript情有獨鐘,聊技術之前,...
摘要:因為是弱類型語言,所以它會在任何可能的情形下對變量進行強制類型轉換。內置類型的構造函數調用內置類型的構造函數時,是否使用關鍵字將表現得大不相同。傳遞字面值或非對象值也會造成強制類型轉換的現象。最好的方法就是顯示地將值轉換為,或三種類型之一。 因為 Javascript 是弱類型語言,所以它會在任何可能的情形下對變量進行強制類型轉換。 // These are true new Num...
閱讀 2380·2019-08-30 15:56
閱讀 1039·2019-08-30 15:55
閱讀 3203·2019-08-30 15:44
閱讀 933·2019-08-30 10:53
閱讀 1888·2019-08-29 16:33
閱讀 2469·2019-08-29 16:13
閱讀 719·2019-08-29 12:41
閱讀 874·2019-08-26 13:56