2010-09-17 13 views
15

Firebug veya jsconsole.com veya diğer JavaScript etkileşimli konsolda aşağıdakileri gösterir:Bir Javascript konsolunda hata veren {a: 1} 1 ve {a: 1, b: 2} yazma davranışı nedir?

>>> foo = { a : 1, b : 2.2 } 
Object { a=1, more...} 

>>> foo.a 
1 

>>> foo.b 
2.2 

>>> { a : 1, b : 2.2 } 
SyntaxError: invalid label { message="invalid label", more...} 

>>> { a : 1 } 
1 

neden 1{a : 1} için dönüyor ve neden {a : 1, b : 2.2} bir hata veriyor? Ruby'de, tanımladığınız şekilde geri dönerlerdi. Bunun başında { belirteç bir belirsizlik neden olduğundan

+1

Bu müthiş cevap arkasından büyük bir sorudur! Açıkçası CMS'nin cevabı hakkında konuşuyorum. –

+0

http://stackoverflow.com/questions/1509535/javascript-false-and-false/1509664#1509664 görünüşte alakasız bir sorudur, ancak yanıt verebilecek bir konuyla ilgili bir cevaba sahiptir. –

cevap

24

ikinci satır bir Block statement değil edebi bir nesnenin başlangıç ​​sanki ayrıştırıcı davranır, sana SyntaxError veriyor. Örneğin

, geçerli bir engelle deyimi:

{ foo: 'bar' } 

yukarıdaki değişmez bir nesne gibi görünüyor, ama kod sözlerinin bağlam içinde değerlendirilir, çünkü değil. Bu, labelled statement (foo) içeren bir Blok, ardından bir ifade ifadesi ('bar') ile ayrıştırılacaktır.

değişmeziyle bir nesnenin dilbilgisi kullandığınızdan emin olmak için, (aynı zamanda the grouping operator olarak da bilinir) parantez ile sarın:

({ foo: 'bar' }) 

gruplama operatörü sadece İfadeler alabilir, bu nedenle belirsizlik yoktur .

Ayrıca bakınız:

+0

+1 Bugün yeni bir şey öğrendim. Ben asla bir varlığa atamadan bir REPL içine bir nesne-literal sözdizimi koyma, ama bu bilmek için ilginç .. – Matt

+0

('etiketli bir ifade', Goto için kullanılabilir nerede C, devralınan bir şeydir Etiketli ifadeler neredeyse hiçbir zaman Javascriptte kullanılmaz, bu yüzden 'foo:' bar '} 'nin geçerli bir ifade olarak alınabileceği bir sürpriz olarak gelir.) – bobince

+0

Tamamen müthiş bir cevap, eğer mümkünse iki kere tekrarlanır ! –

0

% 100 olumlu değilim, ama ne oluyor düşünüyorum ikinci satırında bir blok tanımlarken yani bir nesne . Böylece ayrıştırıcı, ayrıştırıcının virgüllere ulaştığında ortaya çıkar, çünkü bir yarı renk bekler. Etiketlenmiş etiketler, bir goto veya anahtar ifadesinde olduğu gibi etiketlerdir. Umarım bu açıklama herhangi bir anlam ifade eder.

0

konsol ('sen girdi') olarak eval yapmak

eval({....}) --- this will get an error 
eval('({....})')---eval string as a function