Chrome 49 artık çıkışları bugün fark NaN
yazarken {}+{}
konsoluna. Bunun yerine dizeyi çıktılar [object Object][object Object]
.
Bu neden? Dil değişti mi?
Chrome 49 artık çıkışları bugün fark NaN
yazarken {}+{}
konsoluna. Bunun yerine dizeyi çıktılar [object Object][object Object]
.
Bu neden? Dil değişti mi?
Yanıtlar:
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 ).
{a:1}),({b:2}
bir nesne üretmemeli, bir hata atmalıdır.
)
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.
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.
{} + {}
"temizlenmiş" değil ne zaman ({} + {})
olarak kabul edilir + {}
, çünkü {}
boş blok olarak ayrıştırılır.
{}
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 toString
sonuçlanan bu durumda "[object Object]"
biz olsun) ve +"[object Object]"
olduğu NaN
için "[object Object]"
geçerli bir numaraya dönüştürülemez.
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,
{
;{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!
{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.
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.
var e = {}; e.toString()
ve ne demek istediğimi göreceksiniz