Python'un satır sonlarını işlemesi JavaScript'in otomatik noktalı virgüllerinden ne kadar farklıdır?


41

Javascript, temelde çözümleyici geçersiz bir belirteçle karşılaşırsa ve bundan önceki son simge bir satır sonu olduğunda, ayrıştırıcı satır satırının bulunduğu bir noktalı virgül ekleyecektir. Bu, temelde tüm javascript kodunuzu noktalı virgül olmadan yazmanıza olanak sağlar, ancak çoğunlukla bir return anahtar kelimeniz varsa ve ardından yeni bir satırda döndürmek istediğiniz değer varsa, bazı son durumların farkında olmanız gerekir.

function test(){
    // This will return 'undefined', because return is a valid statement
    // and  "john" is a valid statement on its own.
    return 
          "john"
}

Bu yakalamalar nedeniyle, 'Otomatik noktalı virgül ekleme Kötülük'tür', 'Javascript'te her zaman noktalı virgül kullan' vb. Gibi başlıkları içeren düzinelerce makale vardır.

Ancak Python'da hiç kimse noktalı virgül kullanmaz ve tamamen aynı sözcüklere sahiptir.

def test():
    # This will return 'undefined', because return is a valid statement
    # and  "john" is a valid statement on its own.
    return 
    "john"

Aynı şekilde çalışır ve henüz hiç kimse ölümcül Pytons davranışından korkmaz.

Bence javascript'in kötü davrandığı durumlar, onlardan kolayca kaçınmanız için yeterince azdır. Yeni bir satıra + dönüş değeri? İnsanlar bunu gerçekten çok mu yapıyor?

Herhangi bir görüş? Javascript'te noktalı virgül kullanıyor musunuz ve neden?


3
Tamamen aynı şekilde çalışmıyor. Noktalı virgül ekleme, yeni satırın zorunlu olduğu yerlerde JavaScript’te olduğu yere gitmez. Bu Wikipedia sayfasındaki ikinci örneğe bakın . Noktalı virgül, yeni satırın bu örnekte olduğu yere eklenmez.
Reid

1
Demek istediğim noktalı virgül kullanmak ve bunları kullanmamak aynı şekilde çalışmak değildi, nokta javascript ve python'daki kenar durumlarının aynı olduğuydu. Neler olduğunu bilmek zorunda olduğunuz kesin birkaç vaka var. Konuyla ilgili okuduğum en iyi makale: inimino.org/~inimino/blog/javascript_semicolons
Einar Egilsson

4
Noktalı virgül kullanıyorum, aynı sebepten dolayı cümle sürelerini kullanıyorum. Tercümanın ifadelerinizi genellikle onlarsız ancak sadece kötü haliyle anlayabildiğinden emin olun.
JD Isa,

3
Örneklerinizde geçerli python yazmayı düşünebilirsiniz. Yorum göstergesi #`// 'değil.
Aaron Dufour

2
"açık her zaman gizli olduğundan daha iyidir"

Yanıtlar:


62

Bunun nedeni, Python'da yeni satırların kod satırlarını ayırmanın açık bir yoludur; Bu, tasarım gereğidir ve bu işlerin nasıl yürüdüğünü de düşünür. Sonuç olarak, python kodu herhangi bir özel açıklama sonu işaretçisi olmadan (yeni satır dışında) mükemmel bir şekilde okunabilir ve açıktır.

Javascript, diğer taraftan, ifadelerin her zaman noktalı virgülle sonlandırıldığı C-benzeri bir sözdizimi ile tasarlanmıştır. Dili hatalara daha toleranslı hale getirmek için, kodu daha doğru yapmak için fazladan noktalı virgüllerin nereye gideceğini tahmin etmeye çalışır. Bu, C benzeri bir sözdizimine retro-takılı olduğundan, her zaman beklendiği gibi çalışmaz (bazen kod yorumlayıcısı yanlış tahmin eder) ve oldukça karşı-sezgisel kod yapabilir.

Veya, "açık", örtük olmaktan daha iyidir "ifadesiyle tartışıyor: Python'da, yeni bir satır zaten açıktır; Javascript'te ise belirsizdir;


3
Oh, ve yorumlara geri alıntıları kullanarak kod koyabilirsiniz.
tdammers

1
: Otomatik noktalı virgül ekleme beklenmedik şeyler yapıyor sona erecek bir durumda iyi bir örnek şudur pastebin.com/aVeWGdya
HoLyVieR

