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的复杂性的了解非常有限。