JS高級程序設計(4-5章)-筆記

寫在前面

本文記錄的是我不熟悉或者我認爲值得注意的地方,並非書上知識點的歸納數組


第4章 變量、做用域和內存問題

對象是按引用傳遞的(我理解的是傳值其實傳的是一個指針,該指針指向內存中的某個對象)。舉例以下:安全

const a = {name: 'aaa'}
const b = a // 這時候a和b其實指向的是同一個對象
console.log(b.name)  // aaa
b.name = 'bbb'
console.log(b.name)  // bbb
console.log(a.name)  // bbb 在改變b時a也被改變了

對於簡單的對象(屬性的值都爲基本數據類型),賦值時採用const b = {...a}或者const b = Object.assign({}, a)能夠使得b中的對象是一個新對象函數

Lodash提供了cloneDeep()函數用於深拷貝優化

對象按引用傳遞是由於這樣比較節約內存(畢竟多個對象其實只存了一份嘛),弊端就是容易引發不被但願的變化。this


JS具備自動垃圾回收機制,開發人員不用關心內存使用問題,其原理是找出再也不繼續使用的變量,釋放其佔用的內存指針

最經常使用的回收方式是標記清除,另外一個不太常見的是引用計數code

引用計數中,沒法處理循環引用(對象a中包含指向b的指針,對象b中也包含指向a的指針),舉例以下對象

function problem() {
    const a = {}
    const b = {}
    a.obj = b
    b.obj = a
}

能夠經過在函數結尾斷開引用來解決循環引用的問題,以下排序

function problem() {
    const a = {}
    const b = {}
    a.obj = b
    b.obj = a
    // 別的啥啥操做
    
    // 設爲null便可
    a.obj = null
    b.obj = null
}

優化內存佔用:無用的數據將其值設爲null內存


第5章 引用類型

引用類型的值(對象)是引用類型的一個實例

新對象是new操做符後面跟一個構造函數來建立的


數組的sort()方法默認是按從小到大排序,會根據每一項的toString()方法獲得的字符串進行排序。因爲是比較的是字符串,在大多數狀況下,排序結果不是咱們指望的(好比'10'<'5'),咱們須要本身去寫一個排序函數傳給sort()

數組的concat()能夠接受多個參數,以下

const a = [1, 2]
const b = a.concat(3, [4, 5])
console.log(b) // [1, 2, 3, 4, 5]

數組的splice()用於在數組中插入一個或者多個值,以下

const a = [1, 4, 5]
a.splice(1, 0, 2, 3) // 接收的參數依次爲 index,要刪除的元素個數,要插入的元素們
console.log(a) // [1, 2, 3, 4, 5]

因此數組的splice()也可用於替換數組中的某些項,以下

const a = [1, 2, 3, 4, 5]
a.splice(1, 2, 22, 33)
console.log(a) // [1, 22, 33, 4, 5]

因爲函數也是對象,因此函數名實際上是一個指向函數對象的指針

定義一個函數能夠用函數聲明 function funcName() {}或者函數表達式 const func = function() {}, 建議用函數表達式定義函數,好處是定義以後不可被修改,也不會存在函數聲明提高

函數內部有兩個特殊對象,argumentsthisarguments是一個類數組對象,包含着全部傳入函數中的參數,this指向的是函數執行的環境對象


字符串的toLocaleLowerCase()是針對地區做了特殊處理的(不一樣地區對於某些值的轉換規則會有些不同),相對於toLowerCase()來講更安全


完。

相關文章
相關標籤/搜索