非数组对象借用数组方法/《设计模式与开发实践》p52例子的扩展笔记

《设计模式与开发实践》p52例子的扩展笔记

let obj = {
  'length': 12,
  'a': 'a',
  'b': 'b',
  'c': 'c'
};

// (function() {
//
// })()

Array.prototype.push.call(obj, ['一','二','三’])
Array.prototype.push.reply(obj, ['','',''])
// Array.prototype.shift.call(obj)




console.log(JSON.stringify(obj));

一 call 和 reply的区别

reply接收第二个参数是一个数组

输出,把数组打散了
{"0":"一","1":"二","2":"三","a":"a","b":"b","c":"c","length":3}

这样会报错

Array.prototype.push.reply(obj, ['一','二','三'],"sdf")

call接收的参数,必须是一个个的

输出

{"3":["一","二","三"],"length":4,"a":"a","b":"b","c":"c"}
Array.prototype.push.call(obj, ['一','二','三'],"sdf")


//输出:{"12":["一","二","三"],"13":"sdf","length":14,"a":"a","b":"b","c":"c"}

二 对于非数组对象中,“类数组”的部分

如果对象中有 length属性,“0”,”1”..属性

let obj = {
  'length': 12,
  ‘0': 'a',
  ‘1': 'b',
  ‘2': 'c'
};

那该方法会识别出这些属性。

length

如,现在length的value是12,那添加了n个键值对后,length会变成 12 + n

push方法 应该在数组的末端添加新元素。

当length存在,方法会通过该属性判断目前“数组的长度”,来添加到第length个。例子:

let obj = {
  'length': 12,
  '3': 'a',
  '4': 'b',
  '5': 'c'
};

Array.prototype.push.call(obj, ['一','二','三'])

console.log(JSON.stringify(obj));

//输出:{"3":"a","4":"b","5":"c","12":["一","二","三"],"length":13}

当length不存在,方法会认为目前“数组”中没有元素。故会从第0个开始添加,同时增加 ,”length”:1

let obj = {

  '3': 'a',
  '4': 'b',
  '5': 'c'
};

Array.prototype.push.call(obj, ['一','二','三'])

console.log(JSON.stringify(obj));

//输出:{"0":["一","二","三"],"3":"a","4":"b","5":"c”,"length":1}

当方法认为应该添加的位置,已经有相应的属性存在时,方法会覆盖原有的

let obj = {

  '0': 'bla’, //无length,应该从第0个添加。会覆盖这个
  '3': 'a',
  '4': 'b',
  '5': 'c'
};

Array.prototype.push.call(obj, ['一','二','三'])

console.log(JSON.stringify(obj));

//输出:{"0":["一","二","三"],"3":"a","4":"b","5":"c","length":1}

例子2

let obj = {
  'length': 4, //length4,应该添加到末端,即序号为4的元素。
  '0': 'bla',
  '3': 'a’, 
  '4': 'b’, //只要key是4,就会覆盖。而不管其在对象中的“实际顺序”,事实上js对象的属性是无序的
  '5': 'c'
};

Array.prototype.push.call(obj, ['一','二','三'])

console.log(JSON.stringify(obj));

//输出:{"0":"bla","3":"a","4":["一","二","三"],"5":"c","length":5}

序号重复的只保留一个

let obj = {
  'length': 4, //length为4,应该添加到末端,即序号为4的元素。
  '0': 'bla',
  '3': 'a',
  '4': 'b’, //只要key是4,就会覆盖。然后,序号重复的只保留一个。
  '4': 'b',
  '4': 'bddd',
  '4': 'bdddddd',
  '4': 'bdddddddd',
  '5': 'c'
};

Array.prototype.push.call(obj, ['','',''])

console.log(JSON.stringify(obj));


//输出: {"0":"bla","3":"a","4":["一","二","三"],"5":"c","length":5}

对象的属性名,同时有数字字符串和非数字字符串的,认为前者是数组元素的序号,后者排在数字后面

let obj = {
  'length': 4,
  '3': 'a',
  'sdfsdf': 'b',
  '4': 'bd',
  '4': 'bddd',
  '0': 'bla',
  '4': 'bdddddd',
  'asdfasdfasdf': 'bdddddddd',
  '5': 'c'
};

Array.prototype.push.call(obj, ['一','二','三'])

console.log(JSON.stringify(obj));


//输出: {"0":"bla","3":"a","4":["一","二","三"],"5":"c","length":5,"sdfsdf":"b","asdfasdfasdf":"bdddddddd"}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值