`
holdbelief
  • 浏览: 704920 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

联合数组以及Prototype的风险

阅读更多

联合数组以及Prototype的风险

    联合数组以及Prototype的风险

 

    Associative Arrays and the Risks of Prototype

 

    JavaScript的对象都可以作为联合数组(associative arrays,也称为哈希、哈希结构或者哈希表)。这就意味着你可以使用点符号来访问一个对象属性:

 

    someObject.objProperty

 

     你还可以使用数组符号访问一个属性,给出属性名称作为索引:

     someObject["objProperty"]

 

     在键值对之间进行映射是联合数组固有的特征。由于JavaScript对象可以作为联合数组,所以你也可以使用JavaScript的for...in语句来迭代对象的属性:

 

     for (props in obj) {...}

 

     你还可以利用任何JavaScript对象,来建立一个新的联合数组,包括Array、RegExp、Object、String等。如下代码就使用了Array对象,这也是非常恰当的用法:

 

     var newArray = new Array();

     newArray['1'] = 'one';

     newArray['3'] = 'three';

    

     它看上去非常简单,但是,这在那些使用JavaScript的人,尤其是使用Prototype的人之间会引发一些非常激烈的争论。

 

     有些人会说,在JavaScript中没有联合数组,这种功能只不过是添加运行期属性的一种方式罢了。但是,暂且不说语义如何,这种功能和联合数组是相匹配的(数组元素是由键或者名称,而不是由数字来指定的),因此,从各个方面来说,它都是联合数组。

 

     还有些人说,在JavaScript中使用联合数组是错误的,或者是有害的。他们解释说:使用Array对象建立一个联合数组,违反了自然规律——通常给你提供有关数组信息的方法就不再工作了,例如:长度,并且我们应该仅仅将Array对象,用于传统的数字数组来支持可预料的行为。

 

     对于Prototype来说,这是一个相当尖锐的问题,因为它通过prototype属性扩展了基本的Array对象。如果你从Array对象建立一个联合数组,而Prototype这样的库会扩展联合数组本身,那么当你使用for...in来查询它时,你可能会得到不可预料的结果,而且很有可能会导致应用程序中断。

 

     为了取代使用Array作为联合数组这种方式,一些Ajax专家建议使用Object。在Prototype 1.4版本中也使用了prototype属性,扩展了JavaScript中基本的Object,但Stephenson又把它从1.5版本中剔除了。因此它仍旧扩展了String、Array以及其他对象,如果使用联合数组功能来访问应用程序中的对象属性,你就应该清楚这些内容。

 

     警告:你也需要非常清楚prototype的扩展能力,如果你正在使用多个库,它们各自都有可能在原始的JavaScript对象上建立自己的扩展。这些库之间的冲突可能会导致一些很难调试而且又不可思议的问题。

 

 

分享到:
评论
1 楼 strangeromo 2009-03-03  
这个问题我也遇见了。我在用for in循环遍历一个联合数组的时候,不仅遍历到了联合数组中的内容,而且还得到了prototype扩展Array对象的一些方法名。
到底应该如何解决呢?不知道博主有没有好方法?

相关推荐

    复制数组或从数组中抽取特定元素组成新数组

    本文将深入探讨如何有效地复制数组以及如何从数组中抽取特定元素来组成新的数组,这将帮助我们更好地理解和掌握JavaScript中的数组操作技巧。 ### 复制数组 复制数组通常指的是创建一个与原数组具有相同元素的新...

    js实现json数组分组合并操作示例

    在JavaScript编程中,...综上,本示例展示了JavaScript处理JSON数组的分组合并操作,涉及到的基本概念包括数组遍历、对象属性访问、哈希映射以及数组操作。了解这些知识点有助于提升在实际项目中处理JSON数据的能力。

    Javascript数组Array方法解读

    所有数组的方法都定义在Array.prototype上,而Array.prototype本身也是一个数组。 array.concat() 浅复制一份当前数组,并把接收到的参数附加到新数组的末尾。原数组不改变。 语法 array.concat(value1, value2, …,...

    Javascript数组操作整理.rar

    11. Array.prototype.includes(): 判断数组中是否存在指定元素,存在则返回true,不存在则返回false。 以上是JavaScript数组操作的基础知识,熟练掌握这些操作,能有效提升你在处理数组时的效率和代码质量。在...

    js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解

    本文将重点讲解如何实现数组扁平化以及`push()`和`concat()`方法的区别。 首先,让我们看看如何通过递归方法实现数组扁平化。这种方法分为两种,一种是基础的递归,另一种是更推荐的递归方式。 **递归一**: ```...

    Js 清空数组及注意事项.

    如果你不想改变原数组的引用,可以使用`Array.prototype.splice()`方法: ```javascript aa.splice(0, aa.length); ``` 这个方法会删除从索引0开始到当前数组长度的所有元素,达到清空数组的效果,同时不会改变原...

    js 数组工具类 ArrayUtil

    JavaScript的`Array.prototype.concat()`方法只能合并两个数组,而ArrayUtil的`concatAll`可以接受任意数量的数组作为参数,一次性将它们连接起来。 2. **数组去重** (`unique`) JavaScript的数组没有内置的去重...

    prototype

    例如,Prototype提供了如`$`, `$$`, `$A`, `$F`, `$H`, `$R`, `$w`, `Try.these`等实用函数,以及`document.getElementsByClassName`等扩展方法,极大地提高了JavaScript的可读性和效率。 #### 三、Prototype的API...

    详解vue 数组和对象渲染问题

    总之,当使用Vue处理数组和对象时,需要注意直接操作数组长度、索引赋值以及对象属性的直接修改可能不会触发视图更新。应尽量避免这些操作,转而使用Vue提供的方法或JavaScript的替代方案来确保数据变化能正确反映到...

    JS数组降维–Array.prototype.concat.apply([], arr)

    JS数组降维–Array.prototype.concat.apply二维数组降为一维数组循环降维concat降维apply和concat降维Vue2.6.11版本源码降维多维数组降为一维数组递归降维 把多维数组(尤其是二维数组)转化为一维数组是业务开发中...

    Prototype-1.6.0 中文版\英文版\Prototype.js

    这个压缩包包含了Prototype的1.6.0版本,包括中文版和英文版的文档,以及源代码文件。 首先,让我们详细了解Prototype.js。Prototype是Adam Slovik和Sam Stephenson在2005年开发的,它的目标是通过提供类、对象继承...

    【JavaScript源代码】Nodejs 数组的队列以及forEach的应用详解.docx

    本文主要探讨了如何利用数组的特性,特别是`push`、`shift`方法实现队列的先进先出(FIFO)原则,以及`forEach`方法在数组操作中的应用和注意事项。 ### 数组与队列 在JavaScript中,数组天生支持队列的操作。`...

    js从数组中删除指定值(不是指定位置)的元素实现代码

    首先,我们需要了解如何通过`Array.prototype.indexOf`方法来查找数组中元素的索引位置。这个方法接受一个参数,遍历数组寻找第一个与该参数相等的元素。如果找到了,就会返回这个元素的索引;如果没有找到,就会...

    JavaScript 数组 增加 和 删除

    ### JavaScript 数组增加和删除方法详解 在JavaScript中,数组是一种非常重要的数据结构,用于存储一系列按顺序排列的值。本文将详细介绍如何通过自定义方法实现数组元素的插入与删除功能。 #### 插入方法 `insert...

    Prototype_1.4.doc,Prototype_1.5.1.chm 中文版

    1. **Prototype库基础**:Prototype库提供了一系列的JavaScript扩展,包括类、对象、数组、字符串和函数的增强,以及DOM操作、事件处理、Ajax请求等工具。 2. **类与对象**:Prototype通过模拟面向对象编程的概念,...

    Prototype中文帮助文档

    Prototype 为Array和Hash对象添加了许多实用的方法,如`Array.each()`遍历数组,`Array.include()`将元素添加到数组,`Hash.keys()`获取哈希的所有键,以及`Hash.values()`获取所有值。这些方法极大地提高了处理数组...

    Prototype1.5.1使用手册

    Prototype库的核心理念是通过扩展JavaScript的内置对象,如Array、String、Function等,以及提供便捷的DOM操作方法,简化前端开发工作。1.5.1版本是Prototype的一个稳定版本,包含了众多实用的功能和修复了一些已知...

    prototype 开发应用手册,笔记,prototype.js文件下载

    在工具性方面,Prototype提供了数组、字符串、日期等基本类型的操作方法,如`Array.prototype.each`用于遍历数组,`String.prototype.include`用于检查字符串是否包含特定子串。这些扩展极大地丰富了JavaScript的...

    js实现数组去重、判断数组以及对象中的内容是否相同

    在提供的代码中,`Array.prototype.distinct` 函数被定义为一个扩展数组原型的方法。这个函数通过排序数组并比较相邻元素来实现去重。它特别处理了两种特殊类型的数据:对象和数组。如果相邻的两个元素都是对象,...

    jQery中类数组判断的实现原理及代码实现

    在JavaScript的世界里,jQuery是一个广泛使用的库,它极大地简化了DOM操作、事件处理以及Ajax交互。在jQuery中,经常会遇到需要处理类似数组的对象,比如`jQuery对象`就是一个典型的类数组对象。本文将深入探讨...

Global site tag (gtag.js) - Google Analytics