使用“{} object”定义变量,意外的TypeError

时间:2011-12-31 04:13:25

标签: javascript

如果{}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

2 个答案:

答案 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"

在表达式中,{}被解释为对象文字。如果您尝试{}()之类的内容,则会抱怨{}不是函数。