JS常见类型和判断
1.常见的7种类型
- 1.null
- 2.undefined
- 3.boolean
- 4.number
- 5.string
- 6.引用类型
- 7.symbol
2.判断相等
1.typeof(两个特殊)
console.log(typeof null); //object
console.log(typeof []); //object
2.instanceof(只适合判断object类型)
const a1 = [];
const a2 = function() {
}
const a3 = {
}
console.log(a1 instanceof Array);//true
console.log(a1 instanceof Object);//true
console.log(a2 instanceof Function);//true
console.log(a2 instanceof Object);//true
console.log(a3 instanceof Object);//true
instanceof 操作符的问题在于,它假定只有一个全局执行环境。如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
xArray = window.frames[0].Array;
var arr = new xArray(1,2,3); // [1,2,3]
arr instanceof Array; // false
Array.isArray() 本质上检测的是对象的 [[Class]] 值,[[Class]] 是对象的一个内部属性,里面包含了对象的类型信息,其格式为 [object Xxx] ,Xxx 就是对应的具体类型 。对于数组而言,[[Class]] 的值就是 [object Array]。
3.constructor
- 实例对象的原型上有constructor属性指向其构造函数,该属性会传递给实例
- null 和 undefined 是无效的对象,因此是不会有 constructor 存在的。
- 函数的 constructor 是不稳定的,这个主要体现在自定义对象上,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor 会默认为 Object。在重写对象原型时一般都需要重新给 constructor 赋值,以保证对象实例的类型不被篡改。
4.Object.prototype.toString.call()
toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。
console.log(Object.prototype.toString('')) //[object Object]
console.log(Object.prototype.toString.call('')) //[object String]
console.log(Object.prototype.toString([])) //[object Object]
console.log(Object.prototype.toString.call([])) //[object Array]