javascript中的typeof和型別判斷

小花貓Jane發表於2017-11-02

javascript中的typeof和型別判斷

ECMAScript 有 5 種原始型別(primitive type),即 Undefined、Null、Boolean、Number 和 String。我們都知道可以使用typeof運算子求得一個變數的型別,但是對引用型別變數卻只會返回object

,也就是說
typeof只能正確識別基本型別值變數。

var a = "abc";

console.log(typeof a); // "string"var b = 123;

console.log(typeof b); // "number"var c = true;

console.log(typeof c); // "boolean"var d = null;

console.log(typeof d); // "object"var f = undefined;

console.log(typeof f); // "undefined"var g;

console.log(typeof g); // "undefined"

console.log(typeof x); // "undefined"

您也許會問,為什麼
typeof 運算子對於 null 值會返回 "object"。這實際上是 JavaScript 最初實現中的一個錯誤,然後被 ECMAScript 沿用了。現在,null 被認為是物件的佔位符,從而解釋了這一矛盾,但從技術上來說,它仍然是原始值。

最後一個比較奇怪,
typeof一個不存在的變數x
居然返回了
"object"而不是"undefined"。

我們在來如下程式碼:

var a = function() { };

console.log(typeof a); // "function"var b = [1,2,3];

console.log(typeof b); // "object"var c = { };

console.log(typeof c); // "object"

對於陣列和物件都返回
"object",因此我們日常開發中一個常見需求就是如何判斷變數是陣列還是物件。

型別判斷

型別判斷,一般就是判斷是否是陣列,是否是空物件。這是針對這個需求,我日常用過或見過的判斷方法

判斷是否是陣列

有陣列:
var a = [1,2,3,4,5];

方法一:

toString.call(a); // "[object Array]"

方法二:

a instanceof Array; //true

方法三:

a.constructor == Array; //true

第一種方法比較通用,也就是
Object.prototype.toString.call(a)
的簡寫。

instanceof

constructor
判斷的變數,必須在當前頁面宣告的,比如,一個頁面(父頁面)有一個框架,框架中引用了一個頁面(子頁面),在子頁面中宣告瞭一個
a,並將其賦值給父頁面的一個變數,這時判斷該變數,Array == object.constructor
會返回
false

var a = [1,2,3,4,5];

console.log(toString.call(a)); // "[object Array]"

console.log(a instanceof Array); //true

console.log(a.constructor == Array); //true

判斷是否是空物件

有變數:
var obj = {};

方法一:

JSON.stringify(obj); // "{}"

通過轉換成
JSON物件來判斷是否是空大括號

方法二:

if(obj.id){ //如果屬性id存在....}

這個方法比較土,大多數人都能想到,前提是得知道物件中有某個屬性。

方法三:

function isEmptyObject(e) { var t; for (t in e) return !1; return !0 } //trueisEmptyObject(obj); //falseisEmptyObject({ "a":1, "b":2});

這個方法是
jQuery的isEmptyObject()方法的實現方式。

想要學習前端開發的同學,可以加群:
543627393 學習哦!


相關文章