摘要:在將一個(gè)值賦值給變量時(shí),解析器會確定值的類型。添加屬性變量的值是復(fù)雜數(shù)據(jù)類型時(shí),可以簡單的為其添加屬性。賦值變量的值從一個(gè)變量向另一個(gè)變量復(fù)制值時(shí),會為新的變量分配位置,然后把變量的值復(fù)制到該位置上。
ECMAScript 的變量是松散類型的,也就是說可以保存任何類型的數(shù)據(jù)。數(shù)據(jù)的類型分為簡單數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型。簡單數(shù)據(jù)類型有: Undefined、Null、Boolean、Number和 String;復(fù)雜數(shù)據(jù)類型只有一種,就是Object。在將一個(gè)值賦值給變量時(shí),解析器會確定值的類型。如果是簡單類型,直接保存在變量中,如果是復(fù)雜類型,則把值保存在內(nèi)存中,而把值的引用保存在變量中。也就是說變量的值有兩種:簡單的數(shù)據(jù)類型的值或者復(fù)雜數(shù)據(jù)類型的引用。因此,在操作變量時(shí),就會有所不同。
1、添加屬性
變量的值是復(fù)雜數(shù)據(jù)類型時(shí),可以簡單的為其添加屬性。這個(gè)很容易理解,而當(dāng)變量的值是某些簡單的數(shù)據(jù)類型時(shí),為其添加屬性也不會報(bào)錯(cuò),但之后卻不能訪問,如下:
var person= "xiaoming"; name.age = 27; alert(name.age); //undefined
這是因?yàn)镴avaScript引擎在處理添加屬性的代碼時(shí),會在內(nèi)部臨時(shí)創(chuàng)建一個(gè)對應(yīng)包裝類型(這里是String類型)的臨時(shí)對象, 并把對基本類型的操作代理到對這個(gè)臨時(shí)對象身上,但在操作完成之后,臨時(shí)對象就扔掉了,下次訪問時(shí),重新建立新的臨時(shí)對象,添加的屬性并不會 保存。有時(shí),在代碼中直接調(diào)用基本數(shù)據(jù)類型的方法的方法也是同樣的道理。因此,只能給復(fù)雜數(shù)據(jù)類型的值添加屬性。
2、賦值變量的值
從一個(gè)變量向另一個(gè)變量復(fù)制值時(shí),會為新的變量分配位置,然后把變量的值復(fù)制到該位置上。不管變量的中保存的是基本數(shù)據(jù)類型的值,還是復(fù)雜數(shù)據(jù)類型的引用,都是直接把變量中保存的值直接賦值并保存到新的位置上面。
簡單的數(shù)據(jù)類型很好理解,復(fù)雜的數(shù)據(jù)類型可以參照下圖:
變量obj2復(fù)制的是obj1中保存的對象的引用,復(fù)制之后,obj1和obj2中分別保存一個(gè)指向該對象的引用。
3、傳遞參數(shù)
ECMAScript 中所有函數(shù)的參數(shù)都是按值傳遞的。也就是說在傳遞參數(shù)時(shí),實(shí)際上就是把變量中保存的值復(fù)制了一遍,保存在對應(yīng)的參數(shù)中,從而變成了函數(shù)內(nèi)部的一個(gè)變量。這時(shí),需要注意的一點(diǎn)時(shí),對于簡單的數(shù)據(jù)類型,新的變量(參數(shù))和外部的變量已經(jīng)沒有聯(lián)系了。而對于復(fù)雜數(shù)據(jù)類型,因?yàn)閮蓚€(gè)變量中保存的都是對象的引用,因此兩個(gè)變量還是僅僅聯(lián)系在一起的,如下:
var a = 3; var o = { name:"xiaoming" }; function fn(obj, num){ num += 10; o.name = "hh"; return num; } var res = fn(); alert(res); //13 alert(a); //3 alert(o.name); //"hh"
4、檢測類型
正如開頭說的變量是松散的,為了確保代碼可以正確的執(zhí)行,很多時(shí)候都需要檢測變量值的類型。變量的值是簡單的數(shù)據(jù)類型時(shí)(null除外),只需要使用typeof操作符,就可以很簡單的檢測出來。但變量的值是復(fù)雜數(shù)據(jù)類型的引用時(shí),就有點(diǎn)麻煩了,使用typeof始終只會返回‘object’。如果知識簡單的檢測,可以使用 instanceof 操作符。使用如下:
res = obj instanceof constructor
只要變量是給定復(fù)雜數(shù)據(jù)類型的實(shí)例,那么instanceof 操作符就會返回 true。需要說的一點(diǎn)是, 所有復(fù)雜數(shù)據(jù)類型的值都是 Object 的實(shí)例,使用這個(gè)操作符檢測是不是Object構(gòu)造函數(shù)的實(shí)例時(shí),都會返回true。
使用這種方式檢測在大多數(shù)情況下都是沒有問題的,但當(dāng)頁面的中存在嵌套的框架或者在一些特殊的瀏覽器中就會出現(xiàn)問題。例如,在一個(gè)frame中定義了一個(gè)數(shù)組arr,而在最外層的window環(huán)境中檢測,就會返回false。為了確保檢測結(jié)果的正確,可以使用Object原聲的toString方法,對于任何的復(fù)雜數(shù)據(jù)類型,這個(gè)方法都會返回“ [object NativeConstructorName]”格式的字符串,例如:
Object.prototype.toString.call([]) //"[object Array]"
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/82093.html
摘要:當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行時(shí),會創(chuàng)建變量對象的一個(gè)作用域鏈,作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。作用域鏈的下一個(gè)變量對象則來自下一個(gè)包含環(huán)境。 前言 JavaScript中變量是松散類型,這樣它只在特定的時(shí)間內(nèi)用于保存一個(gè)特定的值。由于不存在定義某個(gè)變量必須要保存何種數(shù)據(jù)類型的規(guī)則,變量的值和其數(shù)據(jù)類型可以在腳本的生命周期內(nèi)改變。 1. 基本類型和引用類型的...
摘要:變量可見性問題的關(guān)鍵字保證了多個(gè)線程對變量值變化的可見性。只要一個(gè)線程需要首先讀取一個(gè)變量的值,基于這個(gè)值生成一個(gè)新值,則一個(gè)關(guān)鍵字不足以保證正確的可見性。 Java的volatile關(guān)鍵字用于標(biāo)記一個(gè)Java變量為在主存中存儲。更確切的說,對volatile變量的讀取會從計(jì)算機(jī)的主存中讀取,而不是從CPU緩存中讀取,對volatile變量的寫入會寫入到主存中,而不只是寫入到CPU緩存...
摘要:中的變量是松散類型的即它在不同的時(shí)期可以有不同類型的值這也是最強(qiáng)大的的特性之一基本類型和引用類型的值的值類型有兩種基本類型引用類型。 ECMAscript中的變量是松散類型的,即它在不同的時(shí)期可以有不同類型的值,這也是ECMAscript最強(qiáng)大的的特性之一. 基本類型和引用類型的值 javascript的值類型有兩種:基本類型 引用類型?;绢愋偷闹凳侵傅暮唵蔚臄?shù)據(jù)段,基本類型有五種,...
摘要:將與當(dāng)前線程建立一對一關(guān)系的值移除。為了讓方法里的操作具有原子性,也就是在一個(gè)線程執(zhí)行這一系列操作的同時(shí)禁止其他線程執(zhí)行這些操作,提出了鎖的概念。 上頭一直在說以線程為基礎(chǔ)的并發(fā)編程的好處了,什么提高處理器利用率啦,簡化編程模型啦。但是磚家們還是認(rèn)為并發(fā)編程是程序開發(fā)中最不可捉摸、最詭異、最扯犢子、最麻煩、最惡心、最心煩、最容易出錯(cuò)、最不符合社會主義核心價(jià)值觀的一個(gè)部分~ 造成這么多最...
摘要:語句中的塊語句對來說,將會指定對象添加到作用域鏈中。在嚴(yán)格模式下,初始化未經(jīng)聲明的變量會導(dǎo)致錯(cuò)誤。查詢標(biāo)識符搜索過程從作用域鏈的前端開始,向上逐級查詢與給定名字匹配的標(biāo)識符。 本文記錄了我在學(xué)習(xí)前端上的筆記,方便以后的復(fù)習(xí)和鞏固。 4.1基本類型和引用類型的值 ECMAScript變量可能包含兩種不同數(shù)據(jù)類型的值:基本類型值和引用類型值。基本類型指的是簡單的數(shù)據(jù)段,而引用類型值指那些可...
閱讀 3590·2019-08-30 15:55
閱讀 1387·2019-08-29 16:20
閱讀 3669·2019-08-29 12:42
閱讀 2675·2019-08-26 10:35
閱讀 1025·2019-08-26 10:23
閱讀 3422·2019-08-23 18:32
閱讀 914·2019-08-23 18:32
閱讀 2906·2019-08-23 14:55