我最近完成了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()
方法,尽管它没有被定义为采用arg。为什么会这样?
我正在学习JS而且无法绕过这些。欢迎任何帮助。
答案 0 :(得分: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');
答案 1 :(得分:1)
即使您没有在声明中列出参数,也可以将参数传递给函数。您可以访问使用arguments
function foo () {
console.log(arguments);
}
foo('bar'); // ['bar']
foo('bar','blerg'); // ['bar','blerg']
答案 2 :(得分:1)
这很简单。
当您更改某些内容的prototype
时,在这种情况下是默认的String
类,您可以将该方法用于该类的任何实例,在本例中为任何字符串。
现在让我们看一下该方法的作用。
return new Array(num + 1).join(this);
由于String.prototype.displayDate = function(num) {
,该函数中this
的值是字符串的值。 this
引用指向当前对象,我想这是有道理的。
然后它创建一个num + 1个元素的数组,这些元素将全部用undefined
初始化。 Array.prototype.join
返回由您提供的事物分隔的数组元素的字符串表示形式。
在这种情况下,您有一个num +1 undefined
值的数组。 undefined
的字符串表示形式为""
,或为空字符串。所以你最终得到空字符串+ this
的值的num + 1个连接,或者你的字符串的num
次。
说你的字符串是“test”,然后你调用repeat(2)
。
首先创建a = new Array(undefined, undefined, undefined);
// 2 + 1次。
然后它开始加入字符串,在每对之间放置“test”。
new String(undefined) + new String("test") + new String(undefined); + new String("test") + new String(undefined)
以上变为:
"" + "test" + "" + "test" + "" = "testtest"// two times the original string.