在开拓中,我们常常必要判定某个工具是否为数组范例,在Js中检测工具范例的常见要领都有哪些呢?
1.typeof 操纵符.对付Function, String, Number ,Undefined 等几种范例的工具来说,他完全可以胜任,可是为Array时
Copy to Clipboard 引用的内容:[www.veryhuo.com]
var arr=new Array("1","2","3","4","5"); alert(typeof(arr));
你会收到一个object 的谜底,有点让人扫兴 .
2.instanceof 操纵符,JavaScript中instanceof运算符会返回一个 Boolean 值,指出工具是否是特定类的一个实例。
行使要领:result = object instanceof class,照旧方才的数组,再来一次,嗯,乐成的返回 true.
Copy to Clipboard 引用的内容:[www.veryhuo.com]
var arrayStr=new Array("1","2","3","4","5"); alert(arrayStr instanceof Array);
小总结:看样子我们本日接头的题目已经获得相识答,但究竟上在多个frame中穿梭就会发生大题目了.
代码:
Copy to Clipboard 引用的内容:[www.veryhuo.com]
var iframe = document.createElement('iframe'); document.body.appendChild(iframe); xArray = window.frames[window.frames.length-1].Array; var arr = new xArray("1","2","3","4","5");//这个写法IE年迈下是不支持的,FF下才有
alert(arr instanceof Array); // false alert(arr.constructor === Array); // false
返回功效为两个False,让人大失所望。
ECMA-262 写道
Object.prototype.toString( ) When the toString method is called, the following steps are taken: 1. Get the [[Class]] property of this object. 2. Compute a string value by concatenating the three strings “[object “, Result (1), and “]”. 3. Return Result (2)
上面的类型界说了Object.prototype.toString的举动:起首,取得工具的一个内下属性[[Class]],然后依据这个属性,返回一个相同于"[object Array]"的字符串作为功效(看过ECMA尺度的应该都知道,[[]]用来暗示说话内部用到的、外部不行直接会见的属性,称为“内下属性”)。操作这个要领,再共同call,我们可以取得任何工具的内下属性[[Class]],然后把范例检测转化为字符串较量,以到达我们的目标。照旧先来看看在ECMA尺度中Array的描写吧:
ECMA-262 写道
new Array([ item0[, item1 [,…]]]) The [[Class]] property of the newly constructed object is set to “Array”.
于是操作这点,第三种要领登场了。
Copy to Clipboard 引用的内容:[www.veryhuo.com]
function isArray(obj) { return Object.prototype.toString.call(obj) === '[object Array]'; }
call改变toString的this引用为待检测的工具,返回此工具的字符串暗示,然后比拟此字符串是否是'[object Array]',以判定其是否是Array的实例。大概你要问了,为什么不直接o.toString()?嗯,固然Array担任自Object,也会有toString要领,可是这个要领有也许会被改写而达不到我们的要求,而Object.prototype则是老虎的屁股,很少有人敢去碰它的,以是能必然水平担保其“纯洁性”:)
与前面几个方案差异,这个要领很好的办理了跨frame工具构建的题目,颠末测试,各大赏识器兼容性也很好,可以安心行使。一个好动静是,许多框架,好比jQuery、Base2等等,都打算小心此要领以实现某些非凡的,好比数组、正则表达式等工具的范例鉴定,不消我们本身写了。
其它Ext3 也已经换成这样的写法了
Copy to Clipboard 引用的内容:[www.veryhuo.com]
isArray : function(v){ return toString.apply(v) === '[object Array]'; } (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|