簡體   English   中英

帶有可變數量參數的Javascript函數-更改其值-然后返回

[英]Javascript function that takes variable number of arguments - changes their value - and then returns them

我是Java語言(和一般編程領域)的新手,並且一直在尋找一種使用Javascript函數更改任意數量參數的值的方法。

答案( JavaScript函數變量的數量可變 )非常有用。 我能夠使用它來創建所需的兩個功能,但是我在使用第三個功能時遇到了麻煩。

基本上,我想將可變數量的對象(原始或更復雜的對象)傳遞給函數,並讓該函數更改每個對象的值。

var pants = true;
var house = true;
var hair = {/* lots of stuff */};

var onFire = function() {
        for (var i = 0; i < arguments.length; i++) {
            arguments[i] = false;
        }
};

onFire(pants, house, hair);

控制台輸出:

>pants;
 true

>house;
 true

>hair;
 Object

我如何公式化此函數,所以結果是:

>pants;
 false

>house;
 false

>hair;
 false

任何幫助將不勝感激!

編輯:

為了澄清問題-我試圖創建一個可重用的幫助器函數,該函數將傳入的任何對象的值更改為false而不是鍵入:

var a1 = false;
var a2 = false;
...
var a+n = false;

如果我使用mathec的方法-是否可以“解析” object以便其屬性覆蓋相同名稱的全局變量,還是我每次都明確地鍵入它?

var object = {
    pants: {/* lots of stuff */},
    house: {/* lots of stuff */},
    hair: {/* lots of stuff */}
};

function modifyObject(obj) {
    obj.pants = false;
    obj.house = false;
    obj.hair = false;
}

function someMagic(object){
    // wand waves...
    // rabbit exits hat....
}

控制台輸出:

>pants;
 false

>house;
 false

>hair;
 false 

當您在JavaScript中傳遞變量時,如果它是一個對象,則傳遞的是對值的引用的副本,但是如果它是基元(如真/假),則是在復制實際值。 這基本上意味着,如果傳入一個對象並修改該對象的屬性之一,則將修改原始對象。 但是,如果傳入諸如true / false之類的原語,則只會修改副本,而不是原始值。 因此,如果您的目標是修改原始值,則一種選擇是將這些值存儲在對象中,然后傳遞給該對象。 例如:

var object = {
    pants: true,
    house: true,
    hair: {}
};

function modifyObject(obj) {
    obj.pants = true;
    obj.house = true;
    obj.hair = true;
}

如果要修改任意數量的參數,請記住,如果傳遞的是true / false,則將復制這些值。 因此,如果您在函數中更改它們,則不會修改原始值。

記住這一點的一種快速方法是,如果您曾經傳遞對象或數組,則是在修改實際的對象。 除此之外,您正在修改副本。

編輯

因此,按字面意義解釋您要執行的操作,可以這樣編寫:

var a = true,
    b = true;

/* pass in variable names */
function makeFalse() {
   var i, len;

   for (i = 0, len = arguments.length; i < len; ++i) {
     window[arguments[i]] = false;
   }
 }

 makeFalse("a", "b");

但我想不出這樣做的充分理由:-)。 我將使用配置對象存儲標志和狀態變量,而不是全局變量。

不幸的是,這不是直接可能的。

Javascript是一種按值傳遞的語言,對於對象類型,它是按引用傳遞值的(至少就是我看過它所引用的方式)

JavaScript是按引用傳遞還是按值傳遞語言?

非常深入,特別是https://stackoverflow.com/a/3638034/1093982有一個很好的答案。

這是一個jsfiddle,展示了上述答案中的示例:

http://jsfiddle.net/hjPHJ/

請注意,分配給參數的任何內容如何包含在上述范圍內。

您可以嘗試JavaScript的typeof()函數,該函數應返回“對象”,然后在代碼中對其進行不同的處理。 至於更改對象的值,我認為您實際上是想更改屬性的值,但是我不確定我是否足夠理解您的問題。

要更改對象屬性,您可以執行以下操作。

hair.color = 'red';

如果要取消設置對象,可以執行此操作。

delete window.some_var; 

Javascript通過值將每個參數作為引用傳遞,因此,當您更改傳入的引用的值時,它將修改復制的值。

但是,它確實還有其他功能非常強大,那就是閉包。 在您的示例中, onFire已經可以通過封閉范圍訪問pantshousehair ,並可以直接對其進行修改。

當您使用javascript調用函數時,您正在傳遞值,而不是對原始對象的引用。 您可以通過兩種方法來執行所需的操作,但不能直接通過將每個值傳遞給函數來進行更改。

首先,您可以傳遞一個數組:

function onFire(arr) {
    for (var i = 0; i < arr.length; i++) {
        arr[i] = false;
    }
}

arr = [true, true, {}];
onFire(arr); // arr[0] through arr[2] are now false

另一個方法是傳遞一個對象,該對象的屬性可以修改,只是不能更改作為參數傳遞的變量的值:

function onFire(obj) {
    obj.pants = false;
    obj.house = false;
    obj.hair = false;
}

onFire( { pants: true, house: true, hair: { } } );
// obj.pants, obj.house and obj.hair are now false

這些都不能滿足您的要求,但是如果我知道做您要問的原因,可能會有更好的方法...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM