【JS】JavaScript中的參數傳遞

来源:http://www.cnblogs.com/BoatGina/archive/2017/02/17/6409829.html
-Advertisement-
Play Games

ECMAScript中所有函數的參數都是按值傳遞的,簡單講就是函數外部的值 複製給函數內部的參數,就和把值從一個變數複製到另一個變數一樣。切記訪問變數有按值訪問和按引用訪問,而參數只能按值傳遞。 在向參數傳遞基本類型的值時,被傳遞的值會被覆制給一個局部變數(可以把ECMAScript函數中的參數想象 ...


  ECMAScript中所有函數的參數都是按值傳遞的,簡單講就是函數外部的值 複製給函數內部的參數,就和把值從一個變數複製到另一個變數一樣。切記訪問變數有按值訪問和按引用訪問,而參數只能按值傳遞。

       在向參數傳遞基本類型的值時,被傳遞的值會被覆制給一個局部變數(可以把ECMAScript函數中的參數想象成局部變數);向參數傳遞引用類型的值時,會把這個值在記憶體中的地址複製給一個局部變數。

       實例1:

// 參數是基本類型的值 
function add(n){
	n += 1;
	return n;
}

var num = 2;
var result = add(num);
alert(num);  // 2
alert(result);  // 3

  

  在函數內,參數n的值被加上1,但這並不會影響函數外的num變數,參數n與變數num僅僅是具有相同值,但互不相識。如果是按引用傳遞,則變數num的值將變為3.

 

       實例2:

// 參數是對象
function setName(obj){
	obj.name = "123";
}

var p = new Object();
setName(p);
alert(p.name);  // "123"

  

這裡創建了一個對象,並保存在變數p中,當這個對象被傳遞到setName()函數中之後就被覆制給了obj。在函數內,obj和p引用的是同一個對象。也可以說即使這個對象是按值傳遞的,obj也會按引用來訪問同一個對象。所以在函數內為obj添加name屬性後,函數外的p會反映出來,這裡p指向的對象在堆記憶體中只有一個,並且是全局對象。

       很多錯誤地認為在局部作用域中修改的對象會在全局作用域中反映出來,就說明是按引用傳遞。為了證明上面例子是按值傳遞,再看下麵的實例3:

function setName(obj){
	obj.name = "123";
	obj = new Object();  // obj的值變為堆記憶體中一個新的地址,但o變數的值並不受影響
	obj.name = "321";
}

var p = new Object();
setName(p);
alert(p.name);  // "123"

  

這裡與實例2中不同的是給obj重新定義了一個對象,並重新定義了name屬性。如果p是按引用傳遞的,那麼p就會自動被修改為指向name屬性值為“321”的新對象,但實際訪問p.name時,值仍是“123”。這就說明雖然在函數內修改了參數的值,但原始變數的引用不會受影響,保持不變。其實當參數是對象時,按值傳遞時傳遞的就是對象在堆記憶體中的地址  另:當在函數內部重寫obj時,這個變數引用的就是一個局部對象了,而這個局部對象在函數執行完後立即被銷毀。

 

       在Java中也類似,以下是簡單的實例:

public class Demo14 {
	public static void main(String[] args) throws Exception{
		int num = 2;
		int result = add(num);
		System.out.println(num);  // 2
		System.out.println(result);  // 3
		
		Obj o = new Obj();
		setObjName(o);
		System.out.println(o.getName());  // 123
		
	}
	
	public static int add(int n){
		n += 1;
		return n;
	}
	
	public static void setObjName(Obj obj){
		obj.setName("123");
		
		obj = new Obj();  // obj的值變為堆記憶體中一個新的地址,但o變數的值並不受影響
		obj.setName("321");
	}
	
}

class Obj{
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DOM事件模型 在0級DOM事件模型中,它只是簡單的執行你為它綁定的事件,比如你為某個元素添加了一個onclick事件,當事件觸發時,它只是去調用我們綁定的那個方法,不再做其他的操作。 在2級DOM事件模型中,就比較複雜一些,它將不再是單純的調用一下自身綁定的事件就完事了,它還擁有機會去處理它的祖先 ...
  • 在發送簡訊息驗證碼的時候要用到js設置時間倒序問題:有時候這種常規寫法會導致js失效,試了很多方法才找到問題所在,可能是因為js版本過低導致。 解決方法: jquery代碼:必須用input設置value值,以便利用jquery更改value值 ...
  • 作為一名準前端開發工程師,必須要對http基礎知識有一定的瞭解,可是想學習HTTP相關的知識,發現國內只有兩本相關的圖書,《HTTP權威指南》和《圖解http》,所有的書但凡帶上權威指南,必將是聖經級別的圖書,我在學校圖書館借了一本,600多頁的磚頭書,由於基礎太過薄弱,根本讀不下去,於是轉向了《圖 ...
  • 本節內容我們繼續探討關於ES2015的一些新的內容,Object.assign函數的使用,使用該函數我們可以快速的複製一個或者多個對象到目標對象中,本文內容涉及es6,es7相關的對象複製的內容,以及一些es5的替代方案的介紹。 函數原型 首先看一下函數的定義: 函數參數為一個目標對象(該對象作為最 ...
  • 什麼是babel? babel是一個強大的多用途js編譯器 點擊進入 "官網" 安裝babel babel配置文件 通過.babelrc來表示 命令行的簡單使用 我們可以通過 o ( out file) 參數來編譯一個文件 如果我們想編譯整個目錄 d ( out dir)參數 預設 現在有一段es6 ...
  • 官網鏈接:http://echarts.baidu.com/index.html 官網的demo,api都很詳細;我就分享下我的學習步驟 首先定義一個顯示圖標的區域: <div id="main1" style="width: 600px;height:400px;"></div> js代碼先貼上: ...
  • HTML: CSS: JS: 步驟: 1、引入zTree相關js、css文件(以我自己的項目為例:jquery.ztree.all-3.5.min.js,zTreeStyle.css); 2、將上面給出的右鍵菜單插件另存為js文件引入頁面(以我自己的項目為例:bsContextmenu.js) 3、 ...
  • Vue2.0 + MuseUI 的 cnodejs.org 社區WebApp,包含全部模塊功能 非常適合初學Vue2.0之後,自己實踐的第一個項目 源碼github地址sourceCode內附線上demo,歡迎大家star ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...