值類型:
簡單(一般)數(shù)據(jù)類型:
字符串(String)廓块、數(shù)字(Number)秋度、布爾(Boolean)瓶盛、對空(Null)都伪、未定義(Undefined)呕乎、Symbol
引用(復(fù)雜)數(shù)據(jù)類型:
對象(Object)、數(shù)組(Array)陨晶、函數(shù)(Function)猬仁,
數(shù)據(jù)類型不同,那么瀏覽器對其內(nèi)部操作也就不大相同先誉,尤其是對于復(fù)雜數(shù)據(jù)類型而言湿刽,很有可能造成一些不必要的麻煩,變量的值如果是一般數(shù)據(jù)類型的話褐耳,瀏覽器會把這個值存放到【椪┕耄】中,如果是復(fù)雜數(shù)據(jù)類型將會在【堆】中開辟一個新的空間用于單獨(dú)存放铃芦,其中的【椦拍鳎】和【堆】是一種概念,相當(dāng)于內(nèi)存中某處存放數(shù)據(jù)的地方刃滓,對于【椚逝耄】,是有一定大小空間的咧虎,如果這個數(shù)據(jù)過于龐大卓缰,比如一些數(shù)位高的驚人的數(shù)據(jù),在處理上也會造成延誤或者滯留老客。
比如:
let a = 100,? ?let b = a ,那么b的結(jié)果也將等于100
let a = { name : '王二麻子' }? ,? let b = a ,由于此時兩個變量都是指向一個值僚饭,而由于對象的值是存放在【堆】里面的震叮,【堆】會將數(shù)據(jù)的位置生成一串內(nèi)部地址存放在【楇逝椋】里,a和b都指向這個地址苇瓣,則此時 b的結(jié)果也將會是 { name:'王二麻子'}? ,但如果此時賦值 b = { name : '路人甲' },則由于更改的是同一內(nèi)存地址內(nèi)的值尉间,則這個值也會影響a的取值,此時的a也會等于?{ name : '路人甲' }
深淺拷貝:
由上文引起對于深淺拷貝的初級概念(后面對于JSON的方法概念也會加深這個理解)击罪,深拷貝就是不影響其他變量的值哲嘲,將地址,文件全復(fù)制媳禁,淺拷貝就是僅復(fù)制地址眠副,更改其值會影響調(diào)用該地址的其他對象,上文的a和b就是例子竣稽,b僅復(fù)制了a的地址囱怕,賦值b的同時也會影響a的內(nèi)容霍弹,
由淺拷貝變深拷貝的方法:
定義b為一個新的地址(即開辟一個新的數(shù)據(jù)存放在【堆】中),let b = { } , 然后b【“name”】= ’炮灰丙’娃弓,則此時重定義后的b雖然前面也”=“a了但自己開辟了一個內(nèi)存地址典格,即可在不影響a的情況下變更該值,
或者台丛,使用數(shù)組方法【concat()】耍缴,
let a = [ 1,3,5 ]?
let b = 【 】? ?,? b.concat(a)?
那么 b = 【 1,3,5 】,更改b[0]=3挽霉,
那么:a = [1,3,5]防嗡、b = [ 3,3,5]
運(yùn)用擴(kuò)展運(yùn)算符:用于取出參數(shù)對象所有可遍歷屬性然后拷貝到當(dāng)前對象(自定義的屬性在拓展運(yùn)算符后面,則拓展運(yùn)算符對象內(nèi)部同名的屬性將被覆蓋掉炼吴。)
let person = {name: "Amy", age: 15};
let someone = { ...person };
someone; //{name: "Amy", age: 15}
對象方法:(ES6新增)
Object.assign(target, source_1, ···)(用于將源對象的所有可枚舉屬性復(fù)制到目標(biāo)對象中)(淺拷貝)
let target = {a: 1};
let object2 = {b: 2};
let object3 = {c: 3};
Object.assign(target,object2,object3);
target; // {a: 1, b: 2, c: 3}
如果目標(biāo)對象和源對象有同名屬性本鸣,或者多個源對象有同名屬性,則后面的屬性會覆蓋前面的屬性硅蹦,且如果該函數(shù)只有一個參數(shù)荣德,當(dāng)參數(shù)為對象時,直接返回該對象童芹;當(dāng)參數(shù)不是對象時涮瞻,會先將參數(shù)轉(zhuǎn)為對象然后返回(詳細(xì)可參考菜鳥教程3.2.3 ES6 對象 | 菜鳥教程)
Object.is(value1, value2)(用來比較兩個值是否嚴(yán)格相等,與(===)基本類似)
Object.is("q","q"); // true
Object.is(1,1); // true
Object.is([1],[1]); // false
Object.is({q:1},{q:1}); // false