- 浏览: 455277 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
进退取舍:
谢谢,这个用上了!!
Java 一个线程池的示例 -
pb_water:
感谢楼主,打算买楼主的书,支持一下,楼主功德无量
JavaScript内核系列第0版整理稿下载 -
lancezhcj:
有图会直观的多呢,再摸索摸索
有限自动机与建模 -
hsmsyy:
这里应该是原创了吧,楼主我觉得闭包的作用:实现面向对象。有待商 ...
JavaScript内核系列 第7章 闭包 -
wll52:
在应用退出之前,需要释放连接 con.disconnect() ...
使用smack与GTalk通信
第五章 数组
JavaScript的数组也是一个比较有意思的主题,虽然名为数组(Array),但是根据数组对象上的方法来看,更像是将很多东西混在在一起的结果。而传统的程序设计语言如C/Java中,数组内的元素需要具有相同的数据类型,而作为弱类型的JavaScript,则没有这个限制,事实上,JavaScript的同一个数组中,可以有各种完全不同类型的元素。
方法 |
描述 |
concat() |
连接两个或更多的数组,并返回结果。 |
join() |
把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。 |
pop() |
删除并返回数组的最后一个元素。 |
push() |
向数组的末尾添加一个或更多元素,并返回新的长度。 |
reverse() |
颠倒数组中元素的顺序。 |
shift() |
删除并返回数组的第一个元素。 |
slice() |
从某个已有的数组返回选定的元素。 |
sort() |
对数组的元素进行排序。 |
splice() |
删除元素,并向数组添加新元素。 |
unshift() |
向数组的开头添加一个或更多元素,并返回新的长度。 |
valueOf() |
返回数组对象的原始值。 |
可以看出,JavaScript的数组对象比较复杂,包含有pop,push等类似与栈的操作,又有slice, reverse,sort这样类似与列表的操作。或许正因为如此,JavaScript中的数组的功能非常强大。
5.1数组的特性
数组包括一些属性和方法,其最常用的属性则为length,length表示数组的当前长度,与其他语言不同的是,这个变量并非只读属性,比如:
var array = new Array(1, 2, 3, 4, 5);
print(array.length);
array.length = 3;
print(array.length);
运行结果为:
3
1,2,3
注意到最后的print语句的结果是”1,2,3”,原因是对length属性的修改会使得数组后边的元素变得不可用(如果修改后的length比数组实际的长度小的话),所以可以通过设置length属性来将数组元素裁减。
另一个与其他语言的数组不同的是,字符串也可以作为数组的下标(事实上,在JavaScript的数组中,数字下标最终会被解释器转化为字符串,也就是说,所谓的数字下标只不过是看着像数字而实际上是字符的属性名),比如:
var stack = new Array();
stack['first'] = 3.1415926;
stack['second'] = "okay then.";
stack['third'] = new Date();
for(var item in stack){
print(typeof stack[item]);
}
运行结果为:
string
object
在这个例子里,还可以看到不同类型的数据是如何存储在同一个数组中的,这么做有一定的好处,但是在某些场合则可能形成不便,比如我们在函数一章中讨论过的sum函数,sum接受非显式的参数列表,使用这个函数,需要调用者必须为sum提供数字型的列表(当然,字符串无法做sum操作)。如果是强类型语言,则对sum传入字符串数组会被编译程序认为是非法的,而在JavaScript中,程序需要在运行时才能侦测到这一错误。
5.2使用数组
5.2.1 数组的基本方法使用
数组有这样几种方式来创建:
var array = new Array();
var array = new Array(10);//长度
var array = new Array("apple", "borland", "cisco");
不过,运用最多的为字面量方式来创建,如果第三章中的JSON那样,我们完全可以这样创建数组:
var array = [];
var array = ["one", "two", "three", "four"];
下面我们通过一些实际的小例子来说明数组的使用(主要方法的使用):
向数组中添加元素:
var array = [];
array.push(1);
array.push(2);
array.push(3);
array.push("four");
array.push("five");
array.push(3.1415926);
前面提到过,JavaScript的数组有列表的性质,因此可以向其中push不同类型的元素,接上例:
var len = array.length;
for(var i = 0; i < len; i++){
print(typeof array[i]);
}
结果为:
number
number
string
string
number
弹出数组中的元素:
for(var i = 0; i < len; i++){
print(array.pop());
}
print(array.length);
运行结果如下,注意最后一个0是指array的长度为0,因为这时数组的内容已经全部弹出:
five
four
3
2
1
0
join,连接数组元素为一个字符串:
array = ["one", "two", "three", "four", "five"]; var str1 = array.join(","); var str2 = array.join("|"); print(str1); print(str2);
运行结果如下:
one|two|three|four|five
连接多个数组为一个数组:
var another = ["this", "is", "another", "array"];
var another2 = ["yet", "another", "array"];
var bigArray = array.concat(another, another2);
结果为:
从数组中取出一定数量的元素,不影响数组本身:
print(bigArray.slice(5,9));
结果为:
slice方法的第一个参数为起始位置,第二个参数为终止位置,操作不影响数组本身。下面我们来看splice方法,虽然这两个方法的拼写非常相似,但是功用则完全不同,事实上,splice是一个相当难用的方法:
bigArray.splice(5, 2); bigArray.splice(5, 0, "very", "new", "item", "here");
第一行代码表示,从bigArray数组中,从第5个元素起,删除2个元素;而第二行代码表示,从第5个元素起,删除0个元素,并把随后的所有参数插入到从第5个开始的位置,则操作结果为:
我们再来讨论下数组的排序,JavaScript的数组的排序函数sort将数组按字母顺序排序,排序过程会影响源数组,比如:
var array = ["Cisio", "Borland", "Apple", "Dell"];
print(array);
array.sort();
print(array);
执行结果为:
Apple,Borland,Cisio,Dell
这种字母序的排序方式会造成一些非你所预期的小bug,比如:
var array = [10, 23, 44, 58, 106, 235];
array.sort();
print(array);
得到的结果为:
可以看到,sort不关注数组中的内容是数字还是字母,它仅仅是按照字母的字典序来进行排序,对于这种情况,JavaScript提供了另一种途径,通过给sort函数传递一个函数对象,按照这个函数提供的规则对数组进行排序。
function sorter(a, b){
return a - b;
}
var array = [10, 23, 44, 58, 106, 235];
array.sort(sorter);
print(array);
函数sorter接受两个参数,返回一个数值,如果这个值大于0,则说明第一个参数大于第二个参数,如果返回值为0,说明两个参数相等,返回值小于0,则第一个参数小于第二个参数,sort根据这个返回值来进行最终的排序:
当然,也可以简写成这样:
array.sort(function(a, b){return a - b;});//正序 array.sort(function(a, b){return b - a;});//逆序
5.2.2 删除数组元素
虽然令人费解,但是JavaScript的数组对象上确实没有一个叫做delete或者remove的方法,这就使得我们需要自己扩展其数组对象。一般来说,我们可以扩展JavaScript解释器环境中内置的对象,这种方式的好处在于,扩展之后的对象可以适用于其后的任意场景,而不用每次都显式的声明。而这种做法的坏处在于,修改了内置对象,则可能产生一些难以预料的错误,比如遍历数组实例的时候,可能会产生令人费解的异常。
数组中的每个元素都是一个对象,那么,我们可以使用delete来删除元素吗?来看看下边这个小例子:
var array = ["one", "two","three","four"];
//数组中现在的内容为:
//one,two,three,four
//array.length == 4
delete array[2];
然后,我们再来看看这个数组的内容:
//array.length == 4
可以看到,delete只是将数组array的第三个位置上的元素删掉了,可是数组的长度没有改变,显然这个不是我们想要的结果,不过我们可以借助数组对象自身的slice方法来做到。一个比较好的实现,是来自于jQuery的设计者John Resig:
//Array Remove - By John Resig (MIT Licensed) Array.prototype.remove = function(from, to) { var rest = this.slice((to || from) + 1 || this.length); this.length = from < 0 ? this.length + from : from; return this.push.apply(this, rest); };
这个函数扩展了JavaScript的内置对象Array,这样,我们以后的所有声明的数组都会自动的拥有remove能力,我们来看看这个方法的用法:
var array = ["one", "two", "three", "four", "five", "six"];
print(array);
array.remove(0);//删除第一个元素
print(array);
array.remove(-1);//删除倒数第一个元素
print(array);
array.remove(0,2);//删除数组中下标为0-2的元素(3个)
print(array);
会得到这样的结果:
two,three,four,five,six
two,three,four,five
five
也就是说,remove接受两个参数,第一个参数为起始下标,第二个参数为结束下标,其中第二个参数可以忽略,这种情况下会删除指定下标的元素。当然,不是每个人都希望影响整个原型链(原因在下一个小节里讨论),因此可以考虑另一种方式:
//Array Remove - By John Resig (MIT Licensed) Array.remove = function(array, from, to) { var rest = array.slice((to || from) + 1 || array.length); array.length = from < 0 ? array.length + from : from; return array.push.apply(array, rest); };
其操作方式与前者并无二致,但是不影响全局对象,代价是你需要显式的传递需要操作的数组作为第一个参数:
var array = ["one", "two", "three", "four", "five", "six"];
Array.remove(array, 0, 2);//删除0, 1, 2三个元素
print(array);
这种方式,相当于给JavaScript内置的Array添加了一个静态方法。
5.2.3遍历数组
在对象与JSON这一章中,我们讨论了for…in这种遍历对象的方式,这种方式同样适用于数组,比如:
var array = [1, 2, 3, 4];
for(var item in array){
print(array[item]);
}
将会打印:
2
3
4
但是这种方式并不总是有效,比如我们扩展了内置对象Array,如下:
Array.prototype.useless = function(){}
然后重复执行上边的代码,会得到这样的输出:
2
3
4
function(){}
设想这样一种情况,如果你对数组的遍历做sum操作,那么会得到一个莫名其妙的错误,毕竟函数对象不能做求和操作。幸运的是,我们可以用另一种遍历方式来取得正确的结果:
for(var i = 0, len = array.length; i < len;i++){
print(array[i]);
}
这种for循环如其他很多语言中的写法一致,重要的是,它不会访问哪些下标不是数字的元素,如上例中的function,这个function的下标为useless,是一个字符串。从这个例子我们可以看出,除非必要,尽量不要对全局对象进行扩展,因为对全局对象的扩展会造成所有继承链上都带上“烙印”,而有时候这些烙印会成为滋生bug的温床。
附:由于作者本身水平有限,文中难免有纰漏错误等,或者语言本身有不妥当之处,欢迎及时指正,提出建议,参与讨论,谢谢大家!
评论
尽量加快速度,呵呵。正则表达式这章已经快好了,不过感觉内容有点单薄。
后边的章节尽量,正则表达式和面向对象的JavaScript这两章的后边都附有一个例子,前5篇正好没有实例,稍微等等吧,呵呵。
谢谢关注,更新的速度之前几乎为一周一篇,因为后边的章节还在不断的修改,有些例子举的不太恰当也需要修改,所以比较慢,后边这段时间工作不是那么紧了,应该可以快一些,呵呵。
不过已经发了一半多了,原计划这个系列共9章,如果有时间,会凑够10章,最后一章讲讲在DOM中的应用。
发表评论
-
JavaScript内核系列 第15章 服务器端的JavaScript
2012-02-12 21:39 2408第15章已经在icodeit上发布,这一章分为上/下两篇,请朋 ... -
使用vim开发python及graphviz绘图
2011-12-23 14:49 6518基本需求 使用vim中的autocmd命令可以很容易的将正在 ... -
Java脚本技术应用实例
2011-01-22 11:24 4334前言 一直以来都很喜欢可以自由扩展的软件,这一点应该已经在很 ... -
可编程计算器(phoc)的设计与实现
2011-01-17 11:34 2031前言 借助JavaScript脚本 ... -
函数式编程(javascirpt)
2009-04-18 22:18 1296前言 Javascript,有人称 ... -
C和指针
2009-05-21 23:15 1143前言 指针是C的灵魂,正是指针使得C存在了这么多年,而且将长 ... -
C和指针(续)
2009-05-25 23:41 1393前言 上一篇《C和指针》可能对关于C和指针的有些内容没有说透 ... -
有限自动机与建模
2009-06-06 10:48 1850前言 在学校学程序设计语言的时候,能接触到的所有例子没有一个 ... -
事件和监听器
2009-06-21 22:06 1475前言 事件监听器是经 ... -
基于总线的消息服务(BBMS)的设计与实现
2009-07-25 22:19 1385前言 异步事件的通知机制在比较有规模的软件设计中必然会有涉及 ... -
JavaScript内核系列 第9章 函数式的Javascript
2010-05-13 19:20 3826第九章 函数式的Javascript 要说Ja ... -
JavaScript内核系列 第8章 面向对象的JavaScript(下)
2010-05-06 09:40 3692接上篇:JavaScript内核系列 第8章 面向对象的Jav ... -
JavaScript内核系列 第8章 面向对象的JavaScript(上)
2010-05-06 09:26 2939第八章 面向对象的 Javascript ... -
JavaScript内核系列 第7章 闭包
2010-05-04 08:48 3950第七章 闭包 闭包向来给包括JavaScript程序 ... -
JavaScript内核系列 第6章 正则表达式
2010-04-27 19:44 4095第六章 正则表达式 正则表达式是对字符串的结构 ... -
Swing小应用(Todo-List)之三
2010-04-22 20:47 2154前言 去年9月份开发的那个小工具sTodo,只是做到了能用, ... -
JavaScript内核系列 第4章 函数
2010-04-18 17:31 5121第四章 函数 函数,在C语言之类的过程式语言中 ... -
JavaScript内核系列 第3章 对象与JSON
2010-04-12 09:12 6189第三章 对象与JSON JavaScript对象与传 ... -
JavaScript内核系列 第2章 基本概念
2010-04-03 19:44 5765第二章 基本概念 ... -
JavaScript内核系列 第1章 前言及概述
2010-04-01 23:15 9992前言 从2006年第一次接触JavaScript至今,算来也 ...
相关推荐
第五章讨论数组,数组是存储一组数据的集合,JavaScript中的数组有其独特的特性和方法,如动态扩展、索引访问等。 第六章讲述正则表达式,这是进行字符串操作和模式匹配的重要工具,JavaScript提供了丰富的正则...
Javascript Basic 1、Javascript 概述(了解) Javascript,简称为 JS,是一款能够运行在 JS解释器/引擎 中的脚本语言 JS解释器/引擎 是JS的运行环境: 1、独立安装的JS解释器 - NodeJS 2、嵌入在浏览器中的JS...
不同的浏览器可能采用不同的内核来解析和执行JavaScript,例如IE系列使用Trident内核,Safari和早期的Chrome使用WebKit,Chrome后期版本和现在的大多数浏览器则使用Blink内核,Firefox使用Gecko内核。这导致了...
第五章:字符串和正则表达式 字符串操作和正则表达式是JavaScript中常见的操作,但也是潜在的性能瓶颈所在。回溯是正则表达式匹配中一个常见但可能导致效率低下的问题。 第六章:快速响应的用户界面 在Web应用中,...
第5章 01 上节课复习 02 文件合并与文件归档 03 文件归档与两种压缩方式 04 vim编辑器 05 系统启动流程 06 grub加密 07 bios加密 08 top命令 09 free命令 10 进程管理 第6章 01 上节课复习 02 磁盘分区 03 文件...
#### 五、JavaScript特性 - **解释性语言**:无需编译成文件,直接由浏览器解释执行。 - **跨平台**:能在多种操作系统和设备上运行。 - **单线程**:JavaScript的主要执行模型是单线程的。 - **ECMA标准**:为了...
《JS数独 v1.0.2》是一款基于JavaScript实现的数独小游戏,适用于现代浏览器,尤其是基于WebKit内核的浏览器如Chrome或Safari。在IE浏览器中,部分验证功能可能无法正常工作,但不影响基本的游戏体验。这个项目展示...
5. **XML验证器设计** (第 5 章): 讨论了如何设计XML验证器,从最初的简单实现到逐步优化,包括复杂度分析和性能提升。 6. **集成测试框架** (第 6 章): 关注于构建灵活、易用的自动化测试框架,以及在设计时考虑的...
第5章 正确、优美、迅速(按重要性排序):从设计XML验证器中学到的经验 5.1 XML验证器的作用 5.2 问题所在 5.3 版本1:简单的实现 5.4 版本2:模拟BNF语法——复杂度O(N) 5.5 版本3:第一个复杂度O(log N)的优化 5.6 ...
- **`InvokeScript`方法**:调用`webBrowser1.Document.InvokeScript`方法,传入JavaScript函数名和参数数组,即可执行JavaScript函数。 4. **从JavaScript调用.NET**: - **设置`ObjectForScripting`**:为`...
20. **数组方法**:pop()删除并返回数组最后一个元素,push()在数组末尾添加元素,unshift()在数组开头添加元素,shift()删除并返回数组第一个元素。 以上内容涵盖了前端开发中的基础理论、HTML结构、CSS样式、...
第5章ActionScript3.0中的String对象 104 5.1创建String对象 104 5.2字符串处理 105 5.2.1字符处理 105 5.2.2字符串比较 107 5.2.3裁割与连接 108 5.2.4查找、匹配与替换 110 5.2.5提取子串 112 5.2.6大小写转换 113...
19. **数组方法**:pop()移除并返回数组最后一个元素,push()在末尾添加元素,unshift()在开头添加元素,shift()移除并返回数组第一个元素。 以上是2016年前端面试中的部分关键知识点,这些内容至今仍对前端开发者...
18. **数组方法**:pop()移除并返回数组最后一个元素,push()在末尾添加元素,unshift()在开头添加元素,shift()移除并返回数组第一个元素。 19. **事件绑定**:包括传统的事件处理程序(如onclick)和DOM2级事件...
- `shift()`:从数组开头移除第一个元素。 #### 十六、事件绑定与事件流的区别 - **事件绑定**:将事件处理程序与特定的DOM元素关联起来。 - **事件流**:描述事件在DOM树中的传播过程。 - **IE与DOM事件流的区别...
在现代前端开发中,ES6(ECMAScript 2015)已经成为主流的JavaScript语法,它引入了一系列新的特性,极大地提升了代码的可读性和可维护性。要搭建一个ES6的学习环境,我们可以遵循以下几个简单步骤。 1. **浏览器...
《使用粒子系统复制马列维奇至上主义:JavaScript实现解析》 ...通过JavaScript编程,我们不仅能理解至上主义的精神内核,还能感受到数字艺术的魅力,这正是现代技术赋予我们重新解读和创作经典的可能性。
7. **扩展JavaScript内核**:jQuery还提供了对JavaScript语言本身的增强,包括数组操作等功能,这使得开发者可以更加高效地处理数据。 #### 三、jQuery项目组成 - **jQuery Core (核心库)**:这是jQuery的基础,...
#### 五、JavaScript消除数组中的重复元素 消除数组中重复元素的一种简单方法是使用ES6的`Set`数据结构。 **示例代码:** ```javascript const arr = [1, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9]; const uniqueArr = ...