# Vue 作品實戰 2022 春季班_week3_直播筆記 ###### tags: `六角學院_Vue直播班_直播筆記` ## 目錄 [ToC] --- ## 物件參考 ### call by sharing ```javascript= // 如果改物件內的屬性 function add(obj) { obj.number++; } var o = { number: 10 }; add(o); console.log(o.number); // 11 //如果直接指向新物件; function add(obj) { // 讓 obj 變成一個新的 object obj = { number: obj.number + 1 }; } var o = { number: 10 }; add(o); console.log(o.number); // 10 ``` ![](https://i.imgur.com/ByG1uc5.png) 如果在 function 裡面對物件重新賦值, 裡面的 obj 會指向新的物件,外面的 o 並不會。 ```javascript= const person1 = { name: "小明" }; function fn(item) { item = {}; item.name = "小美"; } fn(person1); console.log(person1.name); // 值為 小明 ``` ### function 被執行一定會回傳,就算沒有 return,因為執行 function 是表達式 ### 淺層拷貝 ```javascript= var a = { name: "a" }; function changeData(param) { // 方法一:Object assign // const newData = Object.assign(param, {}); // console.log('Object.assign', newData); // 淺層複製 // 方法二:展開 const newData = { ...param }; console.log("Spread syntax", newData); // 淺層複製 return newData; } var b = changeData(a); console.log(a === b); ``` ### 深層拷貝 ![](https://i.imgur.com/gKjWYII.png) ```javascript= let obj1 = { foo: "bar", arr: [0, 1] }; let obj3 = JSON.parse(JSON.stringify(obj1)); ``` ### 物件重新賦值 ```javascript= const people = [ { name: "卡斯伯", like: "鍋燒意麵", price: 95, imageUrl: "https://images.unsplash.com/photo-1569562211093-4ed0d0758f12?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1470&q=80" }, { name: "瑞", like: "炒麵", price: 80, imageUrl: "https://images.unsplash.com/photo-1612929633738-8fe44f7ec841?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8NHx8ZnJpZWQlMjBub29kbGVzfGVufDB8fDB8fA%3D%3D&auto=format&fit=crop&w=400&q=60" }, { name: "小明", like: "黑胡椒燴飯", price: 120, imageUrl: "https://images.unsplash.com/photo-1637362520022-81292a4bff4b?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=687&q=80" }, { name: "喬伊", like: "生菜沙拉", price: 80, imageUrl: "https://images.unsplash.com/photo-1505253716362-afaea1d3d1af?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=687&q=80" } ]; people.forEach((person) => { if (person.name === "卡斯伯") { person = { name: "杰倫", like: "香菜", price: 180 }; } }); console.log(people); // Q:請問卡斯伯是否有被替換? A : 沒有 ``` ![](https://i.imgur.com/lI3omCX.png) ```javascript= people.forEach((person,key) => { if (person.name === "卡斯伯") { people[key] = { name: "杰倫", like: "香菜", price: 180 }; } }); console.log(people); //這樣才有改到 ``` ![](https://i.imgur.com/6a7CsLd.png) ## Vue 起手式 ### watch 和 debounce 使用 debounce 避免有改動的時候狂打 api ```javascript= import { debounce } from 'https://cdn.jsdelivr.net/npm/@esm-bundle/lodash@4.17.21/esm/index.js'; watch: { seed: debounce((current) => { axios.get(`https://randomuser.me/api/?seed=${current}`).then((res) => { console.log(res.data); }); }, 1000); } ``` 如果 debounce callback function 裡面要用到 this ,不要用箭頭函式,不然會指到 window <iframe height="300" style="width: 100%;" scrolling="no" title="debounce 使用箭頭函式的 this" src="https://codepen.io/jason60810/embed/zYPOBqa?default-tab=result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true"> See the Pen <a href="https://codepen.io/jason60810/pen/zYPOBqa"> debounce 使用箭頭函式的 this</a> by jason (<a href="https://codepen.io/jason60810">@jason60810</a>) on <a href="https://codepen.io">CodePen</a>. </iframe>