2016-06-08 24 views
7

如果我有這樣的ES6函數聲明和調用:ES6默認值在function.arguments中不可用?

function myFunction (arg1, arg2 = "bob") { 
    console.log("arguments", arguments); 
} 

myFunction(1); 

...的console.log()聲明只顯示一個以「1」的值的說法。 「bob」無處可見。這是預期的和/或期望的行爲?我期望默認值將在arguments對象中可用。如果沒有,是否有辦法以其他方式動態獲取所有參數+默認值?

在此先感謝!

+0

我我的答案更新,只是爲了好玩......看看。 –

回答

9

是的,這是預期的和期望的。 arguments對象是傳遞給函數的值的列表,沒有別的。

它不是與參數變量(即被賦予默認值)不相干的鏈接,就像它處於馬虎模式一樣。

有沒有辦法以其他方式動態獲取所有參數+默認值?

不需要。您有什麼參數以及它們是否具有默認初始值是靜態的,您不需要在此動態執行任何操作。你可以爲你的示例功能做Object.assign([], arguments, [arg1, arg2])

+0

謝謝。那麼這是否意味着沒有辦法獲得「傳遞參數和默認參數未被傳遞」的對象? – hairbo

+0

'Object.assign'解決方案很好 - 我正在設想檢查數組的長度和拼接等來處理這個問題。 –

+0

@JamesThorpe:這裏的簡單選擇是'var args = Array.from(arguments); args [1] = arg2;' – Bergi

1

正如你現在所知,沒有本地方法來獲得「傳遞參數和默認參數不傳遞」。但有一種變通方法:

此功能(我發現here)獲取給定函數的所有參數:

function getArgs(func) { 
    var args = func.toString().match(/function\s.*?\(([^)]*)\)/)[1]; 
    return args.split(',').map(function(arg) { 
    return arg.replace(/\/\*.*\*\//, '').trim(); 
}).filter(function(arg) { 
    return arg; 
}); 
}; 

因此,結合你的函數myFunctionarguments這個功能,我們可以得到一個有你想要的數組:

function myFunction (arg1, arg2 = "bob") { 
    var thisArguments = arguments; 
    console.log(getArgs(myFunction, thisArguments)); 
}; 

function getArgs(func, argums) { 
    var args = func.toString().match(/function\s.*?\(([^)]*)\)/)[1]; 
    var argsArray = args.split(',').map(function(arg) { 
     return arg.replace(/\/\*.*\*\//, '').trim(); 
    }).filter(function(arg) { 
     return arg; 
    }); 
    for(var i = 0; i < argsArray.length; i++){ 
     argsArray[i] += " (default)"; 
    } 
    var defaults = argsArray.slice(argums.length); 
    argums = Array.prototype.slice.call(argums); 
    return argums.concat(defaults); 
}; 

現在,我們可以看到在控制檯上的信息打電話myFunction

1.傳遞比參數多的參數

這將只返回參數。

myFunction("foo", "bar", "baz"); 
//returns: ["foo", "bar", "baz"] 

2.傳遞少參數比參數

將返回的參數,其餘參數爲默認值,只要你想(我加了「默認」每個字符串)。

myFunction("foo"); 
//returns ["foo", "arg2 = "bob" (default)"] 

3傳遞任何參數

這將返回所有的參數。

myFunction(); 
//returns ["arg1 (default)", "arg2 = "bob" (default)"] 

這是小提琴:https://jsfiddle.net/gerardofurtado/25jxrkm8/1/

+1

這很有趣。謝謝! – hairbo

+0

也有趣的更新,雖然它看起來結果沒有變量的實際值的可執行格式,對嗎? – hairbo