{} + {} Neden artık Chrome konsolunda NaN değil?


144

Chrome 49 artık çıkışları bugün fark NaNyazarken {}+{}konsoluna. Bunun yerine dizeyi çıktılar [object Object][object Object].

Bu neden? Dil değişti mi?


13
chrome şimdi bu işlemi ekleme yerine bir dize concat olarak ele alıyor. NEDEN, bilmiyorum, bu yüzden bu bir cevap değil bir yorum :) deneyin var e = {}; e.toString()ve ne demek istediğimi göreceksiniz
user428517

19
"Dil değişti mi?" Hayır.
Felix Kling

6
@FelixKling Will dil değişikliği? ...Hayır. : c
kedi

18
Belki WATMAN'ın bununla bir ilgisi vardı?
rickster

1
@rickster böyle buldum. Bunu bir sunum için yeniden yaratıyordum.
Filip Haglund

Yanıtlar:


152

Chrome geliştiricileri artık değerlendirmesini bir ifade olarak zorlamak için örtülü bir parantezle ( koda bakın ) başlayan {ve biten her şeyi otomatik olarak sarar . Bu şekilde, şimdi boş bir nesne yaratır. Geçmişe ( ) dönerseniz bunu görebilirsiniz , önceki satırda yer alır .}{}(…)

Neden? Bilmiyorum, ama blok-nesne-gerçek anlamını bilmeyen yeni başlayanlar için karışıklığı azalttığını tahmin edebilirim ve sadece bir ifadeyi değerlendirmek istiyorsanız daha da yararlı olur.

Aslında, 499864 numaralı hatada tartışıldığı gibi, bunun nedeni de budur . Saf rahatlık. Ve çünkü REPL düğümü de buna sahipti ( koda bakınız ).


182
Aptal Chrome, {a:1}),({b:2}bir nesne üretmemeli, bir hata atmalıdır.
Oriol

29
Düzenli olarak derin iç içe yapıları regex stackoverflow.com/questions/1732348/…
Filip Haglund

4
Neden olduğu hakkında hiçbir fikrim yok, ancak her nasılsa mesajlarımı gördüğümde "ünlü" hissediyorum, ancak bu sayfa şu kadar herkese açık: D Weird StackOverflow problemi. İşte sorunla ilgili eski cevabım stackoverflow.com/questions/17268468/…
Benjamin Gruenbaum

3
Mevcut uygulamayı sevmiyorum ve düzeltmeyi planlıyorum. bugs.chromium.org/p/chromium/issues/detail?id=499864#c17
Zirak

1
@Zirak Bu çöpleri düzelterek iyi şanslar, IMO ASAP yedeklenmelidir. Ancak bunu iyileştirmek istiyorsanız, )bir yorumda bulunma ihtimaline karşı eklenmiş satırdan önce yeni satır eklemeyi düşünün , örneğin {a:3} // :-}yine de bir nesne oluşturabilir.
Oriol

44

Bu kontrol ettikten sonra yukarı ok vurursan yerine fark edeceksiniz {} + {}o görüntüler ({} + {}), sonuçları "[object Object][object Object]".

Buna karşılık, Firefox'ta {} + {}hala görüntülenir NaN, ancak bunu yaparsanız ({} + {})da görüntülenir "[object Object][object Object]".

Görünüşe göre Chrome, bu işlemi gördüğünde çevresindeki parantezleri otomatik olarak ekliyor.


22
bu cevap doğrudur. ama vay canına, dostum, kromun bunu sevdiğinden emin değilim. kötü google.
user428517

1
@sgroves Canary'de bunun aynı olup olmadığını ve bilerek yapılmış olup olmadığını veya aslında bir hata olup olmadığını görmek isterim.
J. Titus

8
{} + {}"temizlenmiş" değil ne zaman ({} + {})olarak kabul edilir + {}, çünkü {}boş blok olarak ayrıştırılır.
Gregory Nisbet

7
İlk etapta neden NaN'i geri getirsin?
0x499602D2

25
0x499602D2 @: Eğer parens yapmak (ya da başka ayrıştırıcı neden ziyade açıklamada daha bir ifade bekleniyor içine değişime) dışında, başlangıçtaki Çünkü {}sadece boş kod bloğu olup bize bırakarak dikkate alınmaz +{}bir tekli olan +ve boş bir nesne başlatıcısı. +(a sona erecek olan bir nesnenin üstüne nesne dönüştürülmesini kapsamaktadır sayısı, bağımsız değişkeni zorlamak olacaktır toStringsonuçlanan bu durumda "[object Object]"biz olsun) ve +"[object Object]"olduğu NaNiçin "[object Object]"geçerli bir numaraya dönüştürülemez.
TJ Crowder

4

Konsol ile ilgili olarak Chrome 54'ten itibaren:

📎- "Bu bloğu sizin için bir nesneye dönüştürdüm" -Clippy Ne yazık ki, Clippy teklifini kendim ekledim. Konsol sizin için ne yaptığı hakkında hiçbir bilgi vermez.

