簡體   English   中英

用“ {} object”定義變量,意外的TypeError

[英]Define variables with “{}object”, unexpected TypeError

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

在這種情況下, {}似乎表現得像一個空塊,而不是對象文字。 因此,在語法上將其視為:

// 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

在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"

在表達式內部, {}被解釋為對象文字。 如果您嘗試使用類似{}() ,它將抱怨{}不是函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM