第7章 数据处理
7.1 数组
数组是一种有序元素的集合。在 JavaScript 中,数组的长度是可变的。只要将元素加入数组的尾部,数组的长度就会自动增加。同时,也能够自由改写数组中的每一个元素。其实这并不值得惊讶,反而是理所应当的,因为在 JavaScript中数组也是一种对象。数组只不过是继承了 JavaScript 的对象的一些性质而已。
7.1.1 JavaScript 的数组
// 在 JavaScript 中,数组可以通过字面量与 new 表达式两种方法生成。
// 数组字面量的书写方式是在中括号([])中列出数组元素,并通过逗号相分隔。
var hzh1 = [3, 4, 5];
console.log("hzh1的数据类型是:");
console.log(typeof hzh1); // 对数组进行typeof运算之后是object
console.log("**************************************************");
// 不含有元素的数组的长度为零。
var hzh2 = [];
console.log("hzh2的长度是:" + hzh2.length);
console.log("**************************************************");
// 不含有元素的数组的长度为零。
var hzh3 = [];
console.log("hzh2的长度是:" + hzh2.length);
console.log("**************************************************");
// 在JavaScript 中,我们通常会先生成一个长度为零的数组,之后再向其中添加元素。
var hzh4 = [];
hzh4[0] = "黄子涵";
hzh4[1] = "是帅哥!"
console.log("hzh[0] = " + hzh4[0]);
console.log("hzh[1] = " + hzh4[1]);
console.log("hzh[0] + hzh[0] = " + (hzh4[0] + hzh4[1]));
console.log("**************************************************");
// 不需要确保各个元素的类型一致。
var hzh5 = '黄子涵';
var hzh6 = [1, '黄子涵', hzh5, true, null, undefined,
{hzh7: 3, hzh8: 4}, [2, 'hzh9'],
function(hzh10, hzh11) {
return Number(hzh10) + Number(hzh11);
}
];
console.log("hzh6 = " + hzh6);
console.log("**************************************************");
// 中间元素被省略的数组,。被省略元素的值将被认为是 undefined 值。
var hzh12 = [3, ,5];
console.log("hzh12[0] = " + hzh12[0]);
console.log("hzh12[1] = " + hzh12[1]);
console.log("hzh12[2] = " + hzh12[2]);
console.log("**************************************************");
// 在 ECMAScript 中,如果像下面这样在书写数组字面量时以逗号作为结尾,则该逗号将会被忽略。
var hzh13 = [3, 4, ];
console.log("hzh13[0] = " + hzh13[0]);
console.log("hzh13[1] = " + hzh13[1]);
console.log("hzh13[2] = " + hzh13[2]);
console.log("hzh13的长度: " + hzh13.length);
7.1.2 数组元素的访问
// 可以通过中括号运算符([] 运算符)来访问数组的元素,
// []内所写的是下标的数值
// 下标由 0 开始。
// 如果该下标没有相对应的元素,则会获得 undefined 值。
var hzh1 = [3, 4, 5];
console.log(hzh1[0], hzh1[1], hzh1[2], hzh1[3]);
console.log("**************************************************");
// 如果将中括号运算符写在赋值表达式的左侧,则可以改写相应的元素。
hzh1[2] = hzh1[2] * 2;
console.log("数组hzh1:" + hzh1);
console.log("hzh1[2] = " + hzh1[2]);
console.log("**************************************************");
// 如果在赋值表达式左侧所写的下标超过了元素数量,
// 则会向数组增加新的元素
// 新增的元素下标值不必紧接着现有元素的个数
// 如果访问中间被跳过的元素,则会返回 undefined 值。
hzh1[3] = 20;
// 元素数量为3的时候,如果赋值给下标为3的元素(第4个元素),就会新增一个元素。
console.log("数组hzh1:" + hzh1);
// 如果对下标为10(第11个元素)进行赋值,元素的数量就会变为11
hzh1[10] = 100;
console.log("数组hzh1:" + hzh1);
console.log("数组hzh1的长度:" + hzh1.length);
//如果访问被跳过的元素,则会返回 undefined 值
console.log("hzh1[4]:" + hzh1[4]);
7.1.3 数组的长度
// 数组的长度值为数组中最后一个元素的下标值加 1。
// 如果生成的是元素之间存在间隙的数组,元素的数量与数组的长度不同。
var hzh1 = [2,,,,,3];
// 与元素数量不同,数组的长度为
console.log("数组hzh1的长度:" + hzh1.length);
console.log("**************************************************");
// 在向末尾添加了元素之后,length 的值将会自动增加.
// 如果在添加元素时跳过了一些中间元素
// length 的值则是最后的那个元素的下标值减去 1。
var hzh2 = ['zero', 'one', 'two'];
console.log("数组hzh2第一次长度:" + hzh2.length);
// 借助hzh2.length向数组的末尾添加元素是一种习惯用法
hzh2[hzh2.length] = 'three';
console.log("数组hzh2第二次长度:" + hzh2.length);
hzh2[100] = '黄子涵';
console.log("数组hzh2第二次长度:" + hzh2.length);
console.log("**************************************************");
// 还可以显示更改length的值
// 在进行改写之后数组的长度也会相应发生改变
// 如果该值变小,超出部分的元素将被舍去
// 如果该值变大。新增部分的元素将是undefined值
var hzh3 = ['zero', 'one', 'two'];
hzh3.length = 2; // 将数组的长度缩短
console.log(hzh3); // 最后一个元素将会丢失
hzh3.length = 3; // 恢复(加长)数组至原来的长度
console.log(hzh3); // 新增的部分是undefined值
7.1.4 数组元素的枚举
// for语句是最常用的数组元素的枚举方式
var hzh1 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log("枚举数组hzh1的元素:");
for(var i = 0, len = hzh1.length; i < len; i++) {
console.log(hzh1[i]);
}
虽然通过 for in 语句或 for each in 语句也可以枚举数组元素,但它们无法保证枚举的顺序。如果要确保枚举按期望的顺序进行,请使用 for 语句。
除了使用 for 语句这样的循环语句(loop 语句),还有一些可以按顺序调用数组中各个元素的方法。可以通过这样的方法来实现数组元素的枚举。由于其内部机制仍然是一种循环语句,所以也被称为内部循环。
7.1.5 多维数组
console.log("***********************************************");
// 由于任意内容都可以被指定为数组的元素,
// 因此数组本身自然也可以成为另一个数组的元素
// 某个值若被指定为了数组的元素,
// 可以像下面这样,通过连续使用多个 [] 运算符来访问元素
// 数组甚至还可以将其自身作为该数组的元素
var hzh1 = [1, ['hzh2', 'hzh3', 'hzh4', 'hzh5']];
console.log("hzh1[0]:" + hzh1[0]);
console.log("hzh1[1][0]:" + hzh1[1][0]);
console.log("hzh1[1][1]:" + hzh1[1][1]);
console.log("hzh1[1][2]:" + hzh1[1][2]);
console.log("hzh1[1][3]:" + hzh1[1][3]);
console.log("***********************************************");
7.1.6 数组是一种对象
console.log("*************************************************");
// 在 JavaScript 中,数组是一种对象。
// 从内部来看,它是Array 对象(Array 类)的对象实例。
// 因此,也可以通过 new 表达式来调用 Array 的构造函数以生成数组。
// 根据具体情况,可以以不同的方式来解释传递给 Array 构造函数的参数。
// 如果参数的数量为 1 且是一个数值,它的含义是数组的长度(元素数量);
// 如果参数的数量大于等于 2,则这些参数代表的是数组的元素。
// 对于参数只有1个的情况,该参数将会成为数组的长度
var hzh1 = new Array(5);
console.log("数组hzh1:" + hzh1);
console.log("*************************************************");
console.log("*************************************************");
// 参数将会成为数组的元素
var hzh2 = new Array(3, 4, 'huangzihan');
console.log("数组hzh2:" + hzh2);
console.log("*************************************************");
console.log("*************************************************");
// 由于不会发生隐式的数据类型转换而将该参数转换为数值类型,
// 因此这一参数将被认为是数组中下标为0的元素
var hzh3 = new Array('5');
console.log(hzh3);
console.log("*************************************************");
console.log("*************************************************");
// 对数组对象的方法进行调用的例子
var hzh4 = ['zero', 'one', 'two'];
// 对join方法进行调用
console.log("hzh4.join('_'):" + (hzh4.join('_')));
// 也可以直接对数组字面量进行方法调用
console.log("[3, 4, 5].join('_'):" + ([3, 4, 5].join('_')));
console.log("*************************************************");
console.log("*************************************************");
// 中括号运算符在这里的作用是用于访问数组的元素,
// 其实,这就是在访问对象的属性。
// 也就是说,从内部来看,下标值0或1之类的数值其实是数组对象的属性名
var hzh5 = ['zero', 'one', 'two'];
console.log("枚举数组hzh5的属性值:");
for (var n in hzh5) {
console.log(n); // 下标值的枚举,即属性名的枚举
}
console.log("属性名的枚举:" + (Object.keys(hzh5)));
console.log("属性名的枚举(忽略enumerable属性):" +
(Object.getOwnPropertyNames(hzh5)));
// 对下标0是否存在进行检验
console.log("下标0是否存在:" + ('0' in hzh5));
// 数值0将会被转换为字符串型'0'以进行检验
console.log("对数值0的检验:" + (0 in hzh5));
// 对length属性是否存在进行检验
console.log("对length属性进行检验:" + ('length' in hzh5));
console.log("*************************************************");
console.log("*************************************************");
// 如果没有以正整数对一个数组对象进行 [] 运算,
// 该值就会被解释为属性名,而进行属性访问操作
var hzh6 = ['zero', 'one', 'two'];
hzh6.x = 'X'; // 向数组对象中添加属性x
console.log("枚举数组hzh6的属性值:");
for(var p in hzh6) {
console.log(p);
}
console.log("*************************************************");