Javascript 用“定义变量”;{}object";,意外的类型错误

Javascript 用“定义变量”;{}object";,意外的类型错误,javascript,Javascript,如果{}对象,例如{}“string”,{[1,2,3],或{{}({})对象,与对象,例如“string”,[1,2,3],或({})完全相等(根据===),为什么可以用后者定义变量,而不是前者 澄清: {}"string" === "string" // true var a = "string" // No error var a = {}"string" // SyntaxError: Unexpected string var a = ({}"string")

如果
{}对象
,例如
{}“string”
{[1,2,3]
,或
{{}({})对象
,与
对象
,例如
“string”
[1,2,3]
,或
({}
)完全相等(根据
===
),为什么可以用后者定义变量,而不是前者

澄清:

{}"string" === "string" // true
var a = "string"        // No error
var a = {}"string"      // SyntaxError: Unexpected string
var a = ({}"string")    // SyntaxError: Unexpected string
var a = {}("string")    // TypeError: object is not a function
var a = ({}("string"))  // TypeError: object is not a function

在此上下文中,
{}
的行为似乎像一个空块,而不是一个对象文本。因此,从语法角度来看,它就像:

// Valid syntax...
// despite confusing whitespace...
for (var i=0;i<5;i++) {}"string" === "string";
在这里,
{}()
意味着
{}
被用作一个函数,参数在
()


在此上下文中,
{}
的行为似乎像一个空块,而不是一个对象文本。因此,从语法角度来看,它就像:

// Valid syntax...
// despite confusing whitespace...
for (var i=0;i<5;i++) {}"string" === "string";
在这里,
{}()
意味着
{}
被用作一个函数,参数在
()


在JavaScript中,如C++一样,可以任意设置代码块。由于JavaScript没有块范围,就像C++一样,这在JavaScript中基本上是无用的。 以下是非空代码块的示例:

{
  //this is a code block
  var a = 1;
  var b = a + 1;
}
alert(a);  // 1
alert(b);  // 2
请注意,这些单独的代码块不是表达式,因此不可能将它们放在语句中。这就解释了为什么
var a={}“string”
以及在语句中对它的其他使用在语法上是无效的

{}“string”==“string”
在控制台中返回
true
,因为
{}
是一个空的代码块,它被忽略,后面跟着
“string”==“string”
,这显然是
true
。如果像这样使用空格,代码更清晰:

{
  //empty code block
}
"string" === "string"

在表达式内部,
{}
被解释为对象文本。如果您尝试了诸如“代码> {}”(/<代码> >,它会抱怨<代码> {} /COD>不是一个函数。

< P>在JavaScript中,如C++中,可以任意设置代码块。由于JavaScript没有块范围,就像C++一样,这在JavaScript中基本上是无用的。 以下是非空代码块的示例:

{
  //this is a code block
  var a = 1;
  var b = a + 1;
}
alert(a);  // 1
alert(b);  // 2
请注意,这些单独的代码块不是表达式,因此不可能将它们放在语句中。这就解释了为什么
var a={}“string”
以及在语句中对它的其他使用在语法上是无效的

{}“string”==“string”
在控制台中返回
true
,因为
{}
是一个空的代码块,它被忽略,后面跟着
“string”==“string”
,这显然是
true
。如果像这样使用空格,代码更清晰:

{
  //empty code block
}
"string" === "string"

在表达式内部,
{}
被解释为对象文本。如果你尝试像
{}()
这样的东西,它会抱怨
{}
不是一个函数。

顺便说一句,这是一个很好的问题。我不明白为什么人们认为这些问题很好。他们与某人实际编写的任何真实代码有什么关系?@jfriend00我想至少有人用示例非常清楚地问了这个问题,即使它不是真的有用。@jfriend00它让我意识到Javascript中有一个我以前从未想过的怪癖。@PeterOlson-那个怪癖有什么用处?顺便说一句,这是一个很好的问题。我从来都不明白为什么人们认为这些问题很好。他们与某人实际编写的任何真实代码有什么关系?@jfriend00我想至少有人通过示例非常清楚地询问了这一点,尽管它并不真正有用。@jfriend00让我意识到Javascript中有一个我以前从未想过的怪癖。@PeterOlson-那个怪癖有什么用处?啊哈,我不知道Javascript的这个特性。现在我知道为什么控制台中的
{}
计算结果为
未定义的
。有什么特别的原因可以解释为什么在用括号括住大括号后,它会被视为对象文字?@Ian如果在Javascript中的某些代码周围放上括号,它会告诉解析器将括号内的内容解释为表达式。单独的代码块不能放在表达式中,所以它必须是一个对象文字。啊哈,我不知道Javascript的这个特性。现在我知道为什么控制台中的
{}
计算结果为
未定义的
。有什么特别的原因可以解释为什么在用括号括住大括号后,它会被视为对象文字?@Ian如果在Javascript中的某些代码周围放上括号,它会告诉解析器将括号内的内容解释为表达式。单独的代码块不能放在表达式内部,因此它必须是一个对象文字。感谢您的提示和清楚解释的答案。我已经完全忘记了任意块(因为据我所知,它们没有任何用处。)我假设
{}
是一个类似于
新对象
的神奇构造函数,但却产生了文字。很明显,我对JavaScript的复杂性的了解非常有限。谢谢你的提示和清楚的解释。我已经完全忘记了任意块(因为据我所知,它们没有任何用处。)我假设
{}
是一个类似于
新对象
的神奇构造函数,但却产生了文字。显然,我对JavaScript的复杂性的了解非常有限。