将函数添加到数字原型

时间:2018-03-03 00:29:30

标签: javascript node.js

注意我知道这是一种不好的做法。我只是想了解JS是如何工作的。

我在Number.prototype下添加了一个函数:

Number.prototype.times = function(f){
  for(let i=0; i<Math.floor(this); i++){
    f(i);
  }
}

并尝试通过以下方式调用它:

3.times( ()=>console.log("Hello") )                 //ERROR AS EXPECTED SyntaxError: Invalid or unexpected token
Number(3).times( ()=>console.log("Hello") )         //WORKING. WHY?
new Number(3).times( ()=>console.log("Hello") )     //WORKING AS EXPECTED

据我所知,Number()只返回一个原始数字类型,在这种情况下不应该工作,并且应该像第一种情况一样出错。它为什么有效?

typeof(3)            //number
typeof(Number(3))    //number
typeof(new Number(3))//object

我正在使用node-v.9.2

3 个答案:

答案 0 :(得分:7)

它认为.是小数点。

(3).times( ... )应该有用。

&#13;
&#13;
Number.prototype.times = function(f){
  for(let i=0; i<Math.floor(this); i++){
    f(i);
  }
};

(3).times(console.log);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

第二个是将参数转换为数字的全局函数。数字(3)的作用就像将3放在括号中一样。

答案 2 :(得分:0)

您需要提供括号,因为当您键入3.时,您的数字文字正式未完成,解析器将其作为小数点数的开头读取,这就是它抛出Syntax Error: invalid token的原因。

因此,您需要正式终止小数点表示法,以向解析器指示它可以开始将值包装到相应的类型对​​象表示中,例如通过添加另一个.,如{E},因为跳过小数解析器允许点后面的部分。

当你执行3..times时,Number函数通常会转换为Number类型,但这次它只返回数字,因此返回的值已完全形成并解析为什么你的原因可以继续上述装箱逻辑而没有任何错误。

希望这有点澄清。