前言
Javascript 数据类型分为两类:基本类型和引用类型
ES5 :Number String Null Undefined Boolean 和 Object
ES6 :新增了一个Symbol数据类型
此外,还有一个BigInt可能成为第八种数据类型,bigint 用来表示比2^53 -1更大的数
关于 Symbol和BIgInt 两位新成员 后续整理。
- instanceof
注意js">let a = []; a instanceof Array; //true a.instanceof Object //true let b = {}; b instanceof Array; //false b instanceof Object; //true let c = function(){} c instanceof Array; //false c instanceof Object; //false c instanceof Function; // true
prototype属性是可以修改的,所以并不是最初判断为true就一定永远为真。
其次,当我们的脚本拥有多个全局环境,例如html中拥有多个iframe对象, instanceof的验证结果可能不会符合预期,例如:
解释js">//为body创建并添加一个iframe对象 var iframe = document.createElement('iframe'); document.body.appendChild(iframe); //取得iframe对象的构造数组方法 xArray = window.frames[0].Array; //通过构造函数获取一个实例 var arr = new xArray(1,2,3); arr instanceof Array;//false
导致这种问题是因为iframe会产生新的全局环境,它也会拥有自己的Array.prototype属性,让不同环境下的属性相同很明显是不安全的做法,所以Array.prototype !== window.frames[0].Array.prototype,想要arr instanceof Array为true,你得保证arr是由原始Array构造函数创建时才可行。 - constructor
注意js">let arr = [1,3,4]; let obj = {} let fn = function(){} arr.constructor === Array;//true obj.constructor === Object;//ture fn.constructor === Function;//true
这种判断也会存在多个全局环境的问题,导致的问题与instanceof相同。 - Object.prototype.toString.call()
js">let arr = [1,2,3] Object.prototype.toString.call(arr) === '[object Array]';//true let obj = {} Object.prototype.toString.call(obj) === '[object Object]';//true let fn = function(){} Object.prototype.toString.call(fn) === '[object Function]' ;//true
- Array.isArray()
js">let arr = [1,2,3] Array.isArray(arr); //true
- 完成版
js">if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}
js">function judgeType (obj) {
if (typeof obj === 'undefined') {
return 'Undefined'
}
if (obj === null) {
return 'Null'
}
if (typeof obj === 'boolean') {
return 'Boolean'
}
if (typeof obj === 'string') {
return 'String'
}
if (typeof obj === 'number') {
return 'Number'
}
if (!Array.isArray) {
if (Object.prototype.toString.call(obj) === '[Object Array]') {
return 'Array'
}
} else {
if (Array.isArray(obj)) {
return 'Array'
}
}
return 'Object'
}
let num = 1
console.log(judgeType(num));
let bool = true
console.log(judgeType(bool));
let str = 'kk'
console.log(judgeType(str));
let empty = null
console.log(judgeType(empty));
let arr = []
console.log(judgeType(arr));
let obj = {}
console.log(judgeType(obj));