Example 1
以下物件格式是否正确? 如果不正确请调整为正确格式
执行物件中的两个函式
错误修正
var person = { name: '小明', age: 32, 1: '2', gender: 'male', 'interests': ['吃饭', '睡觉', '打电动'], greeting: function () { console.log('哈搂,你好'); }, '哈搂': function () { console.log('我是小明'); }};
要判断是否为正确的话,可以使用console.log把东西印出来,如果印的出来就代表格式是正确的喔!
console.log(person);
可见得我们在物件中可以使用中文字串以及数字当作是属性的开头名称喔!
如何执行物件中的两个函式?
person.greeting();person['哈搂']();
Example 2
运用以下阵列及 for 迴圈刑事,执行上面的函式
var person = { name: '小明', age: 32, 1: '2', gender: 'male', 'interests': ['吃饭', '睡觉', '打电动'], greeting: function () { console.log('哈搂,你好'); }, '哈搂': function () { console.log('我是小明'); }};var personMethod = ['greeting', '哈搂'];
实作
for (var i = 0; i < personMethod.length; i++){ console.log(personMethod[i]); // greeting | 哈搂 person[personMethod[i]](); // 执行 }
Example 3
说明最终结果,并解释其流程
function changeName(data) { data.name = '杰伦家'; return data;}var family = { deposit: 100000, name: '小明家', members: { father: '老爸', mom: '老妈', ming: '小明' }};var family2 = jQuery.extend({}, changeName(family));family2.members.jay = '杰伦';console.log('family.name', family.name);console.log('family.members.jay', family.members.jay);console.log(family === family2);console.log(family.members === family2.members);
实际执行流程
我们先用 excel 表说明参考
function changeName(data) { data.name = '杰伦家'; return data;}var family = { deposit: 100000, name: '小明家', members: { father: '老爸', mom: '老妈', ming: '小明' }};
到这里应该没有问题,再来我们来看看
var family2 = jQuery.extend({}, changeName(family));
看到这段你会想说~! jQuery.extend
是浅层複製,没错,所以members的参考位置其实还是 0x02。
但在这之前还得注意 changeName(family),当函式传入的参数是物件的时候,这个传的还是物件的参考,也就是说这里函式接收到的 data 是 family 的 0x01参考位置,所以在函式内修改的话,外部的物件也会跟着做更动。
之后 return 把这个 data物件传回来的时候,也是使用传参考的方式喔!
再来才是浅拷贝的部分~ 直接拷贝了0x01 的内容并存放于新的记忆体空间 0x03
不过如果更动其中的members的话,该物件参考的位置还是 0x02,所以 0x01 的memmbers的内容也会跟着做改变喔!
family2.members.jay = '杰伦';
所以依照这个结构,就可以得出答案是
我们再把两个family印出来看看
虽然看起来一样,但其实两个物件是参考了不同的记忆体位置,不过其中的 members 物件都是参照了同一个记忆体位置喔!
如果没有问题的话~就可以继续往下一篇文章的题目进行练习噜~汪汪