记住Javascript里没有“数组”
忘掉一切吧,骚年...
一切都是对象:书中还细分了下简单类型和对象类型
基本类型:typeof xxx => "number"数字,"boolean"布尔,"string"字符串,还有两个特殊的成员(null,undefined)
剩下的其他的是对象(有点像c#的引用类型)
不是还有个数组吗?
아니오.那个还不算真正的数组思密达。只能算是个“类数组”的假冒货,容我细细道来:
var arr;//undefined
arr=[];//typeof arr=>"object",arr.length==0
这个对象比较特殊于普通Object的一点是有个length属性
[]-这个操作符当然啦不是“数组”的专属啦
可以var b={hello:'world'};
如访问对象属性值: b['hello'] //注意这里不能b[hello]直接,意义不一样,这里hello是个表达式(单个的就是变量啦),首先会计算这个表达式(一发现变量hello未声明就报错了)。
可以实验:
b[hello]='world';//ReferenceError: hello is not defined
var hello;
b[hello]='world';//这时hello声明了,值为undefined,转换为字符串'undefined'后作为“数组”的属性名
所以console.info(b[undefined]);//会得到'world'
对于使用'hello'作为属性名的可以var k='hello';alert(b[k]);这样就可以了。所以两者意义是不一样的。
既然数组也是对象,所以也可以使用[]操作符
//先设置几个“属性”,需要注意的是对数组来说,设置属性时,如果这个属性看上去是个非负整数的话,那么如果比当前length值大的话会加一并更新给数组的length属性,数组不要求“数字索引”(不是索引,同c#之类的不太一样)连续
arr[999]='哈哈哈';//999>arr.length(==0),所以arr.length=999+1
//但实际的arr来说不存在0-998这些键,arr看上去是这样的{999:'哈哈哈',length:1000}
自行测试: (判断是不是一个对象的属性名,可以用in操作符)
999 in arr ===>返回 true
998 in arr ====>返回 false
[]操作会计算它的表达式,并调用toString()转换一个字符串作为数组对象的属性名:
arr['']=‘我是空’;//这也可以的,''不像整数不更新Length
a['10']=123;//10比1000小,length不更新
a[true]=1;//'true'做键
a[1/0]='无穷';//1/0=>'Infinity'
...都是toString()....
length也可以作为左值,可以修改的:
arr.length=10000;//改大了,其实只是修改了length属性值而已,对元素没什么影响
//好比 {....,length:10000}
并不是前面多了N多个undefine,对于浏览器插件显示的有误,如chrome的控制台
如果设置的比当前length值小,会截断:
长得比length小的“类整数"键会抹掉,如"类数组“{0:0,1:1,2:2,'true':true,8:'8',10:10,'':'empty',length:11}(注意:这里为了表达,故意用了个普通Object的形式~~)
如果length设置为7,则只有小于7的“数字”属性名保留 {0:0,1:1,2:2,'true':true,'':'empty',length:11}
当然了数组有个简洁的初始化语法 var a=[1,2,'true',undefined,false];
上面的再提示一下:
var a=[];
a.length=5;
var b=[undefined, undefined, undefined, undefined, undefined];
试试 3 in a 和 3 in b就知道区别了
还有关于”删除元素“提一下:
var a=[1,2,3];
delete a[1]; //1 in a ==false,会留下空档
和
a[1]=undefined;不一样 // 1 in a ==true