js中的數(shù)據(jù)類(lèi)型是什么? 有人可能會(huì)說(shuō),string、number、boolean、null、undefined。。。這并沒(méi)有毛病,但我想說(shuō),js只有基本數(shù)據(jù)類(lèi)型和復(fù)雜數(shù)據(jù)類(lèi)型。
今天,我們來(lái)研究一下[] 和 []、{}和{}。首先思考一下,'' == ''? 空字符串等于空字符串? []==[]?空數(shù)組等于空數(shù)組?
我們知道復(fù)雜數(shù)據(jù)類(lèi)型會(huì)在堆內(nèi)存中開(kāi)辟一塊空間去存放,并用一個(gè)地址指向它,用代碼來(lái)表示就是
var a = [1,2,3];
var b = a;
b.push(4)
console.log(b) // [1,2,3,4]
這時(shí)候我們打印
console.log(a) // [1,2,3,4]
這就是復(fù)雜類(lèi)型的一個(gè)小練習(xí)題了。
怎么去解決呢,其實(shí)我們只需知道,只要a、b不是指向一個(gè)內(nèi)存地址就ok了。在數(shù)組的方法中,有些方法會(huì)返回一個(gè)新的數(shù)組,例如: concat()、slice().
使用方法:
var a = [1,2,3];
var b = a.concat(); // 使用slice()也可以
b.push(4);
console.log(b) // [1,2,3,4]
console.log(a) // [1,2,3]
這就算是一個(gè)簡(jiǎn)單的淺克隆了。關(guān)于深克隆,例如:
var data = [
{ name: 'zs', age:3 },
{ name: 'ls', age:4 },
{ name: 'ww', age:5 },]
深克隆最簡(jiǎn)單的解決方法就是,將data轉(zhuǎn)換成字符串,因?yàn)槲覀冎烂總€(gè)字符串都在單獨(dú)的一個(gè)內(nèi)存中,互不影響。
var str = JSON.stringify( data ); // '[ { name: 'zs', age:3 }, { name: 'ls', age:4 }, { name: 'ww', age:5 } ]'
var obj = JSON.parse( str );
這樣的話,obj就又是另一個(gè)data了,但是改變obj又不會(huì)影響原來(lái)的data。這,就是深克隆的簡(jiǎn)單方法
作者:
黑馬程序員前端與移動(dòng)開(kāi)發(fā)培訓(xùn)學(xué)院首發(fā):
http://web.itheima.com/