数组
-
数组是一段线性分配的内在,它通过整数计算偏移并访问其中的元素
- 什么是线性分配?数组内存级的原理又是什么?
-
可惜,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报错,所以需要单独拿出来讲