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