成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript的數(shù)據(jù)類型(四)

didikee / 768人閱讀

摘要:目錄基本類型和引用類型檢測數(shù)據(jù)類型的方法數(shù)據(jù)類型的轉換通用庫的初步創(chuàng)建與對象的深淺拷貝小結從前面三篇文章,我們已經大致了解的基本語法中的數(shù)據(jù)類型數(shù)值型字符串布爾型對象數(shù)組函數(shù)和這篇文章將深入探討這幾種數(shù)據(jù)類型在內存中的存儲方式讀取方式和拷貝

目錄 1. 基本類型和引用類型 2. 檢測數(shù)據(jù)類型的方法 3. 數(shù)據(jù)類型的轉換 4. 通用庫的初步創(chuàng)建與對象的深淺拷貝 5. 小結

從前面三篇文章,我們已經大致了解JavaScript的基本語法中的數(shù)據(jù)類型——數(shù)值型、字符串、布爾型、對象、數(shù)組、函數(shù)、null和undefined;
這篇文章將深入探討這幾種數(shù)據(jù)類型在內存中的存儲方式、讀取方式和拷貝方式;

1.基本類型和引用類型

在之前的文章,我們了解到JavaScript中的變量根據(jù)數(shù)據(jù)的復雜程度可分為原始數(shù)據(jù)類型和復雜數(shù)據(jù)類型;
現(xiàn)在,我們將從數(shù)據(jù)內存存儲角度,將變量劃分為基本類型值和引用類型值;
基本類型值:保存在棧內存的簡單數(shù)據(jù)段,包括數(shù)值、字符串、布爾值、null和undefined;
基本類型值在賦值時,直接將值賦給變量,訪問變量即訪問值,可以直接操作保存在變量的值;

在進行基本類型值拷貝時,會在變量對象上創(chuàng)建一個新值,然后把值賦給另一個變量;因此,在改變上述代碼中給a賦b的值后,再改變a的值,將不影響b的值,兩個變量的獨立的;
引用類型值:保存在堆內存中的對象,變量保存的是一個指向內存中對象的指針;
引用類型在賦值時是將保存在堆內存的對象的地址賦給變量,訪問變量實際訪問的是變量的指針,該指針指向對象,在讀寫(增刪改)操作時操作的是實際的對象,但在拷貝時則是指針;

所有由上述代碼可知:在把a賦值給b時實際拷貝的是a的指針,當改變對象的屬性值時,a賦予的對象的屬性值也會改變,因為二者指向同一對象;
但有時候,我們希望實現(xiàn)對象的真正拷貝并且切斷引用同一對象的聯(lián)系,具體做法將會在下文具體講解;

2. 檢測數(shù)據(jù)類型的方法

要想實現(xiàn)對象的深拷貝,第一步首先要知道數(shù)據(jù)的類型,不然后續(xù)工作將無從下手;
JavaScript中提供檢測數(shù)據(jù)類型的方法大致有3種:
typeof操作符
typeof操作符能夠很好的區(qū)分基本類型值(null除外);

但對部分引用類型值就無能為力,比如它無法區(qū)分object、null和Array,此時就要借助instanceof操作符
instanceof操作符
instanceof操作符可以識別某個變量是否是某個對象的實例,借助這個功能可以進一步區(qū)分object、Array和null三者的區(qū)別;

但是,這還不足以區(qū)分object和Array,所以還需要借助第3個方法識別數(shù)據(jù)類型;
Object.prototype.toString()方法

3.數(shù)據(jù)類型轉換

數(shù)據(jù)類型轉換之前在前面的文章分散到變量部分講解了一下,這里為了文章的系統(tǒng)性,重新將數(shù)據(jù)類型轉換的方法歸納一下:

3.1 轉換為數(shù)值

任何類型數(shù)據(jù)轉換為數(shù)值有4種方法:Number()轉型函數(shù)、parseInt()parseFloat()+操作符;



上述四種方法的區(qū)別在于Number和+作用一樣可以對任何類型數(shù)據(jù)進行轉型,而parseInt和parseFloat只能對數(shù)值和字符串轉型;

3.2 轉換為字符串

轉換為字符串包括3種方法:轉型函數(shù)String(),toString()方法(null和undefined會報錯)和""(作用等同于String());

3.3轉換為布爾值

轉換為布爾值有2種方法:轉型函數(shù)Boolean()!!

4通用庫的初步建立與對象的深淺拷貝

實現(xiàn)對象的深淺拷貝,首先要識別變量的數(shù)據(jù)類型,上一節(jié)我們已經知道識別數(shù)據(jù)類型的方法,下面我們可以定義識別數(shù)據(jù)類型的函數(shù)并將其封裝在一個對象(通用庫)中;
通用庫的建立

(function(window){
  window.Util = (function(){
        // 1.判斷數(shù)據(jù)類型
            function isNumber(el){
                return typeof el === "number";
            };
            function isString(el){
                return typeof el === "string";
            }
            function isBoolean(el){
                return typeof el === "boolean";
            }
            function isObject(el){
                return Object.prototype.toString.call(el) === "[object Object]"
            };
            function isArray(el){
                return Object.prototype.toString.call(el) === "[object Array]"
            };
            function isSimpleType(el){
                return this.isNumber(el) || this.isString(el) || this.isBoolean(el)
            };
    return {
            isNumber:isNumber,
            isString:isString,
            isBoolean:isBoolean,
            isObject:isObject,
            isArray:isArray,
            isSimpleType:isSimpleType,
    }
  })();
})(window);

上述代碼首先使用數(shù)據(jù)類型判斷的方法判斷傳入的參數(shù)的數(shù)據(jù)類型;

