0

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

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

它应该知道作为函数的属性就像方法一样。它正在破坏你的业力。

预期“填写此值”以匹配“他们是 Pinky 和 ​​Brain Brain Brain Brain”。

4

2 回答 2

4

因此,Array(noOfBrains + 1)创建一个长度为 5 的新数组(好吧,假设 noOfBrains 作为 4 传入),其中每个元素都是未定义的:

[undefined, undefined, undefined, undefined, undefined]

然后,连接操作接受一个字符串(“Brain”),并将它的副本放在数组的每个元素之间。(连接更常见的用法是用array.join(", ")逗号分隔数组)

所以我们基本上有:

undefined + " Brain" + undefined + " Brain" + undefined + " Brain"+ undefined + " Brain" + undefined

这变成了“脑脑脑脑”,因为未定义的被连接忽略了。

于 2013-09-04T19:16:10.890 回答
1

根据ECMAScript 15.4.1Array(...)行为就像new Array(...)

Array作为函数而不是构造函数调用时,它会创建并初始化一个新的 Array 对象。因此,函数调用Array(...)等效于new Array(...)具有相同参数的对象创建表达式。

根据ES 15.4.2.2,单参数形式new Array(len)创建一个空数组,其length属性设置为参数的值。因此,Array(noOfBrains + 1)创建一个 size 的空数组noOfBrains + 1

根据ES 15.4.4.5.join(separator)循环遍历数组以获取数组的值length(步骤 10)。它通过连接数组中的值来构建一个字符串,并通过作为参数传递给join. 根据第 8 步和第 10.c 步,undefined数组值被渲染为空字符串.join

由于刚刚初始化的数组是空的,所以它的所有值都是undefined. 因此,.join将空字符串列表与分隔符字符串“ Brain”连接起来。

于 2013-09-04T19:15:50.140 回答