摘要:從入門到放棄基本類型和引用類型有七種數(shù)據(jù)類型而的變量根據(jù)指向數(shù)據(jù)類型的不同也分為兩種類型一種基本類型一種引用類型基本類型基本類型包括這五種但凡變量指向這五種數(shù)據(jù)類型的都稱之為基本類型假設(shè)有以上變量那么他們在內(nèi)存中棧區(qū)的存儲結(jié)構(gòu)大概是這樣子
JS從入門到放棄-基本類型和引用類型
JS有number,string,null,undefined,boolean,array,object七種數(shù)據(jù)類型,而JS的變量,根據(jù)指向數(shù)據(jù)類型的不同,也分為兩種類型,一種基本類型,一種引用類型.
1. 基本類型基本類型包括: number, string, null, undefined, boolean這五種.但凡變量指向這五種數(shù)據(jù)類型的都稱之為基本類型.
var test1 = "hahaha"; // string var test2 = 1; // number var test3 = true; // boolean
假設(shè)有以上變量,那么他們在內(nèi)存中棧區(qū)的存儲結(jié)構(gòu)大概是這樣子的.
棧區(qū)指針 | 棧區(qū)值 |
test1 | hahaha |
test2 | 1 |
test3 | true |
var test = "321"; var test = "123"; var test1 = test; console.log(test === test1); // true
執(zhí)行以上語句之后,你可能會覺得變量test的值從字符串"321"變成了字符串"123".并不是值改變了,而是test只是一個指針,上面的兩條語句都只是在為同一個指針指向不同的值而已.值是不可被改變的.執(zhí)行第三條語句的時候,首先初始化一個test1變量,然后把test的變量賦值給test1.這種賦值稱為深拷貝.如圖:
指針 | 值 |
test | "123" |
test1 | "123" |
最后一條語句之間的比較其實是test和test1之間的值作比較.也就是console.log("123" === "123"),之所以多此一舉的解釋最后兩條語句,原因是因為引用類型的賦值和比較并不是如此.
2. 引用類型引用類型包括: object和array這兩種.但凡變量指向這兩種數(shù)據(jù)類型的都稱之為引用類型.
var china = { tianjin: "天津", beijing: "北京" }; var huabei = { tianjin: "天津", beijing: "北京" };
假設(shè)有以上變量,那么他們在內(nèi)存中棧區(qū)和堆區(qū)的存儲結(jié)構(gòu)大概是這樣子的.
棧區(qū)指針 | 棧區(qū)值 |
china | china對象在堆區(qū)的內(nèi)存地址 |
huabei | huabei對象在堆區(qū)的內(nèi)存地址 |
堆區(qū)地址 | 堆區(qū)值 |
china對象在堆區(qū)的內(nèi)存地址 | china對象 |
huabei對象在堆區(qū)的內(nèi)存地址 | huabei對象 |
china.handan = "邯鄲"; console.log(china.handan); // "邯鄲"
當我們繼續(xù)執(zhí)行上面語句的時候china堆區(qū)值內(nèi)部的屬性除了原有的tianjin和beijing之外又動態(tài)的添加了一個handan屬性.這說明引用類型的值是可以被改變的.
console.log(china === huabei); // false
china對象和huabei對象內(nèi)的屬性明明一樣,但是完全相等比較符卻返回了false.這進一步證明了引用類型的比較是比較兩者在堆區(qū)的地址是否相同.如果我們對兩個對象的內(nèi)部的屬性進行比較呢.
console.log(china.tianjin === huabei.tianjin) // true
這里又會返回true,這是因為我們做比較的對象的屬性是基本類型.他們會比較內(nèi)部的值,而不是比較兩者在堆區(qū)內(nèi)的地址.
最后說一下引用類型的賦值.繼續(xù)上面的代碼
var asia = china; asia.tianjin = "紅橋"; console.log(asia.tianjin); // 紅橋 console.log(china.tianjin); // 紅橋
執(zhí)行上面語句你會發(fā)現(xiàn)明明改變的是asia的屬性,但是china的屬性也跟著改變了.這是因為賦給asia的值是china對象在堆區(qū)的內(nèi)存地址,而不是china對象本身.兩者實際上指向同一個堆區(qū)對象.也因此,改變其中任何一個的屬性,另外一個也會隨之更改.這種賦值也稱之為淺拷貝.
棧區(qū)指針 | 棧區(qū)值 |
china | china對象在堆區(qū)的內(nèi)存地址 |
asia | china對象在堆區(qū)的內(nèi)存地址 |
堆區(qū)地址 | 堆區(qū)值 |
china對象在堆區(qū)的內(nèi)存地址 | china對象 |
基本類型:值不可變,存放于棧區(qū),相互比較是基于值進行比較,相互賦值是深拷貝賦值.
引用類型:值可改變,同時存放于棧區(qū)和堆區(qū),相互比較是基于在堆區(qū)內(nèi)的地址,相互賦值是淺拷貝.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/91129.html
摘要:本身也是運行在環(huán)境中的模塊,它通常會返回一個函數(shù)。這個命名規(guī)則和搜索優(yōu)先級順序在的中定義。那就等下一篇介紹吧,一篇文章有太多內(nèi)容,會讓人很乏的從入門到放棄四從入門到放棄二從入門到放棄三源代碼 此篇文章僅僅是整理自己接觸webpack的入門過程,可能有很多不正確的地方,希望大家諒解,并指出錯誤幫助改進。 對于webpack的介紹和前期對他的入門使用,我覺得官方(中文網(wǎng))已經(jīng)介紹的很簡單了...
摘要:多個窗口意味著多個全局環(huán)境,不同的全局環(huán)境擁有不同的全局對象,從而擁有不同的內(nèi)置類型構(gòu)造函數(shù)。比如,表達式會返回,因為屬性得到的僅僅是構(gòu)造函數(shù),而且是可以被手動更改的,只是返回的構(gòu)造函數(shù)的名字,它并不返回類名。 原文:ES6時代,你真的會克隆對象嗎(二) 上一篇,我們從Symbol和是否可枚舉以及屬性描述符的角度分析了ES6下怎么淺拷貝一個對象,發(fā)表在掘金和segmentfault上(...
摘要:好了,廢話不多說,馬上開講第一個機器學習的算法,算法。另外,本文題目是機器學習從入門到放棄之算法而非機器學習從入門到放棄算法這樣,因為如果是后者,某日我要棄坑就會觸發(fā)我的強迫癥,而前者并不會,哈哈哈。 談起機器學習,真是令人心生向往同時又讓人頭痛不已。 心生向往是因為機器學習在很多方面都已經(jīng)展現(xiàn)出其魅力,在人工智能的領(lǐng)域比如說AlphaGo,計算機視覺領(lǐng)域的人臉識別,車牌識別,靠近生活...
摘要:前文該系列下的前幾篇文章分別對不同的幾種異步方案原理進行解析,本文將介紹一些實際場景和一些常見的面試題。流程調(diào)度里比較常見的一種錯誤是看似串行的寫法,可以感受一下這個例子判斷以下幾種寫法的輸出結(jié)果辨別輸出順序這類題目一般出現(xiàn)在面試題里。 前文 該系列下的前幾篇文章分別對不同的幾種異步方案原理進行解析,本文將介紹一些實際場景和一些常見的面試題。(積累不太夠,后面想到再補) 正文 流程調(diào)度...
閱讀 2021·2021-11-15 11:38
閱讀 2054·2019-08-30 15:55
閱讀 2187·2019-08-30 15:52
閱讀 3173·2019-08-30 14:01
閱讀 2691·2019-08-30 12:47
閱讀 1144·2019-08-29 13:17
閱讀 1069·2019-08-26 13:55
閱讀 2637·2019-08-26 13:46