JS數(shù)據(jù)類型忘苛、判斷、堆棧唱较、深淺拷貝

數(shù)據(jù)類型

六種基本數(shù)據(jù)類型

  1. undefined
  2. null
  3. string
  4. number (NaN)
  5. boolean
  6. symbol

一種引用類型

  • Object (包括Array和Function)

檢測方法

  1. typeof
    用來檢測:undefined扎唾、string、number南缓、boolean胸遇、symbol、object西乖、function狐榔,無法檢測ASrray
  2. xx instanceof type
    用來檢測引用類型Array坛增、Function、Object
    無法檢測基本類型
console.log(2 instanceof Number); // false
console.log(true instanceof Boolean); // false 
console.log('str' instanceof String);  // false  
console.log([] instanceof Array);    // true
console.log(function(){} instanceof Function); // true
console.log({} instanceof Object);    // true    
console.log(undefined instanceof Undefined);// 報錯
console.log(null instanceof Null);//報錯
  1. constructor
console.log((2).constructor === Number); //true
console.log((true).constructor === Boolean); //true
console.log(('str').constructor === String); //true
console.log(([]).constructor === Array); //true
console.log((function() {}).constructor === Function); //true
console.log(({}).constructor === Object); //true

如果創(chuàng)建的對象更改了圓形薄腻,無法檢測到最初的類型

