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中是完全合法的。

出 处: http://devbean.blog.51cto.com/448512/163574

时间: 2024-11-02 07:04:42

JavaScript面向对象程序设计(2) 数组的相关文章

javascript面向对象程序设计高级特性经典教程(值得收藏)_javascript技巧

本文实例讲述了javascript面向对象程序设计的高级特性.分享给大家供大家参考,具体如下: 1.创建对象的三种方式: 第一种构造法:new  Object var a = new Object(); a.x = 1, a.y = 2; 第二种构造法:对象直接量 var b = { x : 1, y : 2 }; 第三种构造法:定义类型 function Point(x, y){ this.x = x; this.y = y; } var p = new Point(1,2); 2.访问对象

JavaScript面向对象程序设计教程_javascript技巧

JavaScript中对象的定义为:无序属性的集合,其属性可以包含基本值.对象或者函数.可以把对象想象成散列表,就是一组名值对(key:value),其中值可以是数据或函数,每个对象都是基于一个引用类型创建的. 理解对象 前面的博客里写过创建对象的方式有两种,一种是创建一个object的实例,另一种是使用对象字面量法: var person = new Object(); person.sex = man; person.name = bluce person.age = 58; person.

JavaScript面向对象程序设计(3) 对象

1.对象 对象是面向对象程序设计的基础概念之一,只需看看这个名字就已经知道了.在我们 熟悉的面向对象语言中,比如Java或者C++,都有着类似的对象定义方法.比如,我们想定义一个类,名 字叫Person,有两个属性:name和age,另外有一个方法,将显示出这个Person对象的名字和年龄,那么 我们可以用下面的代码实现: Java: public class Person { private String name; private int age; public String getName

JavaScript面向对象程序设计(5) 类

类是面向对象程序设计的核心概念之一.一个类代表了具有相似属性的一类事物的抽象.从本篇开始 ,我们将正式的进入JavaScript的面向对象部分.首先需要注意的是,在JavaScript中并没有"类 "这一关键字--在大多数语言中都是使用class作为关键字的.所以,这里的类就成 了一个概念,它没有明确的语法标志. 1.类和构造函数 前面说过,在JavaScript中并没有明确的类的概念.实际上,我们给出的只是类的构造函数.类的构 造函数构成了这个类的全部内容.既然叫做构造函数,它也是一

JavaScript面向对象程序设计(1) 前言

基于对象还是面向对象? 面向对象技术是现代软件开发中的重要技术之一.面向对象变成的好处毋庸置疑,现在的主流语言如 Java.C++都是面向对象的.现在的面向对象理论更多的是使用Java或C++进行描述,究其根源,在于这 些语言都是传统的面向对象语言,具有面向对象理论所指明的一切特性:类.封装.继承.多态等等. 相比而言,一些动态语言如JavaSript就显得不那么面向对象--至少,在JavaScript中 并没有类class这一关键字.但是,在JavaScript中并不是没有类的概念.于是有人说

JavaScript面向对象程序设计(8) 优雅的封装还是执行的效率?

优雅的封装还是执行的效率?这是一个悖论. 优雅封装的程序看起来是那么的美妙:每个属性被隐藏在对象之后,你所能看到的就是这个对象让你 看到的,至于它到底是怎么操作的,这个不需要你操心. 执行的效率就是另外一回事.就像是C语言和面向对象的C++之间的差别:C++很优雅,但是执行效率 ,无论是编译后的二进制代码还是运行期的内存的占用,都要比简单的C语言多出一截来. 这个问题在脚本语言中显得更加重要,因为JavaScript根本就是一种解释语言,解释语言的执行效率 要比编译语言低很多. 1.优雅的封装

javascript面向对象:JavaScript面向对象程序设计(4): 函数

在很多语言中,函数(Java里面成为方法)和对象时截然不同的两种东西.函数被定义为对象的动作,或者是全局的(像在C++中的main函数一样).但是在JavaScript中,函数和对象的界限却显得不那么明显.1. 函数的定义JavaScript中有很多种定义函数的方法:function hello() { alert("Hello!"); }var hello1 = function() { alert("Hello!"); };var hello2 = new Fu

JavaScript面向对象程序设计(6) 封装

封装是面向对象的重要概念之一.如果一个程序没有封装性,也就谈不上什么面向对象.但是, JavaScript并不像其他的语言,比如 Java,有公有变量和私有变量等:在JavaScript中只有一种作用域 :公有作用域.在本章中,我们将会见识到JavaScript是如何实现封装的特性的. 1.this和公 有变量 首先需要理解this关键字.看下面的一段代码,你应该对此感到熟悉: function Person(name, age) { this.name = name; // 定义一个公有变量

JavaScript面向对象程序设计(7) 闭包

1.什么是闭包? 什么是闭包?一种正式的解释是:所谓闭包,指的是一种拥有很多变量并且绑定了这些变量的环境的 表达式(通常是一个函数),因而这些变量也是这个表达式的一部分. 相信很多人都不会理解这个定义,因为他的学术味道太浓了--或许你喜欢从字面的语法 上进行分析:首先,它是一个表达式,这个表达式绑定了很多变量以及这些变量的环境.不过这并没有 什么意义,这依然不会告诉我们什么是闭包. 那么,来看一个例子: function add(a) { return function(b) { return