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

JavaScript面向对象程序设计(2): 数组

阅读更多
或许你会奇怪,面向对象的程序设计为什么从数组开始讲起?这是因为……其间的种种关系吧……嘿嘿,这里先卖个关子,先来看看我们熟悉的数组在JavaScript里面是什么样子的。
 
1. 创建数组
 
在JavaScript中有很多创建数组的方法。比如使用Array函数。不过这不是现在我们要讲述的。现在我们使用简单的方括号“[]”的办法来创建数组。
 
var objAyyar = []; // 1 
var objAyyar = [2]; // 2 
var objAyyar = ["a", "b", "c"]; // 3 
var objAyyar = [new Date(), 123, "abc"]; // 4
 
这里有四个创建数组的语句。下面来一一解释一下:
 
第一句,创建一个空的数组;
 
第二句,创建一个数组,数组元素只有一个2;
 
第三句,创建一个数组,数组的元素分别初始化为"a", "b", "c";
 
第四句,创建一个数组,其中第一个元素为一个Date类型的对象,第二个元素是数字123,第三个元素是字符串"abc"。
 
回顾一下,在Java或者C++语言中,数组是具有相同的数据类型的元素的集合。比如使用Java语言的下面语句
 
int[] array = new int[10];
 
将创建一个能放入10个int类型的元素的数组。数组和其他类型的集合的一个很大的区别是,数组里面只能存放相同数据类型的元素(使用泛型的集合除外)。但是,像上面的第四句,JavaScript的数组怎么能存放不同类型的元素呢?这是因为,JavaScript是弱类型的语言,没有很大的数据类型的差别,所以数组的元素可以放入不同的类型。
 
2. 操作数组
 
数组是元素的有序集合。数组中的元素是有序的,这就可以通过下标访问到数组中的每个元素。而且,JavaScript的数组相当的灵活。当你习惯了Java或者C++的数组之后,或许并不习惯JavaScript的数组。在一定程度上,这种数组可以称为一种动态数组。看这样一段代码:
 
var arr = [1, 2, 3, 4, 5];    
alert(arr.length); // 数组长度为5 
alert(arr[3]); // arr[3] = 4 
arr[9] = 10;    // 改变了数组的长度为10 
alert(arr[7]); 
alert(arr.length);
  
首先创建一个数组arr,可以看到它的长度是5,arr[3]是4。这些都是很常见的。那么第三句,arr[9] = 10;就有点意思了——在Java中,这句操作将导致数组越界的异常,在C++中,这种操作是极其危险的。但是在JavaScript中,这样的操作是正常的——你可以动态的改变数组的大小!虽然你在创建数组时并没有这么大的长度,但是,你可以在创建之后指定它!这时的arr.length已经自动的变成10了。那么,arr[7]又会是什么呢?经过运行代码我们会看到,arr[7]是undefined。也就是说,虽然arr[9]有了值,但是其中从arr[5]到arr[8]这几个元素都是未定义的,也就是undefined。如果你问JavaScript怎么不给个初始值?唉,饶了它吧!JavaScript并不知道你想要它初始化成什么值啊!万一错了呢?干脆还是别了吧……
 
var arr = [1, 2, 3, 4, 5];         
alert(arr.length); // 数组长度为5 
delete arr[3]; // 删掉第4个元素 
alert(arr.length); // 长度不变 
alert(arr[3]); // arr[3] = undefined 
arr.length = 4; // 缩短长度 
alert(arr[4]); 
arr.length = 10; // 增加长度 
alert(arr[6]);
  
上面的代码也很有意思:使用delete操作符可以删除任意一个数组元素,但是长度并不改变。
 
Java的数组也有一个length属性,用来显示数组的长度。JavaScript的数组也有这个属性。但是,和Java不同的是,后者的length属性并不是只读的!你可以任意的设置数组的length属性的值,无论是扩大还是缩小!只是如上面的代码所示,改变了length之后,越界的元素或者以前没有定义的元素都将成为undefined。也就是说,当length大于原始长度时,从原长度到length - 1的元素都将成为undefined;当length小于原始长度时,从length到原长度 - 1的元素也都会清除设置为undefined。
 
