Ar ray没有indexOf方法,这样在一个数组中查找某个元素的索引时比较麻烦,为了调用方便,于是通过prototype原型扩展了Array.prototype.indexOf(),这样用起来就比较方便了。但是这个自定义的indexOf在对数组进行遍历的时候却出现了问题。

Array.prototype.indexOf = function(item) {  

for (var i = 0; i 

用的时候直接

var arr=[1,2,3,4,5];  

var index=arr.indexOf(1); //index==0

扩展了以后,用起来很爽很方便,一片和谐景象...

但是某次是遍历数组元素的时候,使用for..in..循环,引发了其他的问题,打破了这个和谐的氛围。

var a=["张飞","关羽","刘备","吕布"];  

for(var p in a){  

  document.write(p "=" a[p] "
");  }

本来想输出这四个人的名字,结果输出的是什么呢?

输出的居然是:

//0=张飞  

//1=关羽  

//2=刘备  

//3=吕布  

//indexOf=function(item) { for (var i = 0; i 

除了把名字打出来以外,还额外输出了自己扩展的方法indexOf,但是令人疯狂的是,firefox却是“正常”的,只有四个人的人名,为什么会这样?

输出indexOf,自己扩展的,可以理解,毕竟for..in是遍历一个对象的所有用户定义的属性或者一个数组的所有元素。

那么firefox为什么不会?

后来查了资料才明白,

Array在javascript1.6版本已经支持Array.indexOf(),而我用的firefox是3.5版本,已经支持javascript1.8了,indexOf是其Array本身固有的方法了。

而IE,即使我用的是IE8,也才支持到javascript1.3版本。

所以IE8认为indexOf是“用户定义的属性”,而firefox认为是自己原生支持的固有的属性。

真的是这样吗?

做个实验,把indexOf更名为myIndexOf,再试试,结果IE和firefox都输出myIndexOf,证明前面的观点是正确。

那么又来了个问题,我扩展indexOf很久了,现在不少项目的代码都已经在使用这个方法,而现在我非要使用for..in输出数组本身的元素,不要其他我自己扩展到俄方法,怎么办?

好在javascript提供了hasOwnProperty方法。

看一下其描述:

Every object descended from Object inherits the hasOwnProperty method. This method can be used to determine whether an object has the specified property as a direct property of that object; unlike the in operator, this method does not check down the object's prototype chain

看描述,就是我们想要的东西。

在for...in..里做个 判断就OK了

if(a.hasOwnProperty(p)){  

            document.write(p "=" a[p] "
");          }

另外,附上hasOwnProperty用法示例,来源于互联网:

function Book(title, author) {  

   this.title = title;  

   this.author = author;  

  }  

   Book.prototype.price = 9.99;  

   Object.prototype.copyright = "herongyang.com";  

   var myBook = new Book("JavaScript Tutorials", "Herong Yang");  

   // Dumping built-in properties at the base prototype level  

   document.writeln("/nObject.prototype's built-in properties:");  

   dumpProperty(Object.prototype, "constructor");  

   dumpProperty(Object.prototype, "hasOwnProperty");  

   dumpProperty(Object.prototype, "isPrototypeOf");  

   dumpProperty(Object.prototype, "toString");  

   dumpProperty(Object.prototype, "valueOf");  

   dumpProperty(Object.prototype, "copyright");  

   // Dumping built-in properties at the my prototype level  

   document.writeln("/n==================/nBook.prototype's built-in properties:");  

   dumpProperty(Book.prototype, "constructor");  

   dumpProperty(Book.prototype, "hasOwnProperty");  

   dumpProperty(Book.prototype, "isPrototypeOf");  

   dumpProperty(Book.prototype, "toString");  

   dumpProperty(Book.prototype, "valueOf");  

   dumpProperty(Book.prototype, "copyright");  

   // Dumping built-in properties at the object level  

   document.writeln("/n==================/nmyBook's built-in properties:");  

   dumpProperty(myBook, "constructor");  

   dumpProperty(myBook, "hasOwnProperty");  

   dumpProperty(myBook, "isPrototypeOf");  

   dumpProperty(myBook, "toString");  

   dumpProperty(myBook, "valueOf");  

   dumpProperty(myBook, "copyright");  

function dumpProperty(object, property) {  

   var inheritance;   

   if (object.hasOwnProperty(property))   

      inheritance = "Local";  

   else  

      inheritance = "Inherited";  

   document.writeln(property ": " inheritance ": " 

       object[property]);  

}

查看浏览器支持javascript到哪个版本:

  

  

   

  浏览器的JavaScript版本支持测试  

   

   

       

      

      

      

      

    

    

    

    

     

   

为JS扩展Array.prototype.indexOf引发的问题及解决办法的更多相关文章

  1. ios – 数组的数组.仅存储副本

    我需要存储一个Int数组的数组,用于有序重复.例:>给定数组:mainArray=[7,7,3,2,1,5,5]现在我需要创建一个int数组的数组.例:这是我有的:解决方法您可以使用reduce方法.减少工作如何?reduce将封闭中的逻辑应用于空的2D数组的整数和数字的第一个elm.然后再次应用上一次迭代的结果和第二个整数数组…if是否检查在结果中添加的最后一个数组中的数字是否等于当前检查的整数.如果这样,那个整数被添加到该数组.否则,只会添加一个仅包含新整数的数组.测试

  2. Swift:Generators 与 Sequences 浅析

    前言Generators与Sequences构成了Swift式循环。Generators提到数组我们就会想到遍历,一般的遍历可能都是从头到尾进行的。这时候Generators就可以派上用场了。举个倒序索引的generator:好处是啥好处是啥,我的总结是把一个很抽象遍历模式使用Generators的方式剥离出来,当你对当前的迭代循环方式不爽的时候只需要修改一下当前的这个generator。SequencesGenerators在循环过程中每个元素提供的服务是一次性的。

  3. 再探Swift基础

    基础tuplesstringsnumericfor循环while循环if条件switchoptionalarraydictionaryset

  4. swift排序算法和数据结构

    vararrayNumber:[Int]=[2,4,216)">6,216)">7,216)">3,216)">8,216)">1]//冒泡排序funcmaopao->[Int]{forvari=0;i

  5. Arrray 中的map和filter 函数的使用

    swift中的Array提供了两个很方便的函数map和filter使用map可以建立一个从A数组到B数组的一个映射,例如:我们给数组的每个元素后添加一个testvararray=["1","2","3"];printlnfuncfx->String{returnstr+"test"}我们还可以使用filter函数按条件过滤一些不符合条件的数组例如:vararray=[1,4,10];array=array.filterprintln//结果[4,10]另外一种写法:array.filter

  6. Swift 2.0学习笔记Day 17——Swift中数组集合

    数组中的集合元素是有序的,可以重复出现。varstudentList1:ArrayvarstudentList2:[String]声明的Array还不能用,还需要进行初始化,Array类型往往在声明的同时进行初始化。示例代码如下:varstudentList1:Array=["张三","李四","王五","董六"]varstudentList2:[String]=["张三","董六"]letstudentList3:[String]=["张三","董六"]varstudentList4=[String](

  7. Swift高级开发语言基础

  8. Swift关于Array的探讨

    当我们想向Array添加不同数据类型的元素时,可以这样做:这样我们便可以向Array添加任何数据类型的元素了,但是如果我们希望Array中只能添加特定几种类型的元素怎么办呢?这里提供一种思路:

  9. 《从零开始学Swift》学习笔记Day 17――Swift中数组集合

    数组中的集合元素是有序的,可以重复出现。,Array类型往往在声明的同时进行初始化。整个遍历过程与循环分不开,可以使用for-in循环。下面是遍历数组的示例代码:运行结果如下:张三李四王五Item1:张三Item2:李四Item3:王五欢迎关注关东升新浪微博@tony_关东升。

  10. Swift学习 数组

    1、计算数组的长度count:计算数组的长度2、判断数组是否为空isEmpty:判断数组是否为空3、在数组尾部添加元素append:在数组尾部添加元素4、通过下标修改数组元素的值5、数组的插入insert:通过insert和下标向数组中插入元素6、数组的删除7、数组的遍历8、数组的拼接

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部