开发者社区> 杰克.陈> 正文

javascript数组特性

简介: 原文:javascript数组特性   数组是一段线性分配的内存, 它通过整数计算偏移并访问其中的元素. 数组是一种性能出色的数据结构. 1.数组字面量   数组字面量提供了一种非常方便地创建新数组的表示法.
+关注继续查看
原文:javascript数组特性

  数组是一段线性分配的内存, 它通过整数计算偏移并访问其中的元素. 数组是一种性能出色的数据结构.

1.数组字面量

  数组字面量提供了一种非常方便地创建新数组的表示法. 多个用逗号分隔的值的表达式. 数组字面量允许出现在任何表达式可以出现的地方. 数组的第一个值将获得属性名'0', 第二个值将获得属性名'1', 以此类推:

 1             var empty = [];
 2             var numbers = [
 3                 'zero', 'one', 'two', 'three', 'four',
 4                 'five', 'six', 'seven', 'eight', 'nine'
 5             ];
 6             
 7             console.log(empty[1]); // undefined
 8             console.log(numbers[1]);// 'one'
 9             
10             console.log(empty.length);// 0
11             console.log(numbers.length);// 10

  对象字面量:

 1             var numbers_object = {
 2                 '0': 'zero',
 3                 '1': 'one',
 4                 '2': 'two',
 5                 '3': 'three',
 6                 '4': 'four', 
 7                 '5': 'five', 
 8                 '6': 'six',
 9                 '7': 'serven',
10                 '8': 'eight',
11                 '9': 'nine'
12             };

  两者产生的结果相似, numbers和numbers_object都是包含10个属性的对象, 并且那些属性刚好有相同的名字和值. 但是他们也有一些显著的不同, numbers继承自Array.prototype, 而numbers_object继承自Object.prototype, 所以numbers继承了大量有用的方法. 同时, numbers也有一个诡异的length属性, 而numbers_object则没有.

   在大多数语言中, 一个数组所有元素都要求是相同的类型. JavaScript允许数组里包含任意混合类型的值:

1                 var misc = [
2                     'string', 98.6, true, false, null, undefined,
3                     ['nested', 'array'], {object: true}, NaN,
4                     Infinity
5                 ];
6                 
7                 console.log(misc.length);// 10

   在JavaScript中, 中括号[]表示一个数组, 也可以理解为数组对象; 花括号{}表示一个对象, []和{}一起使用, 可以形成一个对象数组, 如以上示例所示.

 

2.长度

  每个数字都有一个length属性, 和大多数其他语言不同, JavaScript数组的length是没有上界的. 如果你用大于或等于当前length的数字作为下标来存储一个元素, 那么length值会被增大以容纳新元素, 不会发生数组越界错误.

  length属性的值是这个数组的最大整数属性名加上1, 它不一定等于数组里的属性的个数:

1                 var myArray = [];
2                 console.log(myArray.length);// 0
3                 
4                 myArray[1000000] = true;
5                 console.log(myArray.length);// 10000001
6                 // myArray只包含一个属性

  []后置下标运算符把它所含的表达式转换成一个字符串, 如果该表达式有toString方法, 就使用该方法的值. 这个字符串被将用作属性名. 如果这个字符串看起来像一个大于等于这个这个数组当前的length且小于4294967295的正整数, 那么这个数组的length会被重新设置为新的下标加1, 否则length值为这个数组的长度.

 

3.删除

  由于JavaScript的数组其实就是对象, 所以delete运算符可以用来从数组中移除元素:

1                 var numbers = ['zero', 'noe', undefined, 'shi', 'go'];
2                 delete numbers[2];
3                 console.log(numbers.length);// 5

  不幸的是, 那样会在数组中留下一个空间. 这是因为排在被删除元素之后的元素保留着它们最初的属性. 而你通常想要的是递减后面每个元素的属性.

  幸运的是, JavaScript数组有一个splice方法. 它可以对数组做个手术, 删除一些元素并将它们替换为其他的元素. 第1个参数是数组中的一个序号, 第2个参数是要删除的元素个数. 任何额外的参数会在序号那个点的位置被插入到数组中:

1                 var numbers = ['zero', 'noe', undefined, 'shi', 'go'];
2                 numbers.splice(2, 1);    
3                 console.log(numbers.length);// 4

  值为'shi'的属性的键值从'3'变到'2'. 因为被删除属性后面的每个属性必须被移除, 并且以一个新的键值重新插入, 这对于大型数组来说可能会效率不高.

 

4.容易混淆的地方

  在JavaScript编程中, 一个常见的错误是在必须使用数组时使用了对象, 或者在必须使用对象时使用了数组. 其实规则很简单: 当属性名是小而连续的整数时, 你应该使用数组. 否则, 使用对象.

  JavaScript本身对于数组和对象的区别是混乱的. typeof运算符报告数组的类型是'object', 这没有任何意义, JavaScript没有一个好的机制来区别数组和对象, 我们可以通过定义自己的is_array函数来弥补这个缺陷:

 1                 var array = [
 2                     'zero', 'one'
 3                 ];
 4                 
 5                 var obj = {
 6                     '0': 'zero',
 7                     '1': 'one'
 8                 };
 9                 
10                 var is_array = function (value) {
11                     return Object.prototype.toString.apply(value) === '[object Array]';
12                 };
13                 
14                 console.log(is_array(array));// true
15                 console.log(is_array(obj));// false

 

5.方法

  JavaScript提供了一套数组可用的方法. 这些方法是被储存在Array.prototype中的函数, Object.prototype和Array.prototype是可以被扩充的, 举例来说, 假设我们想要给array增加一个方法, 它允许我们队数组进行计算:

 1                 //通过给Function.prototype增加方法来使得该方法对所有函数可用
 2                 Function.prototype.method = function (name, func) {
 3                     this.prototype[name] = func;
 4                     return this;
 5                 };
 6                 
 7                 Array.method('reduce', function (f, value) {
 8                     var i;
 9                     for (i = 0; i < this.length; i++) {
10                         value = f(this[i], value);
11                     }
12                     return value;
13                 });

  通过给Array.prototype扩充了一个函数, 每个数组都继承了这个方法. 在这个例子里, 我们定义了一个reduce方法, 它接受一个函数和一个初始值作为参数,. 它便利这个数组, 以当前元素和该初始值为参数调用这个函数, 并且计算出一个新值. 当完成时, 它返回这个新值.

如果我们传入一个把两个数字相加的函数, 它会计算出相加的和. 如果我们传入把两个数组相乘的函数, 它会计算两者的乘积:

 1                 // 创建一个数组数组
 2                 var data = [4, 8, 15, 16, 23, 42];
 3                  
 4                 // 定义两个简单的函数, 一个是把两个数字相加, 另一个是把两个数字相乘.
 5                 var add = function (a, b) {
 6                     return a + b;
 7                 };
 8                 
 9                 var mult = function (a, b) {
10                     return a * b;
11                 };
12                 
13                 // 调用data的reduce方法, 传入add函数.
14                 var sum = data.reduce(add, 0);
15                 console.log(sum);// 108
16                 
17                 // 再次调用reduce方法, 这次传入mult函数
18                 var product = data.reduce(mult, 1);
19                 console.log(product);// 7418880
20                 
21                 // 因为数组其实就是对象, 所以我们可以直接给一个单独的数组添加方法:
22                 data.total = function () {
23                     return this.reduce(add, 0);
24                 };
25                 
26                 console.log(data.total());// 108

   

6.指定初始值

  JavaScript的数组通常不会预置值. 如果你用[]得到一个新数组, 它将是空的. 如果你访问一个不存在的元素, 得到的值则是undefined. 如果你知道这个问题, 或者你在尝试获取每个元素之前都很有预见性地设置他的值, 那就万事大吉了. 但是, 如果你实现的算法是假设每个元素都从一个已知的值开始(例如0), 那么你必须自己准备好这个数组. JavaScript应该提供一些类似Array.dim这样的方法来做这件事情, 但我们可以很容易纠正这个疏忽:

 1                 Array.dim = function (dimension, initial) {
 2                     var a = [], i;
 3                     for (i = 0; i < dimension; i++) {
 4                         a[i] = initial;
 5                     }
 6                     return a;
 7                 };
 8                 
 9                 // 创建一个包含10个0的数组
10                 var myArray = Array.dim(10, 0);

  JavaScript没有多维数组, 但就像大多数类C语言一样, 它支持元素为数组的数组:

1                 var matrix = [
2                     [0, 1, 2],
3                     [3, 4, 5],
4                     [6, 7, 8]
5                 ];
6                 
7                 console.log(matrix[2] [1]);// 7

  JavaScript对矩阵也提供了更好的支持:

 1                 Array.matrix = function (m, n, initial) {
 2                     var a, i, j, mat = [];
 3                     for (i = 0; i < m; i++) {
 4                         a = [];
 5                         for (j = 0; j < n; j++) {
 6                             a[j] = initial;
 7                         }
 8                         mat[i] = a;
 9                     }
10                     return mat;
11                 };
12                 
13                 // 构造一个用0填充的4 * 4矩阵
14                 var myMatrix = Array.matrix(4, 4, 0);
15                 console.log(myMatrix);
16                 console.log(myMatrix[3] [3]);// 0

  用0填充的4 * 4矩阵:

 

 1                 // 用来构造一个单位矩阵的方法
 2                 Array.identity = function (n) {
 3                     var i, mat = Array.matrix(n, n, 0);
 4                     for (i = 0; i < n; i++) {
 5                         mat[i] [i] = 1;
 6                     }
 7                     return mat;
 8                 };
 9                 
10                 myMatrix = Array.identity(4);
11                 console.log(myMatrix);
12                 
13                 console.log(myMatrix[3] [3]);// 1

  单位矩阵:

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20164 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
22248 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23538 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
13102 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
16593 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
22089 0
+关注
杰克.陈
一个安静的程序猿~
10425
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载