JavaScript中toString的使用

JavaScript中toString的使用,javascript,Javascript,我正在读道格拉斯·克罗克福德的书,我已经到了他定义淡入淡出函数的地步。这段代码的一部分可以归结为: var level = 1; var hex = level.toString(16); 所以我在浏览器的控制台上运行这个,看看我得到了什么 var level = 1; level.toString(16); 嘿,它返回“1”。。。难以置信!神童吧 然后厚着脸皮,我试着看看我得到了什么 1.toString(16); 我得到 SyntaxError:意外标记非法 怎么回事?如果level是

我正在读道格拉斯·克罗克福德的书,我已经到了他定义淡入淡出函数的地步。这段代码的一部分可以归结为:

var level = 1;
var hex = level.toString(16);
所以我在浏览器的控制台上运行这个,看看我得到了什么

var level = 1;
level.toString(16);
嘿,它返回“
1
”。。。难以置信!神童吧

然后厚着脸皮,我试着看看我得到了什么

1.toString(16);
我得到

SyntaxError:意外标记非法

怎么回事?如果
level
是一个等于1的变量,并且在level上运行此方法效果很好,那么为什么在实际的数字1上运行此方法不起作用呢?我用
toPrecision()
方法做了一个类似的实验,在这两种情况下效果都很好。这里有什么问题?这是JavaScript实现中的另一个固有缺陷,还是我遗漏了什么?我正在测试谷歌浏览器


相关:堆栈溢出问题。

您需要1..toString或(1)。toString获取数字文本。

这只是语言语法限制

由于
1.
是一个合法的文字数字(而
1.t
不是),令牌服务器将其拆分为以下令牌:

1.
toString
(
)
这是一个非法的令牌序列。它是
对象方法
,而不是
对象。方法

在@Joey的答案的工作版本中,大括号阻止标记器将点视为数字文字的一部分,而不是作为单独的标记,就像书写:

1.0.toString()

因为标记器知道第二个点本身必须是一个标记,而不是数字文字的一部分。

级别是一个变量(因此是一个对象)

1是一个文本。它们不是对象,解释器对它们的看法完全不同


好的,这给了我方法,但不是原因。为什么3.14159.toPrecision(3)工作正常,但1.toString(16)给了我一个错误?它们都是数字对象上的方法。啊哈!这是有道理的。赢家,赢家,鸡肉晚餐。但是,解析器应该知道以数字开头的标识符是非法的,因此应该将其作为数字进行计算。也许是限制?@peter这与标识符无关。标记器将获取第一个点作为“数字标记”的一部分,这意味着它本身不再是一个标记。。。正如阿尔尼塔克解释的那样,它只是不知道数字的终点。1和1。是javascript中有效的等效数字。因此,解析器不会将点识别为表示方法的点,而是识别为后面带有无效字符的十进制数。如果我只是将1.bork放入控制台,我会得到同样的错误。但是通过有两个小数点,js知道第二个点意味着下一个是方法。因此,以我自己的例子来说,当我尝试3.14159.toString(16)时,我得到了一个有效的响应,因为有两个点。好悲伤!!关于解析器和标记器的智能对话!他们接下来会怎么想-引用规范??:-onumber是对象,number方法可以作用于它们。Alnitak给出了正确的答案,他解释说点对于javascript解析器来说是不明确的,要么是小数点,要么是表示该对象的属性。或者可能没有歧义,因为javascript明确地将第一个点视为小数点,而不是对象属性的指示符。但是如果你尝试1..toString(16),我们都在coolsville.:-)@BobRalian实际上数字不是对象-它们是基本值类型-它们只是很容易被装箱到
Number
objects中,或者在JavaScript中:强制为
Number
对象。相关:,
1..toString()