成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript之按值傳遞

xiangchaobin / 2930人閱讀

摘要:中所有函數(shù)的參數(shù)都是按值傳遞的?;绢?lèi)型本身是按值傳遞,具有不可變性,對(duì)基本類(lèi)型的修改,實(shí)質(zhì)上都是在棧內(nèi)存中創(chuàng)建了新的值。中把這種拷貝也認(rèn)為是按值傳遞。

本文共 1200 字,讀完只需 5 分鐘
概述

參數(shù)的傳遞分為按值傳遞按引用傳遞,而 JavaScript 中參數(shù)的傳遞只有按值傳遞

ECMAScript 中所有函數(shù)的參數(shù)都是按值傳遞的。

所謂按值傳遞就是:

把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù),就和把值從一個(gè)變量復(fù)制到另一個(gè)變量一樣。  -- 《JavaScript 高級(jí)程序設(shè)計(jì)》

我們知道 JS 中,既有基本數(shù)據(jù)類(lèi)型又有引用數(shù)據(jù)類(lèi)型,那么二者的按值傳遞有什么樣的區(qū)別呢?

先給結(jié)論

在向參數(shù)傳遞基本數(shù)據(jù)類(lèi)型時(shí),被傳遞的值會(huì)被復(fù)制給一個(gè)局部變量(arguments 類(lèi)數(shù)組對(duì)象中的一個(gè)元素)。在向參數(shù)傳遞引用數(shù)據(jù)類(lèi)型時(shí),會(huì)把這個(gè)值的內(nèi)存地址賦給一個(gè)局部變量。
一、數(shù)據(jù)類(lèi)型

在 JS 中,數(shù)據(jù)類(lèi)型分為基本類(lèi)型和引用類(lèi)型。

其中基本類(lèi)型包括:number, string, boolean, undefined, null, Symbol(es 6 新增)。基本類(lèi)型的值是保存在棧內(nèi)存當(dāng)中的。

基本數(shù)據(jù)類(lèi)型的值本身是不會(huì)改變的。

let num1 = 5;
let num2 = num1;

將保存著原始值的變量 num1 賦值給 num2 后,會(huì)將原始值 num1 的副本賦值給新變量 num2, 此后這兩個(gè)變量是完全獨(dú)立的,他們只是擁有相同的值而已,是完全獨(dú)立的拷貝,互不干涉。

引用數(shù)據(jù)類(lèi)型包括:Function, Array, Object 等等除了基本數(shù)據(jù)類(lèi)型之外的數(shù)據(jù)。引用數(shù)據(jù)類(lèi)型是保存在堆內(nèi)存當(dāng)中的。

JS 不允許直接操作對(duì)象的內(nèi)存空間,所以引用數(shù)據(jù)類(lèi)型是通過(guò)存儲(chǔ)在變量處的值,也就是一個(gè)指針(point),指向存儲(chǔ)對(duì)象的內(nèi)存地址,從而進(jìn)行訪(fǎng)問(wèn)的。

let obj1 = new Object();

var obj2 = obj1;

當(dāng)把引用類(lèi)型的變量 obj1 賦給另一個(gè)變量 obj2 后,obj2 接受的其實(shí)是引用類(lèi)型數(shù)據(jù)的內(nèi)存地址指針。所以,判斷兩個(gè)引用類(lèi)型是否相等,其實(shí)比較的是內(nèi)存地址是否相等。

二、按值傳遞
var num = 1;
function foo(param) {
    param = 2;
}
foo(num);
console.log(num); // num 值仍為1, 并沒(méi)有受 param = 2 賦值影響

以上代碼:

按值傳遞每次傳遞參數(shù)時(shí),都會(huì)拷貝一份副本到函數(shù)內(nèi)部,拷貝前后的兩個(gè)值互不影響。

二、“按引用傳遞”
var obj = {
    num: 1
};

function foo(o) {
    o.num = 2;
    console.log(obj.num);  // 2
}

foo(obj);
console.log(obj.num); // 2

以上代碼,foo 函數(shù)把 obj 對(duì)象作為實(shí)參,執(zhí)行完畢后把 obj 對(duì)象的 num 屬性給改變了,說(shuō)明參數(shù) o 對(duì)象 和 外部變量 obj 對(duì)象是同一個(gè)對(duì)象。說(shuō)好的按值傳遞呢,怎么還是把原來(lái)的對(duì)象給改變了呢。

三、按共享傳遞

再看下面這段代碼:

var obj = {
    num: 1
};

function foo(o) {
    o = 100;
}

foo(obj);
console.log(obj.num);  // 1

如果是按引用傳遞的話(huà),按理來(lái)說(shuō) obj 對(duì)象會(huì)被改變會(huì) 100 才對(duì)。

準(zhǔn)確的說(shuō),JS中的基本類(lèi)型按值傳遞,對(duì)象類(lèi)型按共享傳遞的(call by sharing,也叫按對(duì)象傳遞、按對(duì)象共享傳遞)

在共享傳遞中對(duì)函數(shù)形參的賦值,不會(huì)影響實(shí)參本身的值。

所以,形參引用的對(duì)象是同一個(gè),由于對(duì)象是可變的(mutable),修改形參中對(duì)象的屬性值,會(huì)影響到原本對(duì)象的屬性值。