5
Python'da kurallar oldukça basittir: kapatılmamış bir çok satırlı dize ("" ", '' '), kapatılmamış bir dikme ({}), kapatılmamış bir liste ([]) veya hemen ters eğik çizgi olmadıkça ifadeler satır sonları ile biter. Satırdan önce, javascriptte, kurallar çok daha karmaşıktır
Aaron Dufour

5
Hataların% 99'unun örtülmesi, yalnızca gerçekten bulunması zor olanları geride bırakmak için iyi bir yoldur. Onları python'da geride bırakmak sorun değil, çünkü problemlerin% 100'ünü kapsayan kolay kurallar var.
Aaron Dufour

1
@Aaron: "Kapatılmamış parantez kümesini (())" unuttun. (Parantezler sadece tote'ler için kullanılmadığı için kesinlikle "kapatılmamış bir tuple" değildir.)
JAB

28

Sanırım Python'da çalışma biçiminden oldukça temel bir fark var. Einar Egilsson görevinden alıntı: "eğer bir sonraki satırın ilk belirteci aynı ifadenin bir parçası olarak ayrıştırılabilir ise, satır sonunda bir noktalı virgül ima edilmez".

Python'da bir satır sonu, parantez içindeki bir ifadedeki gibi oldukça belirgin olan durumlar dışında her zaman ifadeyi sonlandırır. Diğer taraftan, JavaScript, ifadeyi sonlandırmadan önce olabildiğince fazla satır ayrıştırmaya çalışacak ve potansiyel olarak aşağıdakilere yol açacaktır:

// Define a function and name it area.
area = function(r) {
    return r * r * 3.14159
}

// Fooled you! We're actually invoking it.
(14)

8
Şimdi bu konuda eğlenceli bir twist. 14 gibi bir şey ile değiştirin (a + 1) ? do_something() : do_something_else();ve aniden, alanın geri dönüş değerine ayarlanır do_something()ya da do_something_else()kafanız karıştı.
Reid

20

JS-Dosyalarımı üretim modunda sıklıkla küçültüyorum. Yorum ve satır engellerini kaldırmak anlamına gelir.

Noktalı virgül kullanmadan, bu Javascript'imi bozar.


8
Tamam, bu geçerli. Ancak minimizeriniz gerçek bir ayrıştırıcı ise, gerektiği şekilde tekrar yerleştirebilir. Veya sadece satır çizgilerini kaldırmayın, => satır çizgilerini koruyorsunuz, noktalı virgülleri kaybedersiniz, kabaca aynı sayıya sahipler, böylece hiçbir şey kaybedilmez.
Einar Egilsson

2
@Einar Egilsson Kapatma Derleyicisi gerçekten bunu yapar.
seriousdev

1
Her şey eşit olmak üzere, yeni satır noktalı virgülle aynı bayt sayısıdır. Küçültücünüz tüm yeni çizgileri soyabilir, ancak daha sonra noktalı virgül olmasını gerektirir. Eşit bir değişim.
Logan Bailey

3
@Logan: Elbette bir baytlık yeni hat varsayarsak ;-)
Cameron

1
Elbette, Javascript yerine Python kullanıyor olsaydık, aynı şeyi yapmak için WAY'ı daha az kodlamamız gerekirdi, bu yüzden yarı-kolonlerin girintiden daha az bir kaç bayt kullanması bir tartışma noktasıdır.
BlueRaja - Danny Pflughoeft

5

Tanımladığınız gibi çalışmıyor.

Javascript, temelde çözümleyici geçersiz bir belirteçle karşılaşırsa ve bundan önceki son simge bir satır sonu olduğunda, ayrıştırıcı satır satırının bulunduğu bir noktalı virgül ekleyecektir.

Bu yanlış. Örnek:

return
  1 + 2;

1Tamamen geçerli bir simgedir, ancak ayrıştırıcı yine de hemen sonra noktalı virgül ekler return.

Gördüğünüz gibi bir noktalı virgülün nerede olacağını tam olarak söyleyemezsiniz.

Otomatik ekleme ile ilgili sorun iki yönlüdür:

  • Birincisi, insanlar otomatik ekleme işleminin eklenmesi gerektiğini belirleyemediği bir noktalı virgül bırakabilirler.
  • Ayrıca, bir noktalı virgül, amaçlanmadığı yere, yukarıdaki gibi eklenebilir.

Elbette, her ifadeden sonra noktalı virgül kullanmak yalnızca ilk hata kaynağına yardımcı olur.

Her halükarda, şu ana kadar tahmin edebileceğiniz gibi, C-benzeri sözdizimine otomatik noktalı virgül yerleştirmenin kötü bir fikir olduğuna inanıyorum.


