2016-02-21 48 views
0

考慮下面的代碼(簡稱爲清楚起見):這個Javascript函數參數在做什麼?

Vertices.chamfer = function(vertices, radius, quality, qualityMin, qualityMax) { 
    radius = radius || [8]; 

    if (!radius.length) 
    radius = [radius]; 
}; 

我讀的第一部分爲(僞):

if (radius array passed to function) then 
    radius = radius 
else 
    radius = [8] // new array, single element of value 8 
end if 

,但我不明白的第二表達式(if(!radius.length) radius = [radius]部分)。

有人能解釋給我嗎?

回答

0

我讀的第一部分爲(僞):

if (radius array passed to function) then

radius = radius || [8]檢查是否radiusfalsy,這可能在不被傳遞全部(undefined),或作爲undefined傳入,或作爲null0,傳入,NaN,當然還有false

但是,如果沒有指定radius,可能打算使用[8]

但我沒有得到第二個表達式(if(!radius.length)radius = [radius]部分)。

如果radius被給出,但是A),沒有條目(radius.length是0,因此falsy),或B)不是一個陣列(radius.lengthundefined因此falsy)的數組,我們創建了一個陣列中,並使它是該數組中的第一個條目。

這並非完全可靠的驗證,很多東西都有length(例如字符串),但這可能是意思是要做的事情。

檢查某個數組是否爲數組的可靠方法是使用Array.isArray,該數據已添加到ES5中,並且可以對過時的引擎(如IE8中的引擎)進行可靠的填充/填充。

+0

謝謝。非常明確的答案。 – Garry

1
Vertices.chamfer = function(vertices, radius, quality, qualityMin, qualityMax) { 
      // Set the radius to the value passed in. 
      // If the value passed in is undefined, set the radius to an 
      // array containing 8 (the "default") 
      radius = radius || [8]; 

      // If radius isn't an array (i.e. length is 0 which evaluates to false), 
      // make it an array. 
      if (!radius.length) 
      radius = [radius]; 
     }; 
+1

...並記住,如果您將半徑作爲字符串傳遞,例如'「7」.length == 1',則會中斷;) – pawel

0

如果導入的半徑不是一個數組並且它有值,那麼它將返回一個內部具有半徑值的數組。

如果進口半徑爲空,則它返回與內數字8的數組:[8]

然而,僞代碼內時,它是不會if語句得到,如果導入的半徑不是數組。

1

這裏使用的概念被稱爲duck typing - 即通過查找某些特徵屬性/方法的存在(或不存在)來檢查變量的類型。此代碼的作者認爲,如果某物具有length屬性,則它是一個數組,如果不是,則可以通過將其包裝在[]中將其轉換爲數組。

第二部分,使用x = [x]x轉換爲包含x的單項數組完全沒問題。

問題是,在JavaScript中有其他類型的有length,所以這個測試是不是真的可靠。

例如:"7".length回報1,所以如果你傳遞的變量作爲字符串,而不是一個數字(很容易的從<input>域讀取值以犯這樣的錯誤爲例)的東西會打破行預期的數組,但獲得一個字符串。

另一種具有length的類型是Function(function(a,b){}).length == 2

所以,這不是很好的測試,但基本的想法是有道理的。應該使用Array.isArray或其他一些陣列特有的屬性/方法。

編輯:我也指出radius = radius || [8]構造是隻有確定如果0不允許作爲radius參數。

+0

毆打該帖子,但作爲一個同樣徹底的答案upvoted。謝謝。 – Garry