JavaScript数组特性与实践应用深入详解


Posted in Javascript onDecember 30, 2018

本文实例讲述了JavaScript数组特性与实践应用。分享给大家供大家参考,具体如下:

JavaScript 提供了一种类似数组特性的对象,它把数组的下标变为字符串,作为对象的属性。虽然它比一个真正的数组来的慢,但是使用起来很方便。

1 数组字面量

数组字面量是在一对方括号中包围零个或多个用逗号分隔的值的表达式:

var empty = [];
var numbers = [
  'zero', 'one', 'two', 'three'
];
console.log(empty[1]);//undefined
console.log(numbers[1]);//one
console.log(empty.length);//0
console.log(numbers.length);//4

数组对象继承自 Array.prototype,所以 numbers 继承了大量有用的方法。

JavaScript 允许数组包含任意混合类型的值:

var misc = [
  'string', 11.3, false, true, null, undefined, ['nested', 'array'], {object: true}, NaN, Infinity
];
console.log(misc.length);//10

2 长度

数组有一个 length 属性,但它是没有上界的。如果用大等于当前 length 的数字作为下标来存储元素,那么 length 属性值会被增大以便容纳新的元素,而不会发生数组越界现象哦O(∩_∩)O~

length 属性的值很诡异,它是数组最大整数属性名加 1,即它不一定等于数组的元素个数:

var myArray = [];
console.log(myArray.length);//0
//myArray 只包含一个属性,但 length 的值等于这个数组最大整数的属性名加 1
myArray[100000] = true;
console.log(myArray.length);//100001

[] 后置运算符会把它包含的表达式转换为字符串,如果表达式有 toString() 方法,那么就会调用它。这个字符串被当做属性名,如果这个字符串是一个大等于当前 length 值而且小于 4294967295 的正整数,那么这个数组的 length 就会被重置为新的下标加 1。

可以直接设置 length 的值。设置更大的 length 值不会为数组分配更多的空间;而把 length 设小则会导致所有下标大等于新的 length 的属性被删除:

//删除元素
numbers.length = 3;
console.log(numbers);//[ "zero", "one", "two" ]

把下标指定为数组的当前 length,就可以把一个新元素附加到数组的尾部:

//新增元素
numbers[numbers.length] = 'four';
console.log(numbers);//[ "zero", "one", "two", "four" ]

使用 push() 可以更方便地实现同样的功能:

//新增元素(push)
numbers.push('good');
console.log(numbers);//[ "zero", "one", "two", "four", "good" ]

3 删除

JavaScript 数组就是对象,所以可以用 delete 移除元素:

delete numbers[2];
console.log(numbers);//[ "zero", "one", <1 个空的存储位置>, "four", "good" ]

可惜的是,这会在数组中留下一个空洞!而我们希望的是:删除后,被删除元素的后续元素会自动地往前移动。

JavaScript 数组提供了 splice() 方法,它接受下列参数:
①. 数组的索引。
②. 要删除的元素个数。
③. 其他参数(多个)- 把这些参数依次插入到索引位置。

//第一个参数是索引号,第二个参数是要删除的元素个数
numbers.splice(2, 1);
console.log(numbers);// [ "zero", "one", "four", "good" ]

4 枚举

JavaScript 数组是对象,所以可以用 for in 语句来遍历数组的所有属性。可是 for in 语句无法保证属性的顺序,而且可能从原型链中得到意外的属性。

可以使用 for 来避免上述的问题:

var i,
  myArray = numbers;
for (i = 0; i < myArray.length; i += 1) {
  console.log(myArray[i]);
}

5 数组与对象

如何在这两者进行选择?当属性名是小而连续的整数时,使用数组;否则使用对象。

JavaScript 的 typeof 会认为数组是 object,这没有意义!

我们可以定义一个函数来检测数组:

var is_array = function (value) {
  return value && typeof value === 'object' &&
    value.constructor === Array;
};

这个方法在不同窗口(window)或框架(frame) 里构造的数组会失败。所以请用下面的这个更好的方法:

var is_array = function (value) {
  return Object.prototype.toString.apply(value) === '[object Array]';
};
console.log(is_array(myArray));//true

6 方法

JavaScript 提供了一些对于数组可用的方法,它们被存储在 Array.prototype 中。我们可以为数组增加一个对数组进行计算的方法:

//新增可以对数组中的元素进行计算的方法
Array.method('reduce', function (f, value) {
  var i;
  for (i = 0; i < this.length; i += 1) {
    value = f(this[i], value);
  }
  return value;
});

这样所有的数组都继承了这个方法。它接受一个函数与初始值为参数。然后遍历数组,并通过函数计算出新值,最后返回这个值。

//创建数字数组
var data = [9, 16, 32, 192, 8];
//定义加法与乘法函数
var add = function (a, b) {
  return a + b;
};
var mult = function (a, b) {
  return a * b;
};
console.log(data.reduce(add, 0));//257
console.log(data.reduce(mult, 1));//7077888

因为数组就是对象,所以也可以直接给数组添加方法:

data.total = function () {
  return this.reduce(add, 0);
};
console.log(data.total());//257