3. 非数字的下标?
 
如果动态的length属性还不够灵活的话,那么,JavaScript的数组还有另外的能力。
 
你见到过用字符串做数组下标的吗?Java行吗?C++行吗?JavaScript就行!看看下面的语句:
 
var arr = [1, 2, 3]; 
alert(arr[1] == arr["1"]); 
arr["js"] = 4; 
alert(arr["js"]);
  
上面的语句看到,arr[1]和arr["1"]实际是一样的效果!这是怎么回事呢?我们用下面的语句验证一下:
 
alert(1 == "1"); // true 
alert(1 === "1"); // false
  
由于JavaScript是弱类型语言,所以在使用变量的时候,JavaScript会尽可能的将它转换成所需要的类型。比如数组下面需要数字,那么提供一个字符串,将会试图把字符串转换成数字。这里的"1"就成功的转换成了数字1,于是这个语句就成立了。这就是使用 == 操作符返回true的原因。而 === 操作符不允许这样的类型转换,所以会返回false。
 
那么,这个arr["js"]怎么也能成立呢?这就不是上面的问题了。也就是说,JavaScript实际是允许将字符串作为数字下标的。这在JavaScript中是完全合法的。
分享到:
评论
3 楼 jiyanliang 2009-07-03  
引用
var objAyyar = []; // 1   
var objAyyar = [2]; // 2   
var objAyyar = ["a", "b", "c"]; // 3   
var objAyyar = [new Date(), 123, "abc"]; // 4 

结果不对吧
很明显的最后一个拿来四个元素啊,正确的结果应该是 0 1 3 3

令:创建数组还有下面几种非常重要的方式啊
var a = new Array();//一个没有元素的空数组
var a = new Array(5,4,3,"testing");//可以是任意类型,明确制定前n个元素的值
var a = new Array(5);//具有指定的元素个数(每个元素的值都是undefined),还将数组的length属性设成了指定的值.


引用
JavaScript怎么不给个初始值?唉,饶了它吧!JavaScript并不知道你想要它初始化成什么值啊!万一错了呢?干脆还是别了吧……

这里为什么没有对它初始化,这是为了减少内存损耗.万一你没注意弄个a[1000000000]出来,都初始化的话效率可想而知..
2 楼 Finder 2009-06-09  
02221021 写道
引用“那么,这个arr["js"]怎么也能成立呢?这就不是上面的问题了。也就是说,JavaScript实际是允许将字符串作为数字下标的。这在JavaScript中是完全合法的。“

数组可以赋予属性是js的波粒二象性.^^ 估计js数组的数据结构包括了线性和离散.似乎可以解释js数组操作比较慢的原因..


我没有找到很确切的资料,看上去是JavaScript的数组的内部实现是使用的hash的算法实现的。这样使用了hash的散列算法,所以速度会比较慢。不过具体的内部,使用非负整数和字符串作为数组下标的实现是不是有区别还不得而知。
1 楼 02221021 2009-06-09  
引用“那么,这个arr["js"]怎么也能成立呢?这就不是上面的问题了。也就是说,JavaScript实际是允许将字符串作为数字下标的。这在JavaScript中是完全合法的。“

数组可以赋予属性是js的波粒二象性.^^ 估计js数组的数据结构包括了线性和离散.似乎可以解释js数组操作比较慢的原因..

