摘要:如很明顯可以看到,實(shí)際上是函數(shù)的局部變量。簡(jiǎn)單的說(shuō)就是,復(fù)制給參數(shù),在函數(shù)內(nèi)部是局部變量,無(wú)論怎么變化,都不影響的變化。
ECMAScript 變量可能包含兩種不同數(shù)據(jù)類型的值:基本類型值和引用類型值。
基本類型和引用類型的值基本類型值(String,Number,Boolean,Null,Undefined)指的是簡(jiǎn)單的數(shù)據(jù)段;引用類型值(保存在內(nèi)存中的對(duì)象)指的是那些可能由多個(gè)值構(gòu)成的對(duì)象。5種基本類型值的討論見(jiàn) JavaScript數(shù)據(jù)類型的一些注意要點(diǎn)
值得注意的是,很多語(yǔ)言中,字符串以對(duì)象的形式來(lái)表示。但在ECMAScript 中則放棄了這一點(diǎn)。
動(dòng)態(tài)的屬性:動(dòng)態(tài)地為引用類型值添加屬性。對(duì)于引用類型的值,可以為其添加、改變和刪除屬性和方法。如:
var persons = new Object(); persons.name = "Oliver"; document.write(persons.name); //"Oliver"
在上面這個(gè)例子中,變量persons 儲(chǔ)存了一個(gè)對(duì)象。persons 就是變量,name 就是屬性,“Oliver”就是賦值給persons.name 的普通字符串。最后又通過(guò)document.write 訪問(wèn)了這個(gè)name 屬性。如果對(duì)象不被銷毀或者這個(gè)屬性不被刪除,則這個(gè)屬性將一直存在。
但是,我們不能給基本類型的值添加屬性,盡管這樣做不會(huì)導(dǎo)致任何錯(cuò)誤。如:
var name = "Oliver"; name.age = 18; document.write(name.age); //undefined
所以說(shuō),只能用引用類型值動(dòng)態(tài)地添加屬性。
復(fù)制變量值復(fù)制變量值:從一個(gè)變量向另一個(gè)變量復(fù)制基本類型值和引用類型值。
復(fù)制基本類型值非常簡(jiǎn)單,如:
var x = 1; var y = x; document.write(y); //1
supereasy 在這里,復(fù)制之后,x 和y 完全獨(dú)立,互不影響。
復(fù)制引用類型值當(dāng)從一個(gè)變量向另一個(gè)變量復(fù)制引用類型的值時(shí)。與基本類型值不同的是,這個(gè)值的副本實(shí)際上是一個(gè)指針,而這個(gè)指針指向存儲(chǔ)在堆中的一個(gè)對(duì)象。如:
var persons = new Object(); persons.name = "Oliver"; var child = persons; document.write(child.name); //"Oliver"
復(fù)制操作結(jié)束后,兩個(gè)變量實(shí)際上將引用同一個(gè)對(duì)象。改變其中一個(gè)變量,就會(huì)影響另一個(gè)變量。
傳遞參數(shù)傳遞參數(shù):函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù)。實(shí)際上,就跟把值從一個(gè)變量復(fù)制到另一個(gè)變量一樣。該怎么操作怎么操作。
向參數(shù)傳遞基本類型的值(參數(shù)是按值傳遞的,復(fù)制給局部變量)向參數(shù)傳遞基本類型的值時(shí),被傳遞的值會(huì)被復(fù)制給一個(gè)局部變量。如:
function add(x){ x = x + 10; return x; } var num = 1; document.write(num); //1 var result = add(num); document.write(result); //11
很明顯可以看到,x 實(shí)際上是函數(shù)的局部變量。調(diào)用這個(gè)變量時(shí),num 作為參數(shù)被傳遞給函數(shù),這個(gè)變量的值是1。在函數(shù)內(nèi)部,x 被加上了10 但這病不影響外部的num。
簡(jiǎn)單的說(shuō)就是,num 復(fù)制給參數(shù)x,x 在函數(shù)內(nèi)部是局部變量,無(wú)論x 怎么變化,都不影響num 的變化。*
向參數(shù)傳遞引用類型的值(參數(shù)是按值傳遞的,傳遞地址)向參數(shù)傳遞引用類型的值時(shí),會(huì)把這個(gè)值在內(nèi)存中的地址復(fù)制給一個(gè)局部變量,因此在這個(gè)局部變量的變化會(huì)反映在函數(shù)的外部。如:
function set(obj){ obj.name = "Oliver"; } var persons = new Object(); set(persons); document.write(persons.name); //"Oliver"
但是
但是
但是
一定要注意的是參數(shù)不!是!按!引!用!傳!遞!的!
看下面這個(gè)例子:
function set(obj){ obj.name = "Oliver"; obj = new Object(); obj.name = "Troy" document.write(obj.name); //"Troy" } var persons = new Object(); set(persons); document.write(persons.name); //"Oliver"
上面這個(gè)說(shuō)明了當(dāng)函數(shù)內(nèi)部重寫obj 時(shí),這個(gè)變量引用的就是一個(gè)局部對(duì)象了。而這個(gè)局部對(duì)象會(huì)在函數(shù)執(zhí)行完畢后立即被銷毀??!這也是為什么函數(shù)內(nèi)部返回了obj.name 的值是"Troy";函數(shù)外部返回了obj.name 的值則是"Oliver"的原因了。
所以說(shuō),雖然局部作用域中修改的對(duì)象會(huì)在全局作用域中反映出來(lái),但仍然不能說(shuō)明參數(shù)是按引用傳遞的。
所以還是那句話,一定要注意
參數(shù)不!是!按!引!用!傳!遞!的!
檢測(cè)類型毋庸置疑,檢測(cè)基本數(shù)據(jù)類型時(shí),最佳的工具是typeof操作符。如:
var a = "abc"; var b = true; var c = 21; var d = null; var e; var f = new Object(); document.write(typeof a + "
"); //string document.write(typeof b + "
"); //boolean document.write(typeof c + "
"); //number document.write(typeof d + "
"); //object document.write(typeof e + "
"); //undefined document.write(typeof f + "
"); //object
而檢測(cè)引用類型的值時(shí),最佳的工具是instanceof操作符。如:
var array = new Array; document.write(array instanceof Array); //true; var obj = new Object(); document.write(obj instanceof Array); //false; document.write(obj instanceof Object); //true;
語(yǔ)法是:
result = variable instanceof constructor
所有引用類型的值都是Object 的實(shí)例。因此在檢測(cè)一個(gè)引用類型值和Object 構(gòu)造的函數(shù)時(shí),instanceof 操作符始終會(huì)返回true。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86171.html
摘要:垃圾收集具有自動(dòng)垃圾收集機(jī)制。管理內(nèi)存優(yōu)化內(nèi)存的最佳方式,就是為執(zhí)行中的代碼只保存必要的數(shù)據(jù)。一般適用于大多數(shù)的全局變量和全局對(duì)象的屬性。如執(zhí)行完畢后,變量被銷毀手動(dòng)解除的引用解除一個(gè)值的引用并不意味著自動(dòng)回收該值所占的內(nèi)存。 垃圾收集 JavaScript 具有自動(dòng)垃圾收集機(jī)制。 標(biāo)記清除 JavaScript 中最常用的垃圾收集方式是標(biāo)記清除。 當(dāng)變量進(jìn)入環(huán)境(如在函數(shù)中聲明一個(gè)...
摘要:模仿塊級(jí)作用域在塊級(jí)語(yǔ)句中定義的變量,實(shí)際上是包含函數(shù)中而非語(yǔ)句中創(chuàng)建的。避免對(duì)全局作用域產(chǎn)生不良影響這種方式可以通過(guò)創(chuàng)建私有作用域,避免對(duì)全局作用域產(chǎn)生不良影響。一般包括函數(shù)的參數(shù)局部變量和內(nèi)部定義的其他函數(shù)。 模仿塊級(jí)作用域 在塊級(jí)語(yǔ)句中定義的變量,實(shí)際上是包含函數(shù)中而非語(yǔ)句中創(chuàng)建的。如: function outputNumbers(x){ for (var i = 0;...
摘要:代碼約定可讀性以下地方需要進(jìn)行注釋函數(shù)和方法注釋參數(shù)代表什么,是否有返回值大段代碼描述任務(wù)的注釋復(fù)雜的算法變量和函數(shù)命名變量用名詞函數(shù)名用動(dòng)詞開(kāi)頭等返回布爾值類型的函數(shù)用等合乎邏輯不用擔(dān)心太長(zhǎng)變量類型透明化方法一初始化,如下推薦方法二匈牙利 代碼約定 可讀性 以下地方需要進(jìn)行注釋: 函數(shù)和方法:注釋參數(shù)代表什么,是否有返回值; 大段代碼:描述任務(wù)的注釋; 復(fù)雜的算法; Hack 變...
摘要:類型關(guān)于引用類型的概念引用類型引用類型的值對(duì)象是引用類型的一個(gè)實(shí)例對(duì)象是某個(gè)特定引用類型的實(shí)例新對(duì)象用操作符后跟一個(gè)構(gòu)造函數(shù)來(lái)創(chuàng)建的如代碼這行代碼創(chuàng)建了引用類型的一個(gè)新實(shí)例,然后把該實(shí)例保存在了變量中。使用的構(gòu)造函數(shù)是。 Object 類型 關(guān)于引用類型的概念: 引用類型:引用類型的值(對(duì)象)是引用類型的一個(gè)實(shí)例; 對(duì)象:是某個(gè)特定引用類型的實(shí)例; 新對(duì)象:用new 操作符后跟一個(gè)構(gòu)...
摘要:所以,全局執(zhí)行環(huán)境的變量對(duì)象始終都是作用域鏈中的最后一個(gè)對(duì)象。搜索過(guò)程從作用域鏈的最前端開(kāi)始,逐級(jí)向后回溯,直到找到標(biāo)識(shí)符為止。查詢標(biāo)識(shí)符搜索過(guò)程就是沿作用域鏈向上查詢的過(guò)程。 執(zhí)行環(huán)境 執(zhí)行環(huán)境就是環(huán)境,是js中最重要的概念。執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問(wèn)的其他數(shù)據(jù)。每個(gè)執(zhí)行環(huán)境都有一個(gè)與之相關(guān)的變量對(duì)象(我們編寫的代碼無(wú)法訪問(wèn)這個(gè)對(duì)象)。 全局執(zhí)行環(huán)境(是最外圍的執(zhí)行環(huán)境。在W...
閱讀 1704·2021-09-26 09:55
閱讀 3743·2021-09-22 15:31
閱讀 7457·2021-09-22 15:12
閱讀 2223·2021-09-22 10:02
閱讀 4696·2021-09-04 16:40
閱讀 1076·2019-08-30 15:55
閱讀 3034·2019-08-30 12:56
閱讀 1826·2019-08-30 12:44