给大家讲个小窍门!怎么知道人家另一半是否是数组?很简单!但里面也有点小道理的
// 数值 typeof 37 === 'number'; // 字符串 typeof '' === 'string'; // 布尔值 typeof true === 'boolean'; // Symbols typeof Symbol() === 'symbol'; // Undefined typeof undefined === 'undefined'; // 对象 typeof {a: 1} === 'object'; typeof [1, 2, 4] === 'object'; // 下面的例子令人迷惑,非常危险,没有用处。避免使用它们。 typeof new Boolean(true) === 'object'; typeof new Number(1) === 'object'; typeof new String('abc') === 'object'; // 函数 typeof function() {} === 'function';
讲到typeof这个家伙,简单案例告诉我们,除了数组和空值,其他东西大部分都能用它搞定。真的挺好用的,但要记得,如果网页里有好多iframe,那麻烦就大!因为每个iframe都是个小程序,所以里头的函数你可能就看不见了。
var arr = [1,2,3,1]; console.log(arr instanceof Array); // true var fun = function(){}; console.log(fun instanceof Function); // true
咱们来唠唠关于’instanceof’和object’styleOf()’属性的事儿。别看它们跟JavaScript面向对象好像没啥关联,实际上还是有些联系的!这个小技巧,主要就是通过查看对象原型链里头是否存在一个叫prototype的构造函数对象。看似简简单单,可在实战中,你会遇到各种各样的问题,特别是当我们处理跨iframe的对象实例化的时候。唉,你想,每个iframe都是完全独立的,那这个方法在这里就有点行不通咯。
var arr = [1,2,3,1]; console.log(arr.constructor === Array); // true var fun = function(){}; console.log(arr.constructor === Function); // true
你想问的那个东东是数组吗?直接拿 Object.prototype.toString来看!不过要注意了,要用call调用,这样就能把this指向obj了。但别忘了这招儿只适用于IE8及以上版本,老版本浏览器就抓瞎~
var iframe = document.createElement('iframe'); //创建iframe document.body.appendChild(iframe); //添加到body中 xArray = window.frames[window.frames.length-1].Array; var arr = new xArray(1,2,3); // 声明数组[1,2,3] alert(arr instanceof Array); // false alert(arr.constructor === Array); // false
放心,咱这儿还有别的招儿!告诉你,ES5给我们带来了个新功能—Array.isArray(),这玩意儿能准确判断手里的数据是不是数组。好多浏览器现在都能用上这个,像IE9和更高版本、Firefox 4或以上,还有Safari 5或更高,Opera 10.5或更高以及 Chrome等。但是对用IE8或更老版本的人来说,这招儿效果可能没那么好。所以,处理数据时要注意咯,保证拿到的真是数组才行哟。
Object.prototype.toString.call( [] ) === '[object Array]' // true Object.prototype.toString.call( function(){} ) === '[object Function]' // true
为啥咱们不再用原型链来测兼容性?说白了就是不够快~试想,浏览器要是有了Array.isArray()方法,那还要费劲找原型链干嘛?再说了,它速度可是原型链的两倍,这多方便
好,我现在就给你说一下咋解决这问题!总的来说,最有效的做法就是首先判断一下这玩意儿是不是Array(),要是不对的话,那就直接用咱们熟悉的with方法,这样不仅能保证兼容性还可以提升效率呐!今天的课就到这里,希望这堆知识能帮到你们有啥不懂的记得在下面留言再次感谢大伙儿一直以来的支持!
[].__proto__ === Array.prototype // true var fun = function(){} fun.__proto__ === Function.prototype // true
评论0