Value | function | typeOf |
---|---|---|
"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 |
new RegExp("meow") | RegExp | object |
{} | Object | object |
new Object() | Object | object |
null | Object | object |
undefined | undefined |
所有可以通過構(gòu)造函數(shù)創(chuàng)建的對(duì)象都可以用 instanceof 檢查類型
Object.prototype.toString.call(x) 來檢查x的類型灸拍,可以區(qū)分Boolean, Number, String, Function, Array, Date, RegExp, Object, Error等等。
Javascript中有5種基本類型(除了symbol,es6中增加了symbol類型)征懈,以及對(duì)象類型留攒,相信很多朋友像我一樣,用了很久的js還是有點(diǎn)分不清怎么判斷一個(gè)數(shù)據(jù)的類型。
typeof 運(yùn)算符:
// Numbers
console.log(typeof 37 === 'number');
console.log(typeof 3.14 === 'number');
console.log(typeof Math.LN2 === 'number');
console.log(typeof Infinity === 'number');
console.log(typeof NaN === 'number'); // 盡管NaN是"Not-A-Number"的縮寫,意思是"不是一個(gè)數(shù)字"
console.log(typeof Number(1) === 'number'); // 不要這樣使用!
// Strings
console.log(typeof "" === 'string');
console.log(typeof "bla" === 'string');
console.log(typeof (typeof 1) === 'string'); // console.log(typeof返回的肯定是一個(gè)字符串
console.log(typeof String("abc") === 'string'); //不要這樣使用!
// Booleans
console.log(typeof true === 'boolean');
console.log(typeof false === 'boolean');
console.log(typeof Boolean(true) === 'boolean'); // 不要這樣使用!
// Symbols
console.log(typeof Symbol() === 'symbol');
console.log(typeof Symbol('foo') === 'symbol');
console.log(typeof Symbol.iterator === 'symbol');
// Undefined
console.log(typeof undefined === 'undefined');
console.log(typeof blabla === 'undefined'); // 一個(gè)未定義的變量,或者一個(gè)定義了卻未賦初值的變量
// Objects 使用Array.isArray或者Object.prototype.toString.call方法可以從基本的對(duì)象中區(qū)分出數(shù)組類型
console.log(typeof {a:1} === 'object');
console.log(typeof [1, 2, 4] === 'object');
console.log(typeof /^[a-zA-Z]{5,20}$/ === 'object');
console.log(typeof {name:'wenzi', age:25} === 'object');
console.log(typeof null === 'object');//true
// 下面的容易令人迷惑白魂,不要這樣使用!
console.log(typeof new Boolean(true) === 'object');
console.log(typeof new Number(1) === 'object');
console.log(typeof new Date() === 'object');
console.log(typeof new String("abc") === 'object');
console.log(typeof new Error() === 'object');
// 函數(shù)
console.log(typeof function(){} === 'function');
console.log(typeof Math.sin === 'function');
通過上面例子我們可以很明顯的看到上岗,除了基本類型以外的類型福荸,都是對(duì)象,但是有例外:null 的 typeof 值是 'object' 【坑1】, 函數(shù)的 typeof 值是 'function' ! (函數(shù)對(duì)象的構(gòu)造函數(shù)是 Function肴掷,也就繼承了 Function 的原型)【坑2】敬锐,NaN 的類型也是 'number'【坑3】
注意:本文的測(cè)試在現(xiàn)在最新瀏覽器上進(jìn)行,老版本瀏覽器可能有所不同呆瞻。比如Safari 3.X中typeof /^\d*$/;為'function'【坑4:兼容性復(fù)雜】台夺。
不是所有對(duì)象都是返回 object,而且還有 null 搗亂痴脾,那我們?nèi)绾闻袛嘁粋€(gè)值的類型呢
instanceof運(yùn)算符: instanceof又叫關(guān)系運(yùn)算符颤介,可以用來判斷某個(gè)構(gòu)造函數(shù)的prototype屬性是否存在另外一個(gè)要檢測(cè)對(duì)象的原型鏈上
var str = new String("hello world");
console.log(str instanceof String);//true
console.log(String instanceof Function);//true
console.log(str instanceof Function);//false
constructor屬性 在使用instanceof檢測(cè)變量類型時(shí),我們是檢測(cè)不到number, 'string', bool的類型的
function Person(){
}
var Tom = new Person();
console.log(Tom.constructor === Person);//true
Object.prototype.toString.call
使用toString()方法來檢測(cè)對(duì)象類型
function Type() { };
var toString = Object.prototype.toString;
console.log(toString.call(new Date) === '[object Date]');//true
console.log(toString.call(new String) ==='[object String]');//true
console.log(toString.call(new Function) ==='[object Function]');//true
console.log(toString.call(Type) ==='[object Function]');//true
console.log(toString.call('str') ==='[object String]');//true
console.log(toString.call(Math) === '[object Math]');//true
console.log(toString.call(true) ==='[object Boolean]');//true
console.log(toString.call(/^[a-zA-Z]{5,20}$/) ==='[object RegExp]');//true
console.log(toString.call({name:'wenzi', age:25}) ==='[object Object]');//true
console.log(toString.call([1, 2, 3, 4]) ==='[object Array]');//true
//Since JavaScript 1.8.5
console.log(toString.call(undefined) === '[object Undefined]');//true
console.log(toString.call(null) === '[object Null]');//true
Array.isArray() 用于確定傳遞的值是否是一個(gè) Array
// 下面的函數(shù)調(diào)用都返回 true
Array.isArray([]);
Array.isArray([1]);
Array.isArray(new Array());
// 鮮為人知的事實(shí):其實(shí) Array.prototype 也是一個(gè)數(shù)組赞赖。
Array.isArray(Array.prototype);
// 下面的函數(shù)調(diào)用都返回 false
Array.isArray();
Array.isArray({});
Array.isArray(null);
Array.isArray(undefined);
Array.isArray(17);
Array.isArray('Array');
Array.isArray(true);
Array.isArray(false);
Array.isArray({ __proto__: Array.prototype });
instanceof 和 isArray
當(dāng)檢測(cè)Array實(shí)例時(shí), Array.isArray 優(yōu)于 instanceof,因?yàn)锳rray.isArray能檢測(cè)iframes.
通過如下代碼可以創(chuàng)建該方法
if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}