一、typeof()
typeof() 用于区分不同类型的原始值,并区分原始值和对象,但是在区分不同类型的对象(包括null)时,是没有用的
typeof 3 // "number"
typeof "abc" // "string"
typeof {} // "object"
typeof true // "boolean"
typeof undefined // "undefined"
typeof function(){} // "function"
typeof null // "object"
var array1 = []
var array2 = new Array();
var date = new Date();
var error = new Error();
console.log(typeof array1); // object
console.log(typeof array2); // object
console.log(typeof date); // object
console.log(typeof error); // object
二、Object.prototype.toString
在toString方法被调用时,是会执行下面的操作步骤的:
- 1、如果this的值为undefined,则返回"[object Undefined]".
- 2、如果this的值为null,则返回"[object Null]".
- 3、让O成为调用ToObject(this)的结果.
- 4、让class成为O的内部属性[[Class]]的值.
- 5、最后返回由 "[object "和 class 和 "]" 三个部分组成的字符串.
function checkTypes() {
for (var i = 0; i < arguments.length; i++) {
console.log(Object.prototype.toString.call(arguments[I]))
}
}
var number = 1; // [object Number]
var string = '123'; // [object String]
var bool = true; // [object Boolean]
var unde = undefined; // [object Undefined]
var nul = null; // [object Null]
var obj = {} // [object Object]
var array = []; // [object Array]
var date = new Date(); // [object Date]
var error = new Error(); // [object Error]
var reg = /a/g; // [object RegExp]
var func = function a(){}; // [object Function]
// 除此之外,还有
console.log(Object.prototype.toString.call(Math)); // [object Math]
console.log(Object.prototype.toString.call(JSON)); // [object JSON]
function a() {
console.log(Object.prototype.toString.call(arguments)); // [object Arguments]
}
a()
// 所以我们可以识别至少 14 种类型
三、instanceof
instanceof用来判断一个对象是否是一个类的实例。
var d = new Date()
d instanceof Date // true
d instanceof Object // true d是Date的一个实例
d instanceof Number // false 所有的对象都是object实例
var a = [1,2,3]
a instanceof Array // true a是一个数组
a instanceof Object // true 所有的数组都是对象
需要注意的是,所有对象都是Object实例。
但是instanceof不适用于原始类型:字符串,数字,布尔
3 instanceof Number // false
true instanceof Boolean // false
'abc' instanceof String // false
四、constructor
javascript 的所有对象都有一个 constructor 属性,这个属性可以帮我们判断 object 数据类型
//alert(1.constructor); //报错 数字常量无 constructor 属性
var num = 1;
console.log(num.constructor == Number); //true
var str = "luckfine";
console.log(str.constructor == String); //true
var obj= null;
console.log(obj.constructor); //报错,null 没有 constructor 属性
var none = undefined;
console.log(obj.constructor); //报错,undefined 没有 constructor 属性
null 和 undefined 都没有 constructor 属性,所以不能使用constructor判断。
五、练习
如何判断一个对象是不是数组?
如何判断一个对象是不是函数?
总结
typeof:
- 可以是标准类型(Null 除外)
- 不可识别具体的对象类型(Function 除外)
Object.prototype.toString:
- 可识别标准类型及内置对象类型(例如,Object, Date, Array)
- 不能识别自定义对象类型
constructor:
- 可以识别标准类型(Undefined/Null 除外)
- 可识别内置对象类型
- 可识别自定义对象类型
instanceof:
- 不可判别原始类型
- 可判别内置对象类型
- 可判别自定义对象类型
网友评论