Day29:每天一个小练习 - JS30-14-JS Reference VS Copy

参考资料:
Alex老师教学
JS30-Day14-JS Reference VS Copy

传值和传址的练习。
我对这部分的概念还不算很清楚,以後还需要继续找题目来写。


今天的练习都是开console看。
Q1

// start with strings, numbers and booleans
// 首先从字串、数字、布林开始
let a = 'A';
let b = a;
a = 'B';
console.log(a, b); // B A
let c = 0;
let d = c;
c++;
console.log(c, d); //1 0
let e = true;
let f = e;
e = false;
console.log(e, f); //false true
let g = 'A';
let h = 'A';
let i = 'A';
(h = 'B'), (i = 'C'), (g += h), (g += i);
// h = 'B';
// i = 'C';
// g += h;
// g += i;
console.log(g, h, i); //ABC B C

Q2

// Let's say we have an array
// 让我们来看看阵列
const players = ['Wes', 'Sarah', 'Ryan', 'Poppy'];//题目预设
// and we want to make a copy of it.
// 我们希望复制阵列

如果直接复制阵列,则复制後的阵列修改时会导致原始阵列也会改变,因为两者指向同一储存位置。

let players2 = players;
players2[0] = 'aaa';
console.log(players, players2);

https://ithelp.ithome.com.tw/upload/images/20201013/20121534yoC4Ata1ZS.png

所以我们需要使用其他方法做出新阵列,以下是两种方法

let players3 = players.slice();
//slice()会把切出来的内容再做成一个阵列
players3[0] = 'bbb';
console.log(players, players3);

https://ithelp.ithome.com.tw/upload/images/20201013/20121534f8YffqTA2v.png

let players4 = [...players];
players4[1] = 'ccc';
console.log(players,players4);

https://ithelp.ithome.com.tw/upload/images/20201013/201215347fI53jtIRt.png

Q3

// The same thing goes for objects, let's say we have a person object with Objects
// 处理物件也是类似的观念
let person = {  //题目预设
    name: 'Wes Bos',
    age: 80,
};

同样的直接复制并修改会干扰到原本的物件

let person2 = person;
person.name = 'yyy';
console.log(person, person2);// {name: "yyy", age: 80} {name: "yyy", age: 80}

https://ithelp.ithome.com.tw/upload/images/20201013/20121534XI9YrYM9sd.png

所以需要使用建立新物件的方法

let person3 = Object.assign({}, person);
person3.age = 30
console.log(person, person3);

https://ithelp.ithome.com.tw/upload/images/20201013/20121534qWBqwBRox7.png
物件有两层的情况:

const abc = {
    name: 'abc',
    age: 100,
    social: {
        twitter: '@abc',
        facebook: 'abc.developer',
    },
};

assign()方法复制再修改仍会干扰到原始物件

let abc2 = Object.assign({}, abc);
abc2.social.facebook = null;
console.log(abc.social.facebook);//null

https://ithelp.ithome.com.tw/upload/images/20201013/20121534vvsi5RwQIV.png
JSON.parse(JSON.stringify())则不会修改到原始物件

let abc3 = JSON.parse(JSON.stringify(abc));
abc3.social.facebook = null;
console.log(abc.social.facebook);

https://ithelp.ithome.com.tw/upload/images/20201013/20121534FM2FSAh6nh.png


<<:  Vue slot:作用域插槽、具名插槽的缩写

>>:  Day28 - GitLab CI 如何让工作流程流水线跑快一点?之二 逐一调整

转行的探索跟可以闪开的思考误区

早起运动30分钟Day1 今天一边运动,一边听《转行》这本书。里面提到几个我喜欢的观点。 “我们都以...

连续 30 天 玩玩看 ProtoPie - Day 13

今天延续昨天的文字输入,我们来做更多尝试。 讲者把昨天 Text > Input 做出来的 I...

Day30:附魔

Annotation,大概最常见的就是@Override了,当我们写的类别继承自其他类别时,要覆写父...

[Day23] HTB Buff

URL : https://app.hackthebox.eu/machines/263 IP :...

Java 开发 WEB 的好平台 -- Grails -- (2) 新增一个 Grails 专案

说明 我在本系列文章中,主要是采用 IntelliJ-IDEA 作为示范。但我不会在文章中跟你讲述如...