在这个来自javascript koans的摘录中,Array(foo + 1)的全部内容是什么?

时间:2013-09-04 19:01:26

标签: javascript

公案在下方。在我的课程中,我从来没有见过像这样的代码插入代码中的“数组”这个词。我可以在其他地方学习的任何例子吗?

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);
});

它应该知道函数就像方法一样的属性。这会损害你的业力。

预期'将此值填入'以匹配'他们是粉红色和脑脑脑脑'。

2 个答案:

答案 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.1Array(...)的行为就像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”连接空字符串列表。