JS的基本数据类型:String、Number、Boolean、Null、Undefined、symbol(ES6);
引用类型:Object
一、typeof:(可以对基本类型(包括function)做出准确的判断
引用类型就只会返回Object;
二、求得对象的具体类型
1. instanceof运算符用于测试 构造函数的prototype属性是否出现在对象的原型链中的任何位置.
A instanceof B : 当 A 的 __proto__
指向 B 的 prototype
时,就认为 A 就是 B 的实例.
用于判断对象A是不是B构造函数构造出来的---->看A的原型链上有没有B的原型
1>当用来判断是Object还是Array时,
var arr = [];
arr instanceof Array
true
arr instanceof Object
true
2> instanceof 操作符,它假定只有一个全局执行环境。如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
aArray = window.frames[0].Array;
var arr = new aArray(1,2,3);
此时:
arr instanceof Array
false
如果是
var arr = new Array(1,2,3);
此时:
arr instanceof Array
true
为了解决这个问题, ECMAScript 5 新增了 Array.isArray() 方法。这个方法的目的是最终确定某个值到底是不是数组,而不管它是在哪个全局执行环境中创建的。
var arr = [];
Array.isArray(arr)
2、constructor 判断对象的构造方法
而一个对象的构造方法是可以被改变的:
function A(){}
function B(){}
A.prototype.constructor = B;//此时我们就修改了A构造函数的指向问题
var aa = new A();
console.log(aa.constructor == A);//false
console.log(aa.constructor == B);//true
此时的结果就倾向了与真实错误的构造方法。
3、toString
toString是Object原型对象上的一个方法,该方法默认返回其调用者的具体类型。
使用:
Object.prototype.toString.call(value) ->找到Object原型上的toString方法,让方法执行,并且让方法中的this变为value(要检测的值)
Object.prototype.toString常用来判断对象值属于哪种内置属性,它返回一个JSON字符串——"[object 数据类型]";
var obj = {};
Object.prototype.toString.call(obj)
"[object Object]"
var arr = [];
Object.prototype.toString.call(arr)
"[object Array]"
这个方法很好的解决了跨frame对象构建的问题,经过测试,各大浏览器兼容性也很好
注释:
使用Object.create()创建的js对象,没有constructor;
var a = Object.create(null)
a
{
No properties
}
文章着重于引用类型几种判断方法的用法和优缺点;以上代码为在控制台运行形势;( 作此总结)