01.javascript之資料型別

qfstudy發表於2018-07-11

1.資料型別

JavaScript一共有六種資料型別。(ES6新增了第七種Symbol型別的值)

  • 數值(Number)
  • 字串(String)
  • 布林值(boolean)
  • undefined
  • null
  • 物件(object)

2.資料型別判斷

JavaScript有三種方法,可以判斷一個值的型別

  • typeof運算子
  • instanceof運算子
  • Object.prototype.toString()方法

typeof運算子

typeof運算子可以返回一個值的資料型別。 數值、字串、布林值分別返回numberstringboolean

typeof 123  //"number"
typeof 'hello'  //"string"
typeof true  //"boolean"
複製程式碼

函式返回function

function f(){} 
typeof f  //"function"
複製程式碼

undefined返回undefined

typeof undefined  // "undefined"
複製程式碼

物件返回object

typeof {} // "object"
typeof [] // "object"
複製程式碼

null返回object`。

typeof null // "object"
複製程式碼

instanceof運算子

instanceof運算子返回一個布林值,表示物件是否為某個建構函式的例項。 由於instanceof檢查整個原型鏈,因此同一個例項物件,可能會對多個建構函式都返回trueinstanceof運算子的一個用處,是判斷值的型別。

var x = []
var f={}
x instanceof Array //true
f instanceof Object //true
複製程式碼

instanceof運算子只能用於物件,不適用原始型別的值。

利用instanceof運算子,還可以解決,呼叫建構函式時,忘了加new命令的問題。

function Fn (f1, f2) {
  if (this instanceof Fn) {
    this._foo = f1;
    this._bar = b2;
  } else {
    return new Fn(f1, f2);
  }
}
複製程式碼

Object.prototype.toString()

toString方法的作用是返回一個物件的字串形式,預設情況下返回型別字串。

var o1 = new Object();
o1.toString() //"[object Object]"
複製程式碼

toString() 的應用:判斷資料型別 Object.prototype.toString方法返回物件的型別字串,因此可以用來判斷一個值的型別。

var obj = {};
obj.toString() // "[object Object]"
複製程式碼

上面程式碼呼叫空物件的toString方法,結果返回一個字串object Object,其中第二個Object表示該值的建構函式。這是一個十分有用的判斷資料型別的方法。

由於例項物件可能會自定義toString方法,覆蓋掉Object.prototype.toString方法,所以為了得到型別字串,最好直接使用Object.prototype.toString方法。通過函式的call方法,可以在任意值上呼叫這個方法,判斷這個值的型別。

Object.prototype.toString.call(value)
複製程式碼

上面程式碼表示對value這個值呼叫Object.prototype.toString方法。 不同資料型別的Object.prototype.toString方法返回值如下。

  • 數值:返回[object Number]
Object.prototype.toString.call(12) //"[object Number]"
複製程式碼
  • 字串:返回[object String]
Object.prototype.toString.call('ab')  //"[object String]"
複製程式碼
  • 布林值:返回[object Boolean]
Object.prototype.toString.call(true)  //"[object Boolean]"
複製程式碼
  • undefined:返回[object Undefined]
Object.prototype.toString.call(undefined)  //"[object Undefined]"
複製程式碼
  • null:返回[object Null]
Object.prototype.toString.call(null)  //"[object Null]"
複製程式碼
  • 陣列:返回[object Array]
Object.prototype.toString.call([])  //"[object Array]"
複製程式碼
  • 函式:返回[object Function]
var f = function (){}
Object.prototype.toString.call(f)  //"[object Function]"
複製程式碼

利用這個特性,可以寫出一個比typeof運算子更準確的型別判斷函式。

var type = function (o){
  var s = Object.prototype.toString.call(o);
  return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};

type({}); // "object"
type([]); // "array"
type(3); // "number"
type(null); // "null"
type(); // "undefined"
type(/abcd/); // "regex"
type(new Date()); // "date"
複製程式碼

未完待續

相關文章