假设我有两个文字:false
和1
。如果我在它们上面调用函数toString()
,我得到:
false.toString() // false
1.toString() // Uncaught SyntaxError: Unexpected token ILLEGAL
第二种情况会发生错误,第一种情况不会发生错误?
答案 0 :(得分:4)
..
基本上,1
是一个数字,所以如果它后面紧跟一个小数,则它被视为一个浮点文字,并期望后面跟着小数值(如1.0
)。
1..toString()
有效,因为1.
是有效的数字文字,它知道要处理下一个点来访问对象的属性。这意味着:
1.1.toString(); // Works
1.toString(); // "toString()" isn't a number so we get an error
[]
var toString = "toString";
现在你可以做到:
1[toString]();
()
您可以使用括号。这与声明变量的方式类似:
var a = 5;
a.toString();
(5).toString();
为什么这样做?
这是因为仅当有
.
时才会出现以下情况:
如果您在控制台上输入1.toString()
(我正在使用Safari)。它应该说:
At least one digit must occur after a decimal point
意思是期待一个数字。
因为执行..
或添加额外的括号会让人讨厌。您可以使用 String
功能解决此问题:
String(1);
答案 1 :(得分:1)
实际上,数字是对象文字。只是你需要在数字周围加上括号,以便控制台完成解析数字。这样,.
不会被误认为小数点。您还可以将.
s,一个用于小数点,一个用于.toString()
:
//This outputs "2":
console.log((2).toString());
//So does this:
console.log(2..toString());
var hello = 2;
//So does this:
console.log(hello.toString());
有关此解析错误的更多信息,请查看@vihan's answer。
在JavaScript中,每种类型都有一个原型。对于true
和false
,有Boolean
原型。对于像1
这样的数字,有Number
原型。对于像"Hi!"
这样的字符串,有String
原型。但是,布尔值,数字和字符串都是原始对象,这意味着它们是不可变的,这意味着您不能像常规对象那样设置它们的属性:
var hello = 2;
//hello is a Number object and can have properties and methods like .toString():
console.log(hello.toString());
//This doesn't work, however, because while hello is an object, it is immutable:
hello.hello = 2;
//This outputs undefined because the above didn't work:
console.log(hello.hello);
相比之下,数组(来自Array
原型),函数(来自Function
原型)是可变对象,因此您可以很好地设置它们的属性。此外,像{regular: true}
这样的常规对象来自Object
原型并且也是可变的。
var arr = [1, 2];
//arr is mutable, so this works just fine and outputs 2:
arr.hello = 2;
console.log(arr.hello);
因此,JavaScript中的所有文字都是对象,但有些是可变的,而有些则是不可变的。您还可以定期使用Object.freeze()
创建可变对象,但是使可变对象不可变是更复杂的。
应该注意的是所有这些原型 - Boolean
,String
,Number
,Array
,Function
- 从Object
下降。这是因为所有原型都是对象本身,因此必须从Object
下降。这就像在Java中所有类以某种方式从Object
下降的方式。但是,有一种方法可以使用__proto__
摆脱Object
的降序,但是这更加令人困惑,如果你刚刚进入JavaScript,那么进入它可能并不好。
我希望这个解释能帮助您更好地理解JavaScript!