考虑以下代码(为清楚起见缩短了):
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 :(得分: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 :(得分: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
时才可以。
答案 2 :(得分:0)
我将第一部分读作(伪代码):
if (radius array passed to function) then
radius = radius || [8]
检查radius
是否虚假,可能根本没有传递(undefined
),或者传递为{{1}或者以undefined
,null
,0
,""
或当然NaN
传入。
但是,如果没有指定false
,它可能会使用[8]
。
但我没有得到第二个表达式(if(!radius.length)radius = [radius]部分)。
如果给出了radius
但是是A)没有条目的数组(radius
是0,因此是假的),或者B)不是数组(radius.length
是{{1因此,我们创建一个数组并使其成为该数组中的第一个条目。
这根本没有强大的验证,很多东西都有radius.length
(例如字符串),但这可能是它的意味着什么做。
检查某些内容是否为数组的强大方法是使用Array.isArray
,这是在ES5中添加的,可以对过时的引擎(如IE8中的引擎)进行可靠的填充/填充。
答案 3 :(得分:0)
如果导入的半径不是数组且它有值,则返回一个半径值在其中的数组。
如果导入的半径为空,则返回一个数字为8的数组:[8]
然而,在伪代码中,如果导入的半径不是数组,则不会进入if语句。