如果我有一個函數問一個不存在的javascript參數有風險嗎?
foo()
,我不帶任何參數的大部分時間打電話,但在特殊情況下,一個說法,是
var arg1 = arguments[0];
if (arg1) {
<special case code>
}
裏面的功能完全安全的事是什麼?
如果我有一個函數問一個不存在的javascript參數有風險嗎?
foo()
,我不帶任何參數的大部分時間打電話,但在特殊情況下,一個說法,是
var arg1 = arguments[0];
if (arg1) {
<special case code>
}
裏面的功能完全安全的事是什麼?
是的,這很好。一個合理的選擇是命名的說法,而不是使用arguments
對象:
function foo(specialArg)
{
if (specialArg)
{
// special case code
}
}
注意if(bar)
測試感實性的bar
。如果您致電foo
與任何falsy值,如foo(0)
,foo(false)
,foo(null)
等,特殊情況下代碼將不執行上述功能(或您的原始功能,就此而言)。您可以將測試更改爲
if (typeof specialArg !=== 'undefined')
{
// ...
}
確保在提供參數但執行錯誤時執行特殊情況代碼。只要你記錄的行爲足夠我看不出有什麼毛病
function foo(arg1){
if (arg1){
// Special case
}
else{
// No argument
}
// Rest of function
}
是的,它是安全的。 除非您通過false
,""
, 0
,null
或undefined
作爲參數。最好再檢查undefined
的值。 (如果你通過undefined
那麼強硬!這不是一個有效的論點)。
有3個流行檢查
foo === undefined
:標準入住但某人(惡)可能會做window.undefined = true
typeof foo !== "undefined"
:類型檢查和安全。foo === void 0
:void 0
回報真正undefined
但這是首選
function myFunction(foo) {
if (foo !== undefined) {
...
} else {
...
}
}
這不是一個檢查foo是否未定義的好方法(取決於您的範圍)。有人可能會設置未定義的東西(因爲undefined可以像其他變量一樣設置 - 一個Javascript缺陷)。看到這個證明:http://jsfiddle.net/xonev/v4AQH/。首選方法是'typeof foo!==「undefined」'。 -1 – 2011-06-07 14:20:01
@StevenOxley我提到有3種方式來處理這個問題。我提到'foo === undefined'有一個弱點。我會反駁說,如果我發現任何有意將「undefined」設置爲其他值的開發者值得在手腕上打一記耳光,並且這樣做是一個_BUG_被修復。首選方法是'foo!== void 0',因爲它很簡單。你是否也希望屏蔽'undefined'被重新分配與屏蔽'Object.prototype = null'一樣迂迴! – Raynos 2011-06-07 14:28:49
你可以做到這一點。
但是,您最好檢查參數長度,而不是現在的做法。例如,你說:
myFunction(0);
它永遠不會處理參數。
如果它是一個單一的可選參數,你最好把它作爲函數中的一個命名參數,並檢查一個定義值是否被傳入,取決於你的用例。
:
您感興趣的基本事實是「被foo稱爲0或1個參數?」。所以我會測試arguments.length
以避免未來出現問題,並將其評估爲false。
這是有效的代碼,不應該引起任何問題 – 2011-06-07 14:11:59