关于Javascript"数组"那点事儿

记住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

转载于:https://www.cnblogs.com/xcf007/p/3481101.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值