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