检测数组
js中如何判断数组对象
这个好像提起来好简单啊。可能在java或者c当中这种东西就是一句话的问题,为毛这里要特别的还要写个blog来研究。。
其实小弟本来也是抱着这样的想法,直到有一天看到了大漠老师的一篇深入浅出的blog:http://www.w3cplus.com/javascript/array-part-2.html
才发现。。。自己too naive, too simple
javascript是一门弱语言,这个不仅仅是体现在变量上面的没有类型的强制性。还体现在在js世界中,其实像Function啊Array啊它们本质上都是对象。这就导致了我们在对某个变量进行类型检测的时候,如果只是简单的采用typeof去测它的话得到的大部分给你的答案都是Object。。。俗称:万物皆对象。
1 | console.log(typeof function () {return;}); // function |
你看你看,function还是function但是到了数组那儿,就是object了。
这就引出了这篇的blog
如何检测数组
大部分的浏览器都能通过ECMAScript5当中的isArray函数来检测,这个是一个很好用的内置函数。
1 | var arr = ['hello','张益达']; |
好的,本blog完结。。。。
=,=怎么可能这么随便,虽然nice的高逼格的客户群是不用不支持ECMAScript5的浏览器(IE8及之前)
但是。。抱着学术的态度,还是要研究研究如果我们自己实现一个isArray换句话说就是在IE8的这种浏览器下,怎么去判断数组;
废话不多说,直接给出方法表:
通过对象自身的
constructor属性的判断
1 | var arr = ["益达","nicefe"]; |
通过向上检测构造属性来判断是否为Array
通过instanceof操作符判断
1 | var arr = ["益达","nicefe"]; |
如果arr是一个Array对象的实例,那么就可以理解它是一个数组。
对象原生的toString方法的检测
1 | isArray = function(obj) { |
这种是通过判断你要判断的对象是否有toString()方法来判断是否为数组。但是这个方法,额,如果我一不小心给某个对象加上了toString()方法的话,那么这个函数也同样会认为它是数组了。。。。
这三种方法都是有效的;
最后大漠老师总结了一个合成的方法,在不知道浏览器情况的情况下先通过判断isArray()方法是否有效,无效的情况下再通过判断toString是否为它的方法。
1 | var isArray = (function () { |
over….