1
ECMA Script spec, hangi durumlarda bir iki nokta üst üste yerleştirileceğini açıkça belirtir, bu nedenle "Tam bir noktalı virgülün nerede olacağını tam olarak söyleyemezsiniz" satırınız hatalı olur. Mesele şu ki, bazı durumlarda sezgisel değildir, nasıl çalıştığını anlamayan birine öğretmeyi zorlaştırır.
zzzzBov

1
@zzzzBov: Evet, kesin bir şartname var, ancak kodlama sırasında gerçekten tüm vakaları göz önünde bulunduran var mı? Emin misiniz? Programcılar tembel ve haklı olarak öyle; daha basit bir kuralın ne zaman yapacağı gibi karmaşık bir kuralı hatırlamak istemiyorlar. Bu yüzden hatırlamak zorunda kalmaya çalışırlar.
Svante

Yarı-kolon yerleştirilmesinin büyük ölçüde gereksiz olduğuna katılıyorum. Ben sadece "noktalı virgüllerin nereye gittiğine dair hiçbir fikriniz yok" ile "noktalı virgül sokma için spesifik olmayan bir
sezgisel

1
@Svante: Ancak geri dönüş örneği bize bu kuralları zaten bilmemiz gerektiğini gösteriyor. Orada bir noktalı virgül kullandınız, ancak istediğiniz şeyi yapmanıza yardımcı olmadı. Bu nedenle, dilin bu özelliği olduğu göz önüne alındığında, (1) Her yere noktalı virgül yazma ve kuralları bilme seçeneğine sahibiz, böylece ne olacağını anlarız (2) Her yere noktalı virgül yazma ve ne olacağını anlayabilmemiz için kuralları anlama. Bu seçenek göz önüne alındığında, noktalı virgül atlamayı tercih ederim
Einar Egilsson

4

Basit bir neden belirteyim:

Javascript "kinda java-ish" ya da "kinda C-ish" yazıyor. Elbette dinamik bir dil yani farklı görünüyor ... ama onunla yüzleş - Diş telleri var. Diş teli olan dillerin genelde noktalı virgülleri vardır. Doğal refleksler vurur ve vurmadan önce parmağınızı noktalı virgül tuşuna doğru yönlendirir Enter.

Python, aksine, bir bakışta bile tamamen farklı görünüyor. Bu nedenle, "standart sıkıcı diller" ile çok az veya hiç analoji sezgisel olarak oluşturulmuştur ve biri "piton moduna" girdiğinde, noktalı virgül eksikliği doğal olarak ortaya çıkmaktadır.


2

Bir dizi olan iyi nedenler olup JavaScript kullanımı yarı kolon sokulmasından.

Öncelikle, ECMAScript standardında tanımlandığı gibi yarı-kolon eklenmesi bazı durumlar için sezgisel olmadığı içindir. @Svante return, newline kullanımının sorunlara neden olacağı bir durumu belirtir .

Bahsetmediği şey, noktalı virgül kullanıyor olmanız durumunda da sorunlara neden olacağıdır;

Bir başka çok iyi neden olmayan , yarı-kolon ekleme kullanımı çıkış kontrolüdür. Çoğu durumda JavaScript, üretimde kullanılmadan önce küçük bir kullanıcı tarafından çalıştırılır. Bazı küçük elemanlar otomatik yarı kolonlu yerleştirme kasalarını kaldırabilir, ancak mükemmel şekilde çalışmasına güvenmek için bir neden görmüyorum

Ek olarak, içerik yönetimi sistemleri için satır içi JavaScript otomatik olarak küçültülebilir ve otomatik minifier'in yorumları kaldırdığı ve boşlukları (yeni satırlar dahil) her satırın başından ve sonundan düzelttiği birkaç durum gördüm.

Hangi araçların seçildiğini seçme şansı olmayan yazarlar için, çoğu durumda çalışan bir formata uymak çok daha kolaydır.


Özür dilerim, ama üçüncü paragrafı ile ilgili olarak, ben bunu söz benim ikinci-to-son cümlede. :)
Svante

Evet, takımlama meselesi geçerlidir (her ne kadar iyi uyarıcılar bunu yapmalı, örneğin Closure derleyicisi). Ancak bence 'dönüş' örneği gibi şeylerden kaçınmak için bu kuralları yine de bilmemiz gerekiyor. Kuralları bir kez öğrendiğimde, özellikle kodu (IMO) daha okunabilir hale getirdiğinden bu özelliği kullanabilirim.
Einar Egilsson

1

Noktalı virgül kullanmamak, JavaScript dosyalarınızı küçültdüğünüzde başarısız olmanın bir reçetesidir. Bu yüzden ondan korkuyorum.


1

