复习笔记 JavaScript语言精粹 第6章 数组

171 阅读3分钟

数组

  • 数组是一段线性分配的内在,它通过整数计算偏移并访问其中的元素

    • 什么是线性分配?数组内存级的原理又是什么?
  • 可惜,javascript没有这种数据结构

  • javascript提供了类数组

    • 下标是字串串,并是其属性
  • 数组字面量

  • 一对方括号包围0或多个逗号分隔的值的表达式.

  • 数组的第一个值将获得属性名0,第2个1,以此类推

  • 数组也是对象,但是数组是

    • 继承之Number.prototype
    • 它拥有一些操作数组的方法
    • 并且有Length属性
var empty =[];
var numbers =[
  'zero','one','two','three','four','five','six','seven','eight','nine'
];

console.log(empty[0],numbers[0]); //=>undefined 'one'
console.log(empty.length,numbers.length);//0 10
var numbers_object ={
    '0':'zero',
    '1':'one',
    '2':'two',
    '3':'three',
    '4':'four',
    '5':'five',
    '6':'six',
    '7':'seven',
    '8':'eight',
    '9':'nine'
};
  • 数组中可以保存不同类型的值,在c#里面就不行
var misc = [
  'string',
  98.6,
  true,
  undefined,
  ['1', 2], 
  { object: true },
  NaN,
  Infinity
];
console.log(misc.length);// => 8

长度

  • javascipt的length没有上界
    • 以大于当前length的数字作为下标,length会自动增大以容纳新的元素,而不会报错
  • 越界增加元素是可以的,但只是增加了这一个
    • 也就是说,数组的length并不一定等于它的个数
var myArray = [];
myArray.length; // => 0
myArray[100];//=>undefined
myArray[100] = true;
console.log(myArray.length); //=>101
console.log(myArray[1]); //=>undefined.myArray实际还只有一个元素
  • []后置运算符把它所包含的表达式转换成字符串,如果这个表达式有toString方法,就会调用这个方法的值,这个字符吕将被用作属性名
console.log(myArray[50+50]); //=>true
  • 可以直接设置Length的值
    • 大的length不会分配更多的空间
    • 但是小的值会把超出范围的属性全部删除
numbers.length = 200;
umbers[111] = false;
console.log(numbers); // => ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", empty × 101, false, empty × 88]
numbers.length = 3;
console.log(numbers); //=>["zero", "one", "two"]
  • 可以通过Length+1或者push来给数组添加新的元素
  • 怎么把新的元素加到0的索引上去呢

shift方法了解一下

numbers.push(1);
numbers[numbers.length+1] = 2;

删除

  • 由于数组是对象,所以可以直接使用delete删除属性
    • 只是这样删除的话,只是清空了当前元素,,,
    • 下标还占着位置的,
delete numbers[2];
console.log(numbers);//=>["zero", "one", empty, 1, empty, 2]
  • 通过splice方法可以删除元素并且重新排列后面的元素...
    • 第1个参数是起始位置.
    • 第2个参数是删除的个数
numbers.splice(2,1);
console.log(numbers);//=> ["zero", "one", 1, empty, 2]

枚举

  • 用for进行枚举
var i;
for (i = 0; i < numbers.length; i += 1) {
  numbers[i];
}
  • 容易混淆的地方 -在什么情况下选用数组或对象.....
    • 当属性名是小而连续的整数时,就选用数组...
    • 其他情况都是用对象
  • 在javascript里面无法判断数组,,
    • 因为typeof出来也是object
    • 只有通过contructor来判断了....以constuctor是对创建此对象的对象进行引用..比如用Quo创建的myQuo,那么myQuo的constructor就是myQuo..以此道理,数组的就是Array,对象的就是Object..
var is_array = function (value){
  return value && typeof value === 'object' && value.constructor === 'Array'    
};
  • 上面这个函数会有一个问题,不能识别不同的窗口或帧构造的数组...
    • 也就是跨域吧?这里就不做纪录了.书上60页有解决办法 也只有一行
    • 还是写下来吧....可以简单的理解成.object对象里面的Prototype里面的tostring方法就是用来返回类型的..至于代码块里面是怎么运行的还不懂呢

小兄弟这个和跨域一点关系也没有,只是跨了一个全局命名空间而已

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

方法

  • 就是像对象一样添加新的方法.因为方法名不是数字.
  • 所以不会影响数组的length..但是会给数组添加元素

指定初始值

  • 呃...这个为什么要拿出来讲,没太搞明白呢

这是因为JavaScrript里面创建数组时,如果不显示指定元素值的话,就会是空的,容易在后面导致undifined报错,所以需要单独拿出来讲