《设计模式与开发实践》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, //length为4,应该添加到末端,即序号为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"}