js数组和对象的关系以及区别以现代浏览器chrome运⾏⼀下代码
var arr=[];//定义了⼀个空数组
console.log(typeof(arr))//输出object
console.log(arr.length)//输出0
var obj={};//定义⼀个空对象
以上arr数组在console⾥展开可以得到以下内容
length:0//唯⼀可以读写的,表⽰的是刚才定义的空数组内的length对象
[[Prototype]]:Array(0)//以下是Array原型内的对象
at: ƒ at()
concat: ƒ concat()
constructor: ƒ Array()
copyWithin: ƒ copyWithin()
entries: ƒ entries()
every: ƒ every()
fill: ƒ fill()
filter: ƒ filter()
find: ƒ find()
findIndex: ƒ findIndex()
flat: ƒ flat()
flatMap: ƒ flatMap()
forEach: ƒ forEach()
includes: ƒ includes()
indexOf: ƒ indexOf()
join: ƒ join()
keys: ƒ keys()
lastIndexOf: ƒ lastIndexOf()
length:0
map: ƒ map()
pop: ƒ pop()
push: ƒ push()
reduce: ƒ reduce()
reduceRight: ƒ reduceRight()
reverse: ƒ reverse()
shift: ƒ shift()
slice: ƒ slice()
some: ƒ some()
sort: ƒ sort()
splice: ƒ splice()
toLocaleString: ƒ toLocaleString()
toString: ƒ toString()
unshift: ƒ unshift()
values: ƒ values()
Symbol(Symbol.iterator): ƒ values()
Symbol(Symbol.unscopables):{copyWithin:true, entries:true, fill:true, find:true, findIndex:true, …} [[Prototype]]: Object
constructor: ƒ Object()
hasOwnProperty: ƒ hasOwnProperty()
isPrototypeOf: ƒ isPrototypeOf()
propertyIsEnumerable: ƒ propertyIsEnumerable()
toLocaleString: ƒ toLocaleString()
toString: ƒ toString()
valueOf: ƒ valueOf()
__defineGetter__: ƒ __defineGetter__()
__defineSetter__: ƒ __defineSetter__()
__lookupGetter__: ƒ __lookupGetter__()
__lookupSetter__: ƒ __lookupSetter__()
get __proto__: ƒ __proto__()
set __proto__: ƒ __proto__()
typeof array只有length属性是可写的,其他的属性都在Array的原型中,⽽Array的原型就是object对象原型
也就是说,数组arr也是对象,当然也可以使⽤object[key]=value的⽅式赋值
//接上述代码
arr["a"]=1;
console.log(arr)//会输出[a:1]
console.log(arr.length)//输出0
arr的length属性除了通过代码arr.length=10来直接改变外,还可以通过arr[最⼤数字下标]改变arr.length
arr[10]=1;
arr[3]=3;
console.log(arr.length)//11,下标从0开始
arr["11"]=1
console.log(arr.length)//12,下标从0开始,字符会尝试变成数字下标,从⽽改变length属性
arr['aaa']=1
console.log(arr)//数组作为对象添加了⼀个key
arr的length属性有范围,最⼩0,最⼤是 2的32次⽅-1=4294967295,也就是uint32
也就是说,通过arr[下标]的⽅式改变length,下标最⼤只能是2的32次⽅-2=4294967294
arr=[];//恢复
arr[4294967294]=1;
console.log(arr.length)//4294967295
arr[4294967295]=1;//这种⽅式不会报错,因为使⽤了object的增加属性的⽅法,增加的是⼀个key是4294967295值为1的属性
console.log(arr.length)//4294967295
console.log(arr)
/*
4294967294: 1 //这个是arr作为数组的下标为4294967294的值1
4294967295: 1 //这个是arr作为对象的属性4294967295的值1
length: 4294967295 //length还是4294967295
*/
arr.push(1)//报错,length违法,这是数组的⽅法,和arr[4294967295]=1;不同,这会新增⼀个数组元素导致length不合法报错
总结⼀下
数组是特殊的对象,继承了对象原型的所有⽅法,但是多了作为数组原型的⽅法例如push,pop,shift(不通浏览器可能不完全⼀致)
2的32次⽅-1这个值很重要,在js中的正整数范围就是0到2的32次⽅-1,包括了对象属性的数量上限,因为对象也有length属性上限也是2的32次⽅-1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论