按引用傳遞是傳遞對(duì)象的引用,而按共享傳遞是傳遞對(duì)象的拷貝的副本,所以副本本身無(wú)法直接修改。而拷貝副本也是一種拷貝,所以也被認(rèn)為是按值傳遞。

基本類(lèi)型本身是按值傳遞,具有不可變性(immutable),對(duì)基本類(lèi)型的修改,實(shí)質(zhì)上都是在棧內(nèi)存中創(chuàng)建了新的值。

復(fù)習(xí)鞏固:

var obj = { num : 0 };
obj.num = 100;
var o = obj;
o.num = 1;
obj.num; // 1, 被修改
o = true;
obj.num; // 1,  o 是對(duì)象的一個(gè)拷貝,對(duì) o 本身的修改,不會(huì)改變 obj 對(duì)象本身的值。
總結(jié)

JavaScript 中參數(shù)的傳遞只有按值傳遞,而對(duì)于引用類(lèi)型的傳遞,是一種共享傳遞,傳遞的是數(shù)據(jù)類(lèi)型的拷貝副本,雖然引用的是同一個(gè)對(duì)象,但是無(wú)法通過(guò)改變形參來(lái)改變實(shí)參本身。

JS 中把這種拷貝也認(rèn)為是按值傳遞。

歡迎關(guān)注我的個(gè)人公眾號(hào)“謝南波”,專(zhuān)注分享原創(chuàng)文章。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/98641.html

相關(guān)文章

  • JS專(zhuān)題之?dāng)?shù)組去重

    摘要:將元素作為對(duì)象的鍵,默認(rèn)鍵對(duì)應(yīng)的值為如果對(duì)象中沒(méi)有這個(gè)鍵,則將這個(gè)元素放入結(jié)果數(shù)組中去。 前言 數(shù)組去重在日常開(kāi)發(fā)中的使用頻率還是較高的,也是網(wǎng)上隨便一抓一大把的話(huà)題,所以,我寫(xiě)這篇文章目的在于歸納和總結(jié),既然很多人都在提的數(shù)組去重,自己到底了解多少呢。又或者是如果自己在開(kāi)發(fā)中遇到了去重的需求,自己能想到更好的解決方案嗎。 這次我們來(lái)理一理怎么做數(shù)組去重才能做得最合適,既要考慮兼容性,...

    only_do 評(píng)論0 收藏0
  • 小tips:JS之按位取反,語(yǔ)法標(biāo)簽label,正則表達(dá)式中replace的0,1是什么?

    摘要:按位取反按位取反運(yùn)算符,對(duì)一個(gè)表達(dá)式執(zhí)行位非求非運(yùn)算。如果語(yǔ)句后面不使用標(biāo)簽,則只能進(jìn)入下一輪的內(nèi)層循環(huán)。語(yǔ)句用于立即終止本輪循環(huán),返回循環(huán)結(jié)構(gòu)的頭部,開(kāi)始下一輪循環(huán)。代表的是分組,即小括號(hào)里面的小正則捕獲到的內(nèi)容。 JS按位取反 Javascript 按位取反運(yùn)算符 (~) ,對(duì)一個(gè)表達(dá)式執(zhí)行位非(求非)運(yùn)算。如 ~1 = -2; ~2 = -3;來(lái)看看~1的計(jì)算步驟: 將1(這里...

    n7then 評(píng)論0 收藏0
  • JavaScript深入之參數(shù)按值傳遞

    摘要:深入系列第九篇,除了按值傳遞引用傳遞,還有第三種傳遞方式按共享傳遞定義在高級(jí)程序設(shè)計(jì)第三版,講到傳遞參數(shù)中所有函數(shù)的參數(shù)都是按值傳遞的。 JavaScript深入系列第九篇,除了按值傳遞、引用傳遞,還有第三種傳遞方式 —— 按共享傳遞 定義 在《JavaScript高級(jí)程序設(shè)計(jì)》第三版 4.1.3,講到傳遞參數(shù): ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的。 什么是按值傳遞呢?...

    DataPipeline 評(píng)論0 收藏0
  • JavaScript中的求值策略

    摘要:關(guān)于的求值策略,問(wèn)中函數(shù)的參數(shù)傳遞是按值傳遞還是按引用傳遞回答很經(jīng)典。所以不能說(shuō)中函數(shù)的參數(shù)傳遞嚴(yán)格按值傳遞或按引入傳遞。中還采用一種參數(shù)傳遞策略,叫按共享傳遞。中參數(shù)是必須先求值再作為實(shí)參傳入函數(shù)的。參考求值策略中函數(shù)參數(shù)的默認(rèn)值 最近在研究 lambda 演算中的 η-變換 在 JavaScript 中的應(yīng)用,偶然在 stackoverflow 上看到一個(gè)比較有意思的問(wèn)題。關(guān)于 J...

    MrZONT 評(píng)論0 收藏0
  • JavaScript參數(shù)按值傳遞的理解

    摘要:棧內(nèi)存與堆內(nèi)存簡(jiǎn)單類(lèi)型的值,它們的值直接存儲(chǔ)在變量訪(fǎng)問(wèn)的位置,這是因?yàn)檫@些簡(jiǎn)單類(lèi)型占據(jù)的空間是固定的,所以可將他們存儲(chǔ)在較小的內(nèi)存區(qū)域棧中。 看到一個(gè)這樣的問(wèn)題 function setName(obj) { obj.name = Tom; obj = new Object(); obj.name = Greg ; } var person = new Object();...

    galois 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<