数据类型判断

typeof:

使用typeof可以判断除了null之外所有数据类型,但是

typeof null // 'object'

这是因为在js最初版本中使用的32位系统,出于性能考虑,000开头表示变量,但是null的所有位数全是0,所以被错误的判断为对象。使用Object.prototype.toString.call(xx)方法可以得正确的数据类型。

Object.prototype.toString.call(null) // [object null]

判断已知对象类型的方法: instanceof

instanceof 是用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。 在这里需要特别注意的是:instanceof 检测的是原型,我们用一段伪代码来模拟其内部执行过程:

instanceof (A,B) = {
    var L = A.__proto__;
    var R = B.prototype;
    if(L === R) {
        // A的内部属性 __proto__ 指向 B 的原型对象
        return true;
    }
    return false;
}

从上述过程可以看出,当 A 的 proto 指向 B 的 prototype 时,就认为 A 就是 B 的实例,我们再来看几个例子:

[] instanceof Array; // true
{} instanceof Object;// true
new Date() instanceof Date;// true
 
function Person(){};
new Person() instanceof Person;
 
[] instanceof Object; // true
new Date() instanceof Object;// true
new Person instanceof Object;// true

从 instanceof 能够判断出 [ ].proto 指向 Array.prototype,而 Array.prototype.proto 又指向了Object.prototype,最终 Object.prototype.proto 指向了null,标志着原型链的结束。因此,[]、Array、Object 就在内部形成了一条原型链:

image

从原型链可以看出,[] 的 proto 直接指向Array.prototype,间接指向 Object.prototype,所以按照 instanceof 的判断规则,[] 就是Object的实例。依次类推,类似的 new Date()、new Person() 也会形成一条对应的原型链 。因此,instanceof 只能用来判断两个对象是否属于实例关系****, 而不能判断一个对象实例具体属于哪种类型。

instanceof 操作符的问题在于,它假定只有一个全局执行环境。如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。

constructor

[].constructor = Array
true.constructor = Boolean

注意:

  1. null 和 undefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断。

  2. 函数的 constructor 是不稳定的,这个主要体现在自定义对象上,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor 会默认为 Object。

Object.prototype.toString.call

toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 下界降雨不断,可连天上都沉闷不见阳光,我不免抑郁。 此刻,我腾着云往一处不起眼的悬崖而去。幸亏兵央行事张扬,我轻而...
    屈宁欢阅读 435评论 0 1
  • 晚上睡不着,醒来,一个念头从脑海划过,我给了孩子什么样的教育?很多时候,我在意的只是孩子的成绩,从来没有在意过他的...
    雅志清新阅读 729评论 12 19
  • 1 故事的开始,是在那个阳光明媚的午后。 她盯着湖中央那只一动不动的天鹅看了很久,直到它缓慢地移动到了湖的另一边。...
    2fafec4cec1b阅读 294评论 0 0
  • 2017年2月9日,第一天 摘录(序言至第一章): 1. 只有你先把大石头放进瓶子,你才可能放进小石头,再放沙子,...
    吴丽滨阅读 737评论 0 3