为什么有些文字,实际上是对象,而有些只是非对象文字?

时间:2015-08-22 22:54:35

标签: javascript

假设我有两个文字:false1。如果我在它们上面调用函数toString(),我得到:

false.toString() // false
1.toString()     // Uncaught SyntaxError: Unexpected token ILLEGAL

第二种情况会发生错误,第一种情况不会发生错误?

2 个答案:

答案 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中,每种类型都有一个原型。对于truefalse,有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()创建可变对象,但是使可变对象不可变是更复杂的。

应该注意的是所有这些原型 - BooleanStringNumberArrayFunction - 从Object下降。这是因为所有原型都是对象本身,因此必须从Object下降。这就像在Java中所有类以某种方式从Object下降的方式。但是,有一种方法可以使用__proto__摆脱Object的降序,但是这更加令人困惑,如果你刚刚进入JavaScript,那么进入它可能并不好。

我希望这个解释能帮助您更好地理解JavaScript!