相关推荐

    javascript面向对象编程(中文).pdf

    ### JavaScript面向对象编程知识点概述 #### 一、现代JavaScript编程概览 - **JavaScript的演进**:自诞生以来,JavaScript经历了从一个简单的脚本语言到现今被广泛应用于构建复杂应用的强大编程语言的过程。它的...

    javascript面向对象编程.pdf

    总而言之,学习现代JavaScript面向对象编程,有助于开发者在认识这门语言演化的基础上,运用面向对象的设计和编程模式来构建更加健壮和可维护的JavaScript应用程序。同时,测试和调试是保证代码质量不可或缺的环节,...

    JavaScript面向对象编程指南(第2版)

    , 内容提要, JavaScript语言是一种具有高度表达能力的、基于原型特性的、非常灵活的面向对象程序设计语言。本书着重于介绍JavaScript在面向对象方面的特性,以为您展示如何去构建强健的、可维护的、功能强大的应用...

    JavaScript前端开发程序设计教程(微课版)-实践教案.zip

    这两个文档可能涉及到更高级或者特定主题的实践,如事件处理、AJAX异步通信、DOM遍历和操作的进阶技巧,或者是JavaScript面向对象编程等。通过这些实验,学生可以深入理解JavaScript在实际项目中的应用。 总之,这...

    Javascript 程序设计基础教程(第2版)_习题答案

    理解原型和构造函数是掌握JavaScript面向对象编程的关键。 数组是另一种重要的数据结构,JavaScript提供了丰富的数组方法,如push、pop、shift、unshift、slice、splice等,用于操作和管理数组元素。此外,ES6引入...

    小游戏JavaScript面向对象编程贪吃蛇

    在本项目"小游戏JavaScript面向对象编程贪吃蛇"中,我们将深入探讨如何使用JavaScript进行面向对象编程,来实现经典的贪吃蛇游戏。面向对象编程(Object-Oriented Programming, OOP)是编程的一种范式,它将程序设计...

    javascript面向对象编程

    通过这种方式,JavaScript面向对象编程不仅包括了代码的实际编写,还包括了测试和调试的环节,确保代码的质量和可维护性。学习和掌握面向对象编程的方法是学习JavaScript的重要一环,对于任何想要深入学习并掌握...

    《JAVA面向对象程序设计》练习题---参考答案.doc

    "JAVA面向对象程序设计练习题参考答案" 以下是根据给定的文件信息生成的相关知识点: 一、单项选择题 1. 编译 Java Application 源程序文件将产生相应的字节码文件,这些字节码文件的扩展名为 `.class`。 知识点...

    javascript 快速入门教程,javascript面向对象编程

    ### JavaScript 快速入门教程与面向对象编程 #### 一、概要 JavaScript 是一种广泛应用于网页开发中的脚本语言,具有轻量级、解释型等特点。它可以在客户端执行,无需服务器支持,使得网页能够更加动态和交互。 ##...

    java面向对象程序设计习题集.doc

    本习题集涵盖了 Java 面向对象程序设计的基础知识和高级知识点,包括 JAVA 基础、控制结构、字符串、数组、类和对象、继承、多态性、抽象类和接口、异常处理、IO 操作等。下面是本习题集的详细知识点: 第一章 JAVA...

    javascript面向对象编程教程.rar PDF

    本教程主要聚焦于JavaScript的面向对象编程(OOP)概念,这是理解和掌握高级JavaScript编程的关键。面向对象编程允许我们组织代码,使其更易于维护和复用。 1. **JavaScript语言概述**(第1章) - JavaScript的...

    JavaScript前端开发程序设计教程.rar

    ES6引入了`class`语法糖,使得面向对象编程更加简洁。 六、ES6及后续版本的新特性 1. 声明变量的新方式:`let`和`const`提供块级作用域。 2. 解构赋值:方便地从数组或对象中提取值,赋值给变量。 3. 箭头函数:...

    javascript面对对象程序设计高级特性经典教程(值得保藏)_.docx

    本文将深入探讨JavaScript中的面向对象程序设计的高级特性,包括对象的创建、访问、删除,以及`this`关键字的使用,还有内建对象、Object和Array对象。 1. **创建对象** - **构造法**:通过`new Object()`创建一个...

    JavaScript脚本程序设计

    在"JavaScript脚本程序设计"中,我们可能涉及到以下几个关键知识点: 1. **基础语法**:JavaScript的基础包括变量声明(var、let、const)、数据类型(如字符串、数字、布尔值、null、undefined、对象、数组、符号...

Global site tag (gtag.js) - Google Analytics