3

我最近完成了 DevTools ~> http://discover-devtools.codeschool.com/课程,在检查使用的代码时,我遇到了一些我不理解的部分:

String.prototype.repeat = function (num) {
  return new Array(num + 1).join(this);
};

因此在该displayDate()方法中使用:

var body = $('body')[0].outerHTML.repeat(10000);

使用此代码的重要性是什么?

其次,在displayToday()方法中,displayDate()方法是用参数调用的,尽管它没有被定义为带参数。为什么会这样?

我正在学习 JS 并且无法绕过这些。欢迎任何帮助。

4

3 回答 3

4
String.prototype.repeat = function (num) {
  return new Array(num + 1).join(this);
};

此代码创建一个长度为 的数组num+1,其中填充了undefined. 然后使用 将其折叠成一个字符串join,将每个未定义的值与上下文分开this分开outerHTML。当一个数组加入一个字符串时,undefined值什么都不是,因此生成的字符串只包含出现num次数的分隔符,从而“重复”字符串。

//let . be "undefined, which when turned into a string, is just nothing
[u,u,u,...,u].join('test');
'(u)test(u)test(u)...(u)test'
'testtest...test'

至于第二个问题,JS 中的函数总是会接受参数,即使函数并不意味着接受参数。在 JS 中定义函数中的参数只是为传递的参数分配一个名称。参数将始终传递给函数,并收集在函数中可用的特殊数组中作为arguments变量。

function fn(){
  console.log(arguments); //['hello','world'];
}

foo('hello','world');
于 2013-05-03T21:03:24.627 回答
1

即使您没有在声明中列出参数,您也可以将参数传递给函数。您可以访问传递的参数arguments

function foo () {
  console.log(arguments);
}

foo('bar'); // ['bar']
foo('bar','blerg'); // ['bar','blerg']
于 2013-05-03T21:03:31.760 回答
1

这很简单。

当您更改prototype某物的 (在本例中为默认String类)时,您使该方法可用于该类的任何实例,在本例中可用于任何字符串。

现在让我们看看该方法的作用。

return new Array(num + 1).join(this);

因为String.prototype.displayDate = function(num) {,该this函数内部的值就是字符串的值。引用指向当前this对象,我想这是有道理的。

然后它创建了一个由 num + 1 个元素组成的数组,这些元素都将使用undefined. Array.prototype.join返回数组元素的字符串表示形式,这些元素由您作为参数提供的事物分隔。

undefined在这种情况下,您有一个 num +1值的数组。is的字符串表示形式undefined""或空字符串。所以你最终得到 num + 1 个空字符串的串联 + 的值this,或者num乘以你的字符串。

假设您的字符串是“test”,然后您调用repeat(2).

它首先创建了a = new Array(undefined, undefined, undefined);// 2 + 1 次。

然后它开始加入字符串,在每对之间放置“测试”。

new String(undefined) + new String("test") + new String(undefined); + new String("test") + new String(undefined)

上面变成:

"" + "test" + "" + "test" + "" = "testtest"// two times the original string.
于 2013-05-03T21:05:17.013 回答