扩展Number对象时的SyntaxError

时间:2017-06-08 19:13:33

标签: javascript syntax-error prototype literals

我正在尝试使用以下代码扩展Number对象:

Number.prototype.isNumber = function(i){
  if(arguments.length === 1){
    return !isNaN(parseFloat(i)) && isFinite(i);
  } else {
    return !isNaN(parseFloat(this)) && isFinite(this);
  }
}

try {
  var x = 8.isNumber();
} catch(err) {
  console.log(err);
}

我得到SyntaxError: identifier starts immediately after numeric literal

当我尝试以下内容时:

Number.isNumber(8)

我得到Number.isNumber is not a function !!

2 个答案:

答案 0 :(得分:0)

JavaScript解析器将8.isNumber读作数字文字。

要在数字文字上访问Number方法,您必须用括号括住数字,以便JavaScript解释程序知道您正在尝试使用数字属性。



Number.prototype.isNumber = function(i) {
  if (arguments.length === 1) {
    return !isNaN(parseFloat(i)) && isFinite(i);
  } 

  return !isNaN(parseFloat(this)) && isFinite(this);
}

try {
  var x = (8).isNumber();
  console.log(x);
} catch(err) {
  console.log(err);
}




答案 1 :(得分:0)

我无法帮助它,但提供了额外的答案,尽管你已经接受了。

您需要知道的第一件事是Number对象与Number原型(see here)之间存在根本区别。

目前,您正在扩展Number原型,而不是对象本身!您的isNumber实施实际上具有与以下相同的效果:

Number.prototype.isNumber = function(){return isFinite(this)}

为什么呢?因为为了执行这个原型方法,解析器首先需要知道你正在调用函数的文字的类型。这就是为什么你需要将你的数字文字转换成一个表达式,方法是将它包装在括号中:(8).isNumber()或者使用偶数更奇怪的符号8..isNumber()(第一个.是小数点,第二个属性访问者)。此时,javascript引擎已将其评估为Number,因此可以执行isNumber()方法。

另一方面,虽然第一眼看到你的代码看起来它可以正确处理以下情况(因为你正在做一个parseFloat):"8".isNumber()将总是抛出异常,因为这里我们有一个字符串文字,String原型没有相应的方法。这意味着,您将永远无法检测到实际上是字符串文字的数字。

你应该做的是直接扩展Number对象,这样你就可以在不必处理错误的情况下进行适当的检查:

Number.isFiniteNumber = function(i){
    return !Number.isNaN(i) && Number.isFinite(i);
}

Number.isFiniteNumber(8);        // returns true
Number.isFiniteNumber("3.141");  // returns true
Number.isFiniteNumber(".2e-34"); // returns true
Number.isFiniteNumber(Infinity); // returns false

// just for informational purposes
typeof Infinity === "number" // is true

奖励材料:

Extending native objects is potentially dangerous

Number.isNaN() probably does not what you think it does.