因为字符串 “total” 不是整数,所以不会改变数组的 length 值。当属性名是字符串时,它就会成为数组的属性。

7 指定初始值

如果使用 [] 得到的新数组,它将是空的。这是如果访问它,将会得到 undefined。我们可以实现一个可以初始化数组元素值的方法:

//为每一个元素指定初始值
Array.dim = function (dimension, initial) {
  var a = [], i;
  for (i = 0; i < dimension; i += 1) {
    a[i] = initial;
  }
  return a;
};
//创建包含 10 个 0 的数组
var myArray = Array.dim(10, 0);
console.log(myArray);//[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]

JavaScript 数组的元素可以是数组,通过这种方式来实现多维数组功能:

//数组的数组
var matrix = [
  [0, 1, 2], [3, 4, 5]
];
console.log(matrix[1][0]);//3

可以扩展 Array 方法,让它可以初始化矩阵:

/**
 *
 * @param m 第一维个数
 * @param n 第二维个数
 * @param initial 初始值
 */
Array.matrix = function (m, n, initial) {
  var a, i, j, mat = [];
  for (i = 0; i < m; i += 1) {
    a = [];
    for (j = 0; j < n; j += 1) {
      a[j] = initial;
    }
    mat[i] = a;
  }
  return mat;
};
//构造 0 填充的 4*4 矩阵
console.log(Array.matrix(4, 4, 0));
//构造单元矩阵
Array.identity = function (n) {
  var i, mat = Array.matrix(n, n, 0);
  for (i = 0; i < n; i += 1) {
    mat[i][i] = 1;
  }
  return mat;
};
var myMatrix = Array.identity(4);
console.log(myMatrix);
console.log(myMatrix[3][3]);//1

感兴趣的朋友还可以使用本站在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行结果。

更多关于JavaScript相关内容还可查看本站专题:《JavaScript数组操作技巧总结》、《JavaScript字符与字符串操作技巧总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript错误与调试技巧总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
ExtJS GridPanel 根据条件改变字体颜色
Mar 08 Javascript
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
Jan 17 Javascript
js整数字符串转换为金额类型数据(示例代码)
Dec 26 Javascript
css与javascript跨浏览器兼容性总结
Sep 15 Javascript
js实现瀑布流的三种方式比较
Jun 28 Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
Dec 06 Javascript
基于jQuery实现的查看全文功能【实用】
Dec 11 Javascript
利用vue.js插入dom节点的方法
Mar 15 Javascript
简单实现jQuery弹幕效果
May 06 jQuery
React 子组件向父组件传值的方法
Jul 24 Javascript
关于Vue项目跨平台运行问题的解决方法
Sep 18 Javascript
基于JavaScript实现一个简单的Vue
Sep 26 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
Dec 30 #Javascript
微信小程序使用setData修改数组中单个对象的方法分析
Dec 30 #Javascript
微信小程序提交form操作示例
Dec 30 #Javascript
bootstrap下拉分页样式 带跳转页码
Dec 29 #Javascript
详解vue 兼容IE报错解决方案
Dec 29 #Javascript
玩转Koa之koa-router原理解析
Dec 29 #Javascript
Bootstrap Paginator+PageHelper实现分页效果
Dec 29 #Javascript
You might like
PHP初学者常见问题集合 修正版(21问答)
2010/03/23 PHP
PHP使用CURL_MULTI实现多线程采集的例子
2014/07/29 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
Laravel框架Auth用户认证操作实例分析
2019/09/29 PHP
javascript form 验证函数 弹出对话框形式
2009/06/23 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
js获取内联样式的方法
2015/01/27 Javascript
JavaScript声明变量名的语法规则
2015/07/10 Javascript
关于webuploader插件使用过程遇到的小问题
2016/11/07 Javascript
javascript简单写的判断电话号码实例
2017/05/24 Javascript
详解Vue 全局引入bass.scss 处理方案
2018/03/26 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
python实现给字典添加条目的方法
2014/09/25 Python
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
python机器学习理论与实战(五)支持向量机
2018/01/19 Python
Python3实现的简单三级菜单功能示例
2019/03/12 Python
基于keras 模型、结构、权重保存的实现
2020/01/24 Python
python实现微信打飞机游戏
2020/03/24 Python
Python Django中间件使用原理及流程分析
2020/06/13 Python
python处理写入数据代码讲解
2020/10/22 Python
Python开发.exe小工具的详细步骤
2021/01/27 Python
css3动画 小球滚动 js控制动画暂停
2019/11/29 HTML / CSS
HTML5拖放效果的实现代码
2016/11/17 HTML / CSS
中国海淘族值得信赖的海淘返利网站:55海淘
2017/01/16 全球购物
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
SKECHERS斯凯奇中国官网:来自美国的运动休闲品牌
2018/11/14 全球购物
澳大利亚领先的女性运动服品牌:Lorna Jane
2020/06/19 全球购物
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
优秀干部获奖感言
2014/01/31 职场文书
实验教师岗位职责
2014/02/13 职场文书
安全宣传标语口号
2014/06/06 职场文书
看完这篇文章获得一些java if优化技巧
2021/07/15 Java/Android