function Fn(){}; //原來是方法
Fn.prototype=new Array(); //改變原型為數(shù)組
var f=new Fn();
console.log(f.constructor===Fn);    // false
console.log(f.constructor===Array); // true
  1. 其他補充方法
  • null檢測:a === null
  • Array檢測:`Array.isArray([])
  1. 萬金油方法
    Object.prototype.toString.call()
    返回[object type]其中type是對象類型
var a = Object.prototype.toString;
 
console.log(a.call(2));
console.log(a.call(true));
console.log(a.call('str'));
console.log(a.call([]));
console.log(a.call(function(){}));
console.log(a.call({}));
console.log(a.call(undefined));
console.log(a.call(null));

[object Number]
[object Boolean]
[object String]
[object Undefined]
[object Null]
[object Array]
[object Function]
[object Object]

null和undefined區(qū)別

null表示"沒有對象"收捣,即該處不應(yīng)該有值。典型用法是:

  • 作為函數(shù)的參數(shù)庵楷,表示該函數(shù)的參數(shù)不是對象罢艾。
  • 作為對象原型鏈的終點。

undefined表示"缺少值"尽纽,就是此處應(yīng)該有一個值咐蚯,但是還沒有定義。典型用法是:

  • 變量被聲明了弄贿,但沒有賦值時春锋,就等于undefined。
  • 調(diào)用函數(shù)時差凹,應(yīng)該提供的參數(shù)沒有提供期奔,該參數(shù)等于undefined。
  • 對象沒有賦值的屬性危尿,該屬性的值為undefined呐萌。
  • 函數(shù)沒有返回值時,默認返回undefined谊娇。

堆和棧

定義

  • stack棧肺孤,自動分配的內(nèi)存空間,由系統(tǒng)自動釋放
  • heap堆是動態(tài)分配的內(nèi)存济欢,大小不定赠堵,不自動釋放

與數(shù)據(jù)類型的關(guān)系

  • 基本數(shù)據(jù)類型存放在棧中,=:直接傳值
  • 引用數(shù)據(jù)類型存放在堆中船逮,=:傳址


    堆棧

深淺拷貝

數(shù)組的淺拷貝:數(shù)組里的引用類型都是淺拷貝的

/**
    數(shù)組的淺拷貝
**/
//1顾腊、基本 =
var arr1 = [1, 2, 3]
var arr2 = arr1
arr1[0]=100
console.log(arr1,arr2) // [ 100, 2, 3 ] [ 100, 2, 3 ]

//2粤铭、slice
var arr3 = [1, 2, 3]
var arr4 = arr3.slice(-1) // 取數(shù)組最后一個元素
arr3[2] = 100
console.log(arr3,arr4) // [ 1, 2, 100 ] [ 3 ]
//看起來修改舊數(shù)組不改變新數(shù)組挖胃,像是深拷貝了
//但是!0鸸摺酱鸭!
var arr5 = [1, 2, 3, {b: 4}]
var arr6 = arr5.slice(-1)
arr5[3].b = 100
console.log(arr5, arr6) //[ 1, 2, 3, { b: 100 } ] [ { b: 100 } ]
// 如果數(shù)組里元素是個引用類型,那么舊數(shù)組里這個元素被改變垛吗,會影響新數(shù)組
// 所以slice()方法是淺拷貝

//3凹髓、concat 同上理

//4、遍歷
var arr7 = [1,2,3,{b:4}]
var arr8 = []
for (var i = 0; i < arr7.length; i ++) {
    arr8.push(arr7[i])
}
arr7[3].b = 100
console.log(arr7, arr8) // [ 1, 2, 3, { b: 100 } ] [ 1, 2, 3, { b: 100 } ]

對象淺拷貝

// 1怯屉、 對象淺拷貝 - Object.assign
function shallowCopy4(origin) {
    return Object.assign({},origin)
}

//2蔚舀、 對象淺拷貝 - 擴展運算符
// 擴展運算符(...)用于取出參數(shù)對象的所有可遍歷屬性饵沧,拷貝到當(dāng)前對象之中
function shallowCopy5(origin) {
    return {
        ...origin
    }
}

//3、使用...符
const newObje = {...obj}

//4赌躺、使用create
const newObj = Object.create({}, obj)

深拷貝

  1. JSON正反序列化
 function deepClone1(origin) {
    return JSON.parse(JSON.stringify(arr));
}

原理:利用 JSON.stringify 將js對象序列化(JSON字符串)狼牺,再使用JSON.parse來反序列化(還原)js對象
缺點:缺點就是無法拷貝 undefined、function礼患、symbol 這類特殊的屬性值是钥,拷貝完變成null

  1. 遞歸
function DeepClone(originObj) {
    // 先判斷obj是數(shù)組還是對象
    let newObj;
    if(originObj instanceof Array ) {
        newObj = []
    } else if (originObj instanceof Object) {
        newObj = {}
    }
    for (let key in originObj) {
        // 判斷子元素類型
        if (typeof(originObj[key]) === "object") {
            // 如果子元素為object 遞歸一下
            newObj[key] = DeepClone(originObj[key])
        } else {
            newObj[key] = originObj[key]
        }
    }
    return newObj
}
  1. lodash的_.cloneDeep()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缅叠,隨后出現(xiàn)的幾起案子悄泥,更是在濱河造成了極大的恐慌,老刑警劉巖肤粱,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弹囚,死亡現(xiàn)場離奇詭異,居然都是意外死亡领曼,警方通過查閱死者的電腦和手機余寥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悯森,“玉大人宋舷,你說我怎么就攤上這事∑耙觯” “怎么了祝蝠?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長幻碱。 經(jīng)常有香客問我绎狭,道長,這世上最難降的妖魔是什么褥傍? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任儡嘶,我火速辦了婚禮,結(jié)果婚禮上恍风,老公的妹妹穿的比我還像新娘蹦狂。我一直安慰自己,他們只是感情好朋贬,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布凯楔。 她就那樣靜靜地躺著,像睡著了一般锦募。 火紅的嫁衣襯著肌膚如雪摆屯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天糠亩,我揣著相機與錄音虐骑,去河邊找鬼准验。 笑死,一個胖子當(dāng)著我的面吹牛廷没,可吹牛的內(nèi)容都是我干的沟娱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼腕柜,長吁一口氣:“原來是場噩夢啊……” “哼济似!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盏缤,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤砰蠢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后唉铜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體台舱,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年潭流,在試婚紗的時候發(fā)現(xiàn)自己被綠了竞惋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡灰嫉,死狀恐怖拆宛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情讼撒,我是刑警寧澤浑厚,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站根盒,受9級特大地震影響钳幅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜炎滞,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一敢艰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧册赛,春花似錦钠导、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柜砾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間换衬,已是汗流浹背痰驱。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工证芭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人担映。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓废士,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蝇完。 傳聞我的和親對象是個殘疾皇子官硝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容