Javascript'te, otomatik noktalı virgül yerleştirme olmadığında sözdizimsel olarak doğru olan bir program yazabilirsiniz ve ASI bu programı sözdizimsel olarak doğru farklı bir programa dönüştürür (örneğin, değeri döndüren bir kodu döndüren kodu dönüştürür). Python'da benzer bir durum yoktur. Python herhangi satır olabilir bir bildiri sona olacak o yerde ters eğik çizgi sürece, bir bildiri bitirmek. Teknik olarak, Javascript'in kurallarının aynı şekilde deterministik olduğunu varsayalım;


1

Çoğu durumda, JavaScript'in ASI'si beklendiği gibi işleri yerine getirir. ASI'nin bir örneği belki de beklediğiniz gibi davranmamaktır:

var i = 0

(function() {
   // do something
})()

Bu, işlevi 0anonim işlevle çağırmak ve ardından sonucu çalıştırmak olarak yorumlanacaktır. Bu durumda muhtemelen bir ödev yapmak istediniz, sonra anonim işlevi hemen çalıştırın.

ASI'ye aşina olmayan biri için bu gibi sorunlarla karşılaştığınızda kafa karıştırıcı olabilir, bu yüzden ekibimdeki geliştiricilere noktalı virgül kullanmaları her zaman önerilir.

(Bir yana: Kişisel / yan projeler üzerinde çalışırken noktalı virgül kullanmıyorum çünkü kodun başka kimsenin korunmasına gerek olmayacak.)


1

Senin gibi, bence biraz paranoyak. Noktalı virgül ekleme kuralları, JavaScript'te, Python ve CoffeeScript'te olduğu gibi iyi tanımlanmıştır. Kimse Python veya CoffeeScript'i noktalı virgülle beslemiyor, öyleyse JavaScript neden farklı davranıyor?

Bence yaklaşık on yıl önceki tipik JavaScript kodunun rezalet durumuna aşırı bir tepki - JavaScript zayıf, hatalı, çirkin, iyi bir dil değildi. Utanç vericiydi. JavaScript’te iyi bir kod yazamazsınız!

Sonra, insanlar gelip bunu kanıtlamaya çalıştı olabilir JavaScript güzel, berrak kod yazmak. " Her zaman noktalı virgül kullan" kuralı bu dalganın bir parçasıydı. Ve dürüst olmak gerekirse, birkaç durumu biraz daha netleştirebilir.

JavaScript neden hala farklı muamele görüyor?

Atalet var. Ve açıkça yapılandırılmış kodu takdir eden insanların genellikle C tarzı dilleri tercih ettiği de göz ardı edilmemelidir . Örtük şekilde yapılandırılmış kodu takdir edenler, çoğu zaman C tarzı olmayan dillere (CoffeeScript gibi) geçer.


0

Onları Javascript'te kesinlikle tutarlılık için kullanıyorum. Çoğu satır varsa

Python, tek bir satırda çoklu ifadeler gibi son durumlar için onları kullanmaktadır, javascript bunlarda vardır ve bunları düzenli kullandıklarını göreceğiniz için kullanıldığı normlara uyuyorum.

Aynı satırda birden fazla ifade için bir kullanım bulamıyorum ve bu nedenle noktalı virgül kullanmayı öngörmüyorum.


Evet, Python örneğini düzelttim. Fakat mesele şu ki, Python'un noktalı virgülleri de var, bunları her açıklamadan sonra bekliyoruz (ve her satırda birden fazla varsa), ancak insanlar bunları kullanmıyor.
Einar Egilsson

0

Web uygulamanız için bundle-fu ve varlık yöneticisi gibi bir şey kullanırsanız, javascript'te token sonunda bir noktalı virgülle karşılaşmazsa korkunç derecede kırılır. Yani bir tane koymak iyi bir uygulamadır.


Büyük üç, YUI Kompresörü, Kapatma Derleyicisi ve UglifyJS, hepsi noktalı virgül yerleştirme işlemi yapar. JSMin'in yakut limanının sorun yaşamasına şaşırmadım.
Benjamin Atkin

0

IE'nin tam sürümünü hatırlayamıyorum, ancak bir noktalı virgül eksikse IE'nin tam anlamıyla hata vereceği bazı durumlar vardır. IIRC, global kapsamda şöyle bir şey olduğunda:

var myFunc = function() {
  ...
}

Eklemezseniz; kapanış ayraçtan sonra, program aslında bazı IE sürümlerinde başarısız olacaktır. Diğer nedenlerle birlikte (Crockford'un onları her zaman açıkça kullanma önerisi dahil), her zaman her zaman açıkça kullanmamı sağladı.

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.