Created
October 10, 2014 08:12
-
-
Save reacher-lu/f4cb974dae0f8836ef57 to your computer and use it in GitHub Desktop.
js数据类型判断和数组判断
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
http://www.cnblogs.com/mofish/p/3388427.html | |
js判断数组类型的方法 | |
方法一之 instanceof | |
instance,故名思义,实例,例子,所以instanceof 用于判断一个变量是否某个对象的实例,是一个三目运算式---和typeof最实质上的区别 | |
a instanceof b?alert("true"):alert("false") //注意b值是你想要判断的那种数据类型,不是一个字符串,比如Array | |
举个栗子: | |
var a=[]; | |
console.log(a instanceof Array) //返回true | |
方法二之 constructor | |
在W3C定义中的定义:constructor 属性返回对创建此对象的数组函数的引用 | |
就是返回对象相对应的构造函数。从定义上来说跟instanceof不太一致,但效果都是一样的 | |
如: (a instanceof Array) //a是否Array的实例?true or false | |
(a.constructor == Array) // a实例所对应的构造函数是否为Array? true or false | |
举个栗子: | |
复制代码 | |
function employee(name,job,born){ | |
this.name=name; | |
this.job=job; | |
this.born=born; | |
} | |
var bill=new employee("Bill Gates","Engineer",1985); | |
console.log(bill.constructor); //输出function employee(name, jobtitle, born){this.name = name; this.jobtitle = job; this.born = born;} | |
复制代码 | |
那么判断各种类型的方法就是: | |
console.log([].constructor == Array); | |
console.log({}.constructor == Object); | |
console.log("string".constructor == String); | |
console.log((123).constructor == Number); | |
console.log(true.constructor == Boolean); | |
-------------------------------------以下不是原创-------------------------------------- | |
较为严谨并且通用的方法: | |
function isArray(object){ | |
return object && typeof object==='object' && | |
Array == object.constructor; | |
} | |
!!注意: | |
使用instaceof和construcor,被判断的array必须是在当前页面声明的!比如,一个页面(父页面)有一个框架,框架中引用了一个页面(子页面),在子页面中声明了一个array,并将其赋值给父页面的一个变量,这时判断该变量,Array == object.constructor;会返回false; | |
原因: | |
1、array属于引用型数据,在传递过程中,仅仅是引用地址的传递。 | |
2、每个页面的Array原生对象所引用的地址是不一样的,在子页面声明的array,所对应的构造函数,是子页面的Array对象;父页面来进行判断,使用的Array并不等于子页面的Array;切记,不然很难跟踪问题! | |
方法三之 特性判断法 | |
以上方法均有一定的缺陷,但要相信人民大众的智慧是无所不能及的,我们可根据数组的一些特性来判断其类型 | |
复制代码 | |
function isArray(object){ | |
return object && typeof object==='object' && | |
typeof object.length==='number' && | |
typeof object.splice==='function' && | |
//判断length属性是否是可枚举的 对于数组 将得到false | |
!(object.propertyIsEnumerable('length')); | |
} | |
复制代码 | |
有length和splice并不一定是数组,因为可以为对象添加属性,而不能枚举length属性,才是最重要的判断因子。 | |
ps: 在这里普及下 propertyIsEnumerable 方法: | |
object. propertyIsEnumerable(proName) | |
判断指定的属性是否可列举 | |
备注:如果 proName 存在于 object 中且可以使用一个 For…In 循环穷举出来,那么 propertyIsEnumerable 属性返回 true。如果 object 不具有所指定的属性或者所指定的属性不是可列举的,那么 propertyIsEnumerable 属性返回 false。 | |
propertyIsEnumerable 属性不考虑原型链中的对象。 | |
示例: | |
var a = new Array("apple", "banana", "cactus"); | |
document.write(a.propertyIsEnumerable(1)); | |
方法四之 最简单的方法 | |
对于这种方法,以下有几个链接可供参考解释: | |
http://blog.csdn.net/zhangw428/article/details/4171630 | |
http://my.oschina.net/sfm/blog/33197 | |
http://openxtiger.iteye.com/blog/1893378 | |
function isArray(o) { | |
return Object.prototype.toString.call(o) === ‘[object Array]‘; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment