Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript number toString()方法为number和variable返回不同的值_Javascript - Fatal编程技术网

Javascript number toString()方法为number和variable返回不同的值

Javascript number toString()方法为number和variable返回不同的值,javascript,Javascript,如果我跑 var num = 23; var n = num.toString(); console.log(n) 它按预期记录23,但是如果我将toString()直接应用于如下数字 var n = 15.toString(); console.log(n) 它抛出一个错误: Uncaught SyntaxError: Invalid or unexpected token. 我注意到它也适用于num变量中的十进制值(如.3、.99、2.12、99.1)等。有人能帮我理解它们之间的区别以

如果我跑

var num = 23;
var n = num.toString();
console.log(n)
它按预期记录
23
,但是如果我将
toString()
直接应用于如下数字

var n = 15.toString();
console.log(n)
它抛出一个错误:

Uncaught SyntaxError: Invalid or unexpected token.

我注意到它也适用于num变量中的十进制值(如.3、.99、2.12、99.1)等。有人能帮我理解它们之间的区别以及这个函数是如何工作的吗?

我相信JavaScript解析器根本不允许您直接对文本调用方法

不管你怎么做

var n = (15).toString();
console.log(n);
。。。它会起作用的

编辑


感谢@apsillers的解释。我不知道。数字上的第一个点被视为数字的一部分,因此出现了问题<代码>1.1.toString()有效。有趣。

我无法解释原因,但如果你这么做了

23..toString()
它起作用了

另一种方法是转换为字符串:

23 + '';

是的,Javascript。

当您将它存储到num as 23中时,这是分配给它的值。 当您调用
23.toString()
时,它认为它是23(小数点)和一些没有意义的单词toString

所以你要做的就是在后面再加一个小数点,让它知道它是23.0


然后得到的是
23.(invisibleZeroHere).toString()
AKA 23..toString()

JavaScript解析工作正常。您已声明如下:

23.toString()
我们将其视为一个函数,并对其调用函数

解析器没有。解析器看到有人试图声明浮点文本。解析器使用以下方法:

[(+)][数字][.数字][(E | E)[(+)]数字]

它假定您正在声明,因为它是:

  • 不是变量,因为它不是以字母或可接受的字符开头
  • 是数字文字,因为它以数字字符开头
  • 是一个浮点数,因为它有一个小数点
如果出于所有意图和目的,确实要调用
23.toString()
,那么操作过程就是隔离文本,如下所示:

(23).toString(); //interprets 23 as literal

这就是说,JavaScript足够灵活,可以知道在大多数情况下您希望使用23作为字符串。这很好

var foo = "The answer is " + 42;  
这也是

var bar = "39" - 0 + 3; //42
这不是

var baz = "39" + 3; //393!!! 

这很有趣。我知道最好不要使用导致错误的语法,但我无法解释为什么一个会中断,而另一个不会!如果要执行console.log('13'.toString());它起作用了!如果数字在括号中,也可以使用,例如
(15).toString()
@Sam这是因为解析器贪婪地将
作为NumericLiteral标记
23.
的一部分读取,因此句点不能用作属性访问表达式的一部分。考虑<代码> 23…toSTRIGEN()/CODE >确实有效,因为数值文本不能有两个句点,因此多余的时间段可以自由地成为属性访问表达式的一部分。只是,出现在数字文字上的第一个小数总是被解释为文字的一部分。如果文本有小数点,则可以使用附加点作为属性访问器:
1.1.toString()
15..toString()
,等等。。谢谢
var baz = "39" + 3; //393!!!