//對象或數(shù)組的拷貝
            function shallowCopy(oldObj){
                var newObj = {};
                for(var key in oldObj){
                    if(!this.isSimpleType(oldObj[key])){
                        return "It doesn"t match shallowCopy"
                    }
                    newObj[key] = oldObj[key]
                }
                return newObj;
            };    
            function cloneObject(oldObj){
                var newObj = {};
                for(var key in oldObj){
                    if(this.isObject(oldObj[key])){
                        newObj[key] = cloneObject(oldObj[key])
                    }else if(this.isArray(oldObj[key])){
                        newObj[key] = cloneArray(oldObj[key])
                    }else if(this.isSimpleType(oldObj[key])){
                        newObj[key] = oldObj[key]
                    }
                }
                return newObj;
            };
            function cloneArray(oldArr){
                var newArr = [];
                for(var i = 0;i

上面的代碼deepClone方法將對數(shù)組或對象的屬性進行遍歷,如果發(fā)現(xiàn)屬性值是基本類型,則直接賦值,如果發(fā)現(xiàn)是引用類型則調用cloneArray或cloneObject方法,這兩個方法將繼續(xù)遍歷引用類型的屬性值,直到遞歸到屬性值是基本類型值,從而完成對象的"深拷貝";
通用庫的代碼地址將發(fā)布在【github】,以供童鞋參考;

5.小結

通過閱讀本文,我們可以知道:

變量的數(shù)據(jù)類型根據(jù)其在內存中的存儲方式,可分為基本類型值和引用類型值;

基本類型值是保存在棧內存中的簡單數(shù)據(jù)段,包括數(shù)值、字符串、布爾值、null和undefend,變量保存的是基本類型值的實際值;

引用類型值是保存在堆內存的對象,變量保存的是指向對象的指針;

判斷數(shù)據(jù)類型的方法包括typeof操作符、instanceof操作符、Object.prototype.toString()方法;

數(shù)據(jù)類型轉換的方法有轉換為數(shù)值、轉換為字符串和轉換為布爾值;

我們通過建立一個通用庫的方式,封裝對象的深淺拷貝方法;
最后,JavaScript核心知識點的基本語法部分將暫且告一段落,下一章將進入JavaScript核心知識點的標準庫部分;

參考資料

《JavaScript高級程序設計(第3版)》

《JavaScript標準參考教程》——阮一峰

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/86621.html

相關文章

  • JavaScript標準庫系列——三大包裝對象(

    摘要:目錄導語包裝對象的理解三大包裝對象的知識點小結導語包裝對象是為了彌補基本數(shù)據(jù)類型的非對象特性而產生的,對于基本類型值而言,本來是不存在屬性和方法的,但是我們可以在使用字面量創(chuàng)建字符串時,調用例如的方法,那么其內在原理究竟是什么呢閱讀完本篇文 目錄 導語 1. 包裝對象的理解 2. 三大包裝對象的知識點 3. 小結 導語 包裝對象是為了彌補基本數(shù)據(jù)類型的非對象特性而產生的,對于基本類型...

    sean 評論0 收藏0
  • JavaScript高級程序設計(第3版)》——變量、作用域和內存問題(

    摘要:執(zhí)行環(huán)境的類型有兩種全局全局執(zhí)行環(huán)境局部函數(shù)執(zhí)行環(huán)境每個環(huán)境都可以向上搜索作用域鏈,以查詢變量和函數(shù)名但任何環(huán)境都不能通過向下搜索作用域鏈而進入另一個執(zhí)行環(huán)境。內部可通過作用域鏈訪問外部,外部不能訪問內部。 變量、作用域和內存問題 ECMAScript 數(shù)據(jù)類型 基本類型(5種): Undefined,Null,Boolean,Number,String typeof() 檢測...

    YacaToy 評論0 收藏0
  • JavaScript深淺拷貝

    摘要:實際上,是禁止這樣做的。傳值和傳址基本數(shù)據(jù)類型賦值基本數(shù)據(jù)類型的賦值是在內存中新開辟一段棧內存,然后再把再將值賦值到新的棧中。結果見輸出,可以看出來,無論是修改賦值得到的對象和淺拷貝得到的都會改變原始數(shù)據(jù)。 存儲問題:深拷貝和淺拷貝的主要區(qū)別:在內存中的存儲類型(堆和棧)不同堆:動態(tài)分配的內存,大小不定也不會自動釋放棧:自動分配的內存,由系統(tǒng)自動釋放數(shù)據(jù)類型: 基本數(shù)據(jù)類型: jav...

    zhjx922 評論0 收藏0
  • 使用JavaScript隱式類型轉換輸出"nb"

    摘要:本文將介紹一段使用隱式類型轉換輸出的代碼,并講解具體的轉換過程。代碼轉換過程我們分四部分講解具體的轉換過程,一個空數(shù)組,緊跟在數(shù)組后面的的語義應該是表示屬性操作,類似于中的作用,而不是表示數(shù)組。 本文將介紹一段使用JavaScript隱式類型轉換輸出nb的代碼,并講解具體的轉換過程。 預備知識 請先閱讀文章ECMAScript7規(guī)范中的ToPrimitive抽象操作。 代碼 ([][[...

    tomlingtm 評論0 收藏0
  • JavaScript紅寶書筆記()---變量、作用域和內存問題

    摘要:在操作對象時,實際上是在操作對象的引用而不是實際的對象。為此,引用類型的值是按引用訪問的。標記清除是目前主流的垃圾收集算法,這種算法的思想是給當前不使用的值加上標記,然后再回收其內存 1.在操作對象時,實際上是在操作對象的引用而不是實際的對象。為此,引用類型的值是按引用訪問的。 2.當從一個變量向另一個變量復制引用類型的值時,兩個變量實際上將引用同一個對象,因此,改變其中一個變量,就會...

    imtianx 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<