我正在尝试使用以下代码扩展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
!!
答案 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
奖励材料: