typeof
- typeof 給出的數(shù)據(jù)類型與js給出的存在差別:
typeof:number / string / boolean / undefined / function / object,typeof 返回的數(shù)據(jù)的類型全是 string
js:number / string / boolean / undefined / null / object - typeof 的優(yōu)先級非常高,比加減乘除的優(yōu)先級都高,如下例所示:
typeof 2*3;//NaN
typeof (2*3);//"number"
typeof 2+3;// "number3"
instanceof
var simpleStr = "This is a simple string";
var myString = new String();
var newStr = new String("String created with constructor");
var myDate = new Date();
var myObj = {};
var myArr = [];
var myNonObj = Object.create(null);
simpleStr instanceof String; // 返回 false, 檢查原型鏈會找到 undefined
myString instanceof String; // 返回 true
newStr instanceof String; // 返回 true
myString instanceof Object; // 返回 true
myObj instanceof Object; // 返回 true, 盡管原型沒有定義
({}) instanceof Object; // 返回 true, 同上
myNonObj instanceof Object; // 返回 false, 一種創(chuàng)建非 Object 實例的對象的方法
myArr instanceof Array // 返回 true
myArr instanceof Object // 返回 true
myDate instanceof Date; // 返回 true
myDate instanceof Object; // 返回 true
- 除了對象和數(shù)組使用文字符號創(chuàng)建后,instanceof Object 仍然返回 true。,其余數(shù)據(jù)類型必須其 實例 是通過 new 關(guān)鍵字創(chuàng)建的,在 instanceof 該數(shù)據(jù)類型時才能返回 true
- 該方法的另一局限性是無法判斷該實例是不是對象,因為對于所有 new 方法創(chuàng)建出來的實例,Object.prototype都在其原型鏈上。當(dāng)然構(gòu)造函數(shù)的 prototype 可以改變,改變之后的值可能就不在實例的原型鏈上了
Object.prototype.toString
var toString = Object.prototype.toString;
toString.call(new Date); // [object Date]
toString.call(new String); // [object String]
toString.call(Math); // [object Math]
toString.call(undefined); // [object Undefined]
toString.call(null); // [object null]
toString.apply([1,2,3]); // [object Array]
toString.call({}); // [object object]
toString.call(123); // [object number]
toString.call('hello'); // [object string]
參考文獻(xiàn):
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof
