本教程操作环境:windows7系统、javascript1.8.5版、dell g3电脑。
javascript判断数据类型的方法1、typeof
typeof 是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型。
返回的结果用该类型的字符串(全小写字母)形式表示,包括以下 7 种:string、number、boolean、symbol、undefined、object、function 等。
typeof 'a'; // string 有效typeof 1; // number 有效typeof true; //boolean 有效typeof symbol(); // symbol 有效typeof undefined; //undefined 有效typeof new function(); // function 有效typeof null; //object 无效typeof [1] ; //object 无效typeof new regexp(); //object 无效typeof new date(); //object 无效
总结:
对于基本类型,除 null 以外,均可以返回正确的结果。对于引用类型,除 function 以外,一律返回 object 类型。对于 null ,返回 object 类型。对于 function 返回 function 类型。其中,null 有属于自己的数据类型 null ,引用类型中的数组、日期、正则 也都有属于自己的具体类型,而 typeof 对于这些类型的处理,只返回了处于其原型链最顶端的 object 类型。
2、instanceof
instanceof 检测的是原型,表达式为:a instanceof b,如果 a 是 b 的实例,则返回 true,否则返回 false。
[] instanceof array; // truenew date() instanceof date;// true function person(){};new person() instanceof person;//true [] instanceof object; // truenew date() instanceof object;// truenew person instanceof object;// true
虽然 instanceof 能够判断出 [ ] 是array的实例,但它认为 [ ] 也是object的实例,为什么呢?
从 instanceof 能够判断出 [ ].__proto__ 指向 array.prototype,而 array.prototype.__proto__ 又指向了object.prototype,最终 object.prototype.__proto__ 指向了null,标志着原型链的结束。因此,[ ]、array、object 就在内部形成了一条原型链,如下图所示:
从原型链可以看出,[] 的 __proto__ 直接指向array.prototype,间接指向 object.prototype,所以按照 instanceof 的判断规则,[] 就是object的实例。依次类推,类似的 new date()、new person() 也会形成一条对应的原型链 。
因此,instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。
针对数组的这个问题,es5 提供了 array.isarray() 方法 。该方法用以确认某个对象本身是否为 array 类型,而不区分该对象在哪个环境中创建。
if (array.isarray(value)){ //对数组执行某些操作}
array.isarray() 本质上检测的是对象的 [[class]] 值。
[[class]] 是对象的一个内部属性,里面包含了对象的类型信息,其格式为 [object xxx],xxx 就是对应的具体类型 。对于数组而言,[[class]] 的值就是 [object array] 。
【相关推荐:javascript学习教程】
3、constructor
当一个函数 f被定义时,js引擎会为f添加 prototype 原型,然后再在 prototype上添加一个 constructor 属性,并让其指向 f 的引用。如下图所示:
当执行 var f = new f() 时,f 被当成了构造函数,f 是f的实例对象,此时 f 原型上的 constructor 传递到了 f 上,因此 f.constructor == f
可以看出,f 利用原型对象上的 constructor 引用了自身,当 f 作为构造函数来创建对象时,原型上的 constructor 就被遗传到了新创建的对象上, 从原型链角度讲,构造函数 f 就是新对象的类型。这样做的意义是,让新对象在诞生以后,就具有可追溯的数据类型。
同样,javascript 中的内置对象在内部构建时也是这样做的,如下图所示。
总结:
1. null 和 undefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断。
2. 函数的 constructor 是不稳定的,这个主要体现在自定义对象上,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor 会默认为 object。
4、tostring
tostring() 是 object 的原型方法,调用该方法,默认返回当前对象的 [[class]] 。这是一个内部属性,其格式为 [object xxx] ,其中 xxx 就是对象的类型。
对于 object 对象,直接调用 tostring() 就能返回 [object object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。
语法:object.prototype.tostring.call(value);
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 的引用
更多编程相关知识,请访问:编程视频!!
以上就是javascript怎么判断数据类型的详细内容。
