公案在下方。在我的课程中,我从来没有见过像这样的代码插入代码中的“数组”这个词。我可以在其他地方学习的任何例子吗?
it("should know properties that are functions act like methods", function ()
{
var meglomaniac = {
mastermind : "Brain",
henchman: "Pinky",
battleCry: function (noOfBrains)
{
return "They are " + this.henchman + " and the" +
Array(noOfBrains + 1).join(" " + this.mastermind);
}
};
var battleCry = meglomaniac.battleCry(4);
expect(FILL_ME_IN).toMatch(battleCry);
});
它应该知道函数就像方法一样的属性。这会损害你的业力。
预期'将此值填入'以匹配'他们是粉红色和脑脑脑脑'。
答案 0 :(得分:4)
因此,Array(noOfBrains + 1)
创建一个长度为5的新数组(好吧,假设noOfBrains以4传入),其中每个元素都是未定义的:
[undefined, undefined, undefined, undefined, undefined]
然后,连接操作采用一个字符串(“Brain”),并在数组的每个元素之间放置一个副本。 (更常见的连接使用类似于array.join(", ")
逗号分隔数组)
所以我们基本上有:
undefined + " Brain" + undefined + " Brain" + undefined + " Brain"+ undefined + " Brain" + undefined
哪个成为“脑脑脑脑”,因为未定义的被联接忽略。
答案 1 :(得分:1)
根据ECMAScript 15.4.1,Array(...)
的行为就像new Array(...)
:
当
Array
作为函数而不是构造函数调用时,它会创建并初始化一个新的Array对象。因此,函数调用Array(...)
等同于具有相同参数的对象创建表达式new Array(...)
。
根据ES 15.4.2.2,单参数形式new Array(len)
创建一个空数组,其中length
属性设置为参数的值。因此,Array(noOfBrains + 1)
会创建一个大小为noOfBrains + 1
的空数组。
根据ES 15.4.4.5,.join(separator)
在数组上循环获取数组length
的值(步骤10)。它通过连接数组中的值来构建字符串,并通过作为参数传递给join
的分隔符值连接。根据步骤8和步骤10.c,undefined
将.join
数组值呈现为空字符串。
由于您刚刚初始化的数组为空,因此其值的所有均为undefined
。因此,.join
使用分隔符字符串“Brain
”连接空字符串列表。