javascript的数据类型可以分为两大类:
原始类型和引用类型.
原始类型(基本数据类型)包括Undefined、Null、Boolean、Number和String五种,及es6中的symbol
引用类型也称为复杂类型,在Javascript中是Object。
typeof 2 // number
typeof null // object
typeof {} // object
typeof [] // object
typeof new Function() //function
typeof undefined // undefined
typeof '222’ // string
typeof true // boolean
instanceof 检测的是原型,用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置。因此,instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
function A(){};
Car.prototype = Object.create(A.prototype); //Car继承A
var auto = new Car('Honda', 'Accord', 1998);
console.log(auto instanceof Car);
// expected output: true
console.log(auto instanceof A);
// expected output: true
console.log(auto instanceof Object);
// expected output: true
toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。
对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。
Object.prototype.toString.call('') ; // [object String]
Object.prototype.toString.call(1) ; // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引用
Number、String、Boolean、Nndefined可以直接使用typeof进行鉴别
首先typeof 方法并不能鉴别数组
typeof [] // object
instanceof操作符默认假定只有一个全局执行环境,当我们的网页中包含多个框架时,就会有多个全局执行环境,可能会导致’[] instanceof Array’的结果返回false。
JavaScript中实现了一个内置函数Array.isArray用于判断某个对象是否是数组,
Array.isArray() 本质上检测的是对象的 [[Class]] 值,[[Class]] 是对象的一个内部属性,里面包含了对象的类型信息,其格式为 [object Xxx] ,Xxx 就是对应的具体类型 。对于数组而言,[[Class]] 的值就是 [object Array] 。
但是由于Array.isArray兼容性(IE 9+/FireFox 4+/Safari 5+/Opera 10.5+/Chrome)存在问题,所以我们不得不考虑到在低级浏览器中的后备方案。
var isArray = nativeIsArray || function(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
};
内置对象在使用typeof操作符鉴定其类型时,都会返回“object”,但是有一个例外,就是Function对象
var isObject = function(obj) {
var type = typeof obj;
return type === 'function' || type === 'object' && obj;
};
同Array的鉴定方法,通过对比Object.prototype.toString返回的字符串与内置对象的名称来判断
我们知道,NaN是一个非常特殊的值,为什么特殊呢?因为其含义为非数值(Not a Number),但是typeof NaN === “number”,因为NaN是JavaScript中唯一一个与任何值都不相等(包括自身)的值:
var isNaN = function(value) {
return value !== value;
}
其实在ES6中引入了Number.isNaN方法用于鉴定NaN,它与全局函数isNaN的区别在于Number.isNaN在鉴定之前不会对参数进行强制转换,这就确保了鉴定的结果满足严格的定义。
var isNull = function(obj) {
return obj === null;
};