本文記錄的是我不熟悉或者我認爲值得注意的地方,並非書上知識點的歸納數組
對象是按引用傳遞的(我理解的是傳值其實傳的是一個指針,該指針指向內存中的某個對象)。舉例以下:安全
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
內存
引用類型的值(對象)是引用類型的一個實例
新對象是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() {}
, 建議用函數表達式
定義函數,好處是定義以後不可被修改,也不會存在函數聲明提高
函數內部有兩個特殊對象,arguments
和this
,arguments
是一個類數組對象,包含着全部傳入函數中的參數,this
指向的是函數執行的環境對象
字符串的toLocaleLowerCase()
是針對地區做了特殊處理的(不一樣地區對於某些值的轉換規則會有些不同),相對於toLowerCase()
來講更安全
完。