JavaScript: The Good Parts 读书笔记(四)
四.数组与正则表达式
?
var empty = [];var numbers = ['one','two','three','four','five','six','seven','eight','nine','ten'];document.writeln(empty[1]); // undefineddocument.writeln(numbers[1]); // 'two'document.writeln(empty.length); // 0document.writeln(numbers.length); // 10?
// 现在看看数组对象与一般对象的区别var numbers_obj = {"0" : "one","1" : "two","2" : "three","3" : "four","4" : "five","5" : "six","6" : "seven","7" : "eight","8" : "nine","9" : "ten"};?var misc = ['string', 98.6, true, false, null, undefined,['nested','array'], {object:true} ,NaN ,Infinity];document.writeln(misc.length); // 10?numbers.length = 3; // numbers['one','two','three']// 通过把下标指定为一个数组当前的length. 可以附加一个新的元素到该数组的尾部.numbers[numbers.length] = 'shi'; // numbers['one','two','three','shi']// 相同的功能可以使用push 方法来完成:numbers.push('wu'); // numbers['one','two','three','shi', 'wu']?delete numbers[2]; // numbers['one','two', undefined ,'shi', 'wu']?? 不幸的是,那样会在数组中留下一个空洞。这时可以使用splice 方法来将后续元素向前步进:
numbers.splice(2,1); // numbers['one','two','shi', 'wu']??? 注意区分 splice(衔接)与slice(分割). slice() 方法并不会修改数组,而是返回一个子数组. splice() 方法会直接对数组进行修改.
var myArray = [];document.writeln(myArray.length); // 0myArray[100000] = true;document.writeln(myArray.length); // 100001?
// Javascript 在区别数组和对象上没有一个好的机制。此时可以通过定义一个 is_array 函数来解决:var is_array = function(value){return value && typeof value === 'object' && value.constructor === Array;};document.writeln(is_array([]));document.writeln(is_array({}));?? 上述判断在识别从不同的窗口(window)或帧(frame)里构造的数组时会失败。如果想要准确地检测那些外部的数组,我们不得不做更多的工作:var is_array_enhanced = function(value){return value && typeof value === 'object' &&typeof value.length === 'number' &&typeof value.splice === 'function' &&// 判断属性是否为可枚举的(for in 循环可用),对于所有数组,将得到false.!(value.propertyIsEnumerable('length'));};document.writeln(is_array_enhanced([]));document.writeln(is_array_enhanced({}));?正则表达式var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#([\s\S]*))?$/;// (?: ...) 表示非捕获型分组。 后缀 ? 表示这个分组时可选的。// 非捕获性分组不捕获分组所匹配的内容,当然也就得不到匹配的结果,非捕获性分组以(?:...)表示,// 在一些只需要分组匹配但是并不需要得到各个分组匹配的结果时,使用非捕获性分组可以提高匹配速度。// 在JavaScript和Java中,捕获性分组所匹配的内容都是以$1,$2,$3...的格式保存的!// 一般的分组()即括号中没有 ?: 的使用时regexp对象都会将分组内匹配到的内容记录下来var url = "http://www.ora.com:80/goodparts?q#fragment";var result = parse_url.exec(url);var names = ['url','scheme','slash','host','port','path','query','bash'];var blanks = ' ';var i ;document.writeln('<br />');for(i = 0 ; i < names.length;i++){document.writeln(names[i]+":"+blanks.substring(names[i].length),result[i]);document.writeln('<br />');}?? 有两种方法可以创建一个RegExp对象。 在以前的例子中我们看到,优先的是使用字面标量表达法。正则表达式字面变量被包围在一对斜杠中( /.../ ). 注意在JS中斜杠也被用作 除法运算符和注释符 .