第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("*************************************************");

7.1.7 Array 类

7.1.8 数组对象的意义

7.1.9 数组的习惯用法

排序

通过数组生成字符串

数组的复制

元素的删除

筛选处理

7.1.10 数组的内部实现

7.1.11 数组风格的对象

7.1.12 迭代器

7.1.13 生成器

7.1.14 数组的内包

7.2 JSON

7.2.1 JSON 字符串

7.2.2 JSON 对象

7.3 日期处理

7.4 正则表达式

7.4.1 正则表达式的定义

7.4.2 正则表达式相关的术语

7.4.3 正则表达式的语法

7.4.4 JavaScript 中的正则表达式

7.4.5 正则表达式程序设计

7.4.6 字符串对象与正则表达式对象

相关