如果{}object
,例如{}"string"
,{}[1, 2, 3]
或{}({})
完全相同(根据===
)至object
,例如"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
答案 0 :(得分:7)
在这种情况下,{}
似乎表现得像一个空块,而不是一个对象文字。因此,请在语法上将其视为:
// Valid syntax...
// despite confusing whitespace...
for (var i=0;i<5;i++) {}"string" === "string";
但是,该空块不能用于
之类的作业的右侧var a = {}"string"; //SyntaxError
此处,{}()
表示{}
被用作函数,参数位于()
var a = {}("string") // TypeError: object is not a function
答案 1 :(得分:3)
在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"
在表达式中,{}
被解释为对象文字。如果您尝试{}()
之类的内容,则会抱怨{}
不是函数。