Yeni kurallar, bu 2 zor çizelgeyi zahmetli bir şekilde yazarak veya Nesne Değişmezlerini konsola yapıştırmadan önce bizi zor bir şekilde kurtaracak kadar basit :o=0,

  • Şununla başlayan bir kodunuz varsa: isteğe bağlı boşluk, (yorumlara izin verilmez) ve ardından a {;
  • ve bu kod bir nesne olarak yorumlanabilir;
  • ve şu nesnenin ardından başka hiçbir kod gelmez:
  • ilk nesneden sonraki kod bir ikili işleçtir,
  • gruplamalar dahil olmak üzere istediğiniz kadar çok işlem olabilir
  • ancak, son operatörün sağ pozisyonda bir Nesne hazır bilgisi olması koşuluyla;
  • ve nihai Nesne parens içinde gruplandırılmadı
  • ve bu kod noktalı virgülle sonlandırılmaz
  • ve kodu izleyen hiçbir yorum yoktur (başlangıç ​​veya nihai konumda olmadıkları sürece dahili yorumlara izin verilir)
  • ancak ancak bundan sonra JavaScript'iniz (gerçekte geçerli bir kod olabilir veya olmayabilir) geçerli bir Nesne olarak yeniden girilecektir. Kodunuzun yeniden yorumlandığı konusunda bilgilendirilmeyeceksiniz.

{wat:1}),({wat:2} Sonunda yine bir hatadır.

{let i=0;var increment=_=>i++} son olarak doğru şekilde izin verilir, bu da kapanış yapmanın oldukça güzel bir yoludur.

Ancak, aşağıdaki yanlış bir nesne, bu @Bergi tarafından belirtildiği gibi kolaylık, JS size yardımcı olmak için yanlış yorumlar! Spesifikasyonda, hiçbir şeye atanmamış bir gerçek değeri 1 olan "foo" etiketli bir ifadeye sahip bir blok olduğunu söylüyor.

{foo:1}

Yukarıdaki ile aynı olmalıdır

if(1) {
    foo: 1
}

Aşağıdakiler blok olarak doğru bir şekilde ele alınır ... çünkü önünde bir yorum vardır!

//magic comment
{foo:1}

Öyleyse bu:

{foo:1}
//also magic

Bu bir Nesnedir:

{foo:
//not so magic comment
1}

Bu bir hatadır

//not so magic comment
{foo:1}.foo

Öyleyse bu:

{foo:1}.foo

Bu iyi:

1..wat

undefined

Öyleyse bu:

['foo'][0]

Bir sonraki, ifade konumuna doğru sıkışmış bir nesne olarak doğru bir şekilde yorumlanır; 0,bu, genellikle bir ifade yerine bir ifadeye sahip olmamızı açıkça sağlar.

0,{foo:1}.foo

Onlar değer parens sarın neden anlamıyorum. JS'nin bazı saçma tasarım kararları var, ancak bu tek durumda daha güzel davranmaya çalışmak gerçekten bir seçenek değil, konsolun JS'yi doğru bir şekilde çalıştırması gerekiyor ve kromun sadece bizim düşündüğümüzü tahmin etmediğinden emin olmalıyız. gerçekten başka bir şey yapmak demekti.

Virgül operatörlerinden hoşlanmıyorsanız ödevi kullanabilirsiniz

x = {foo:1}.foo

Çünkü durduğu gibi

{} + {} + {}

"[object Object][object Object][object Object]"

;{} + {} + {}

"NaN[object Object]"

Çılgın ve tutarlı başa çıkabilirim ... çılgın ve tutarsız hayır teşekkür ederim!


REPL bir REPL dili değildir. Diğer şeylerin yanı sıra dize dizeleri de geçirir . Chrome REPL'in dilin kendisi tarafından yaptığı birkaç şey . Oldukça kullanışlıdırlar, bu yüzden sadece sade bir dille yapmadıkları için gerçekten memnunum.
gman

@gman A REPL Bir dize okur, Değerlendirir, Sonuçları yazdırır ve ardından bir sonraki dinamik kod parçasını okumaya hazırlar. Bağlantı verilen sayfadaki hiçbir şey geçersiz JavaScript değildi. Konsol bağlamında yer alan "$ _" değişkeni, açıkça yalnızca REPL'de anlamlı olan bir kolaylıktır. Bununla birlikte, "$ _" geçerli bir değişken adıdır, geri kalanı sadece normal işlevlerdir ve normal JavaScript ile çağrılan sınıflardır.
James Wakefield

Ne demek istediğinden emin değilim. Demek istediğim dil bir şey, içinde bulunduğu ortam başka. Cevabınıza bir örnek verdiniz. JS {foo:1}ve {foo:1}//aynı şeyi üretmek. Chrome JS REPL'de bunu yapmıyorlar. REPL sadece JS'yi değerlendirmekten daha fazlasını yapıyor. Dizeleri işliyor ve farklı şeylere karar veriyor.
gman

var x = eval('{a:1}')Geçerli JavaScript'te x artık 1'dir, daha sezgisel nesne {a: 1} değildir. Evet, bu garip, ama sadece dili değiştiremezsiniz çünkü garip şeyler yapar. JSON dizeleri dışındaki her şey JavaScript olarak yorumlanır ve değerlendirilir. 0,JSON yapıştırmadan önce yazmak zor değil, alternatif olarak dize kolaylık sağlamak için JavaScript yerine bir nesne olarak yorumlandığını bir uyarı ile mutlu olurdu.
James Wakefield
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.