Hari ini, ketika saya secara acak membaca buku pola JavaScript O'Reilly, saya menemukan satu hal yang menarik (halaman 27 untuk referensi).
Dalam Javascript, dalam beberapa kasus, terdapat perbedaan jika lokasi awal brace berbeda.
function test_function1() {
return
{
name: 'rajat'
};
}
var obj = test_function1();
alert(obj); //Shows "undefined"
Sementara
function test_function2() {
return {
name: 'rajat'
};
}
var obj = test_function2();
alert(obj); //Shows object
Apakah ada bahasa lain di luar sana yang memiliki perilaku seperti itu? Jika demikian, maka saya pasti harus mengubah kebiasaan saya .. :)
Saya terutama peduli tentang PHP, C, C ++, Java, dan ruby.
javascript
language-agnostic
programming-languages
language-design
Rajat Singhal
sumber
sumber
Jawaban:
Setiap bahasa yang tidak bergantung pada titik koma (tapi bukan pada baris) atas laporan membatasi berpotensi memungkinkan ini. Pertimbangkan Python :
>>> def foo(): ... return ... { 1: 2 } ... >>> def bar(): ... return { 1: 2 } ... >>> foo() >>> bar() {1: 2}
Anda mungkin dapat membuat kasus serupa dalam Visual Basic tetapi di luar kepala saya, saya tidak tahu bagaimana karena VB cukup membatasi di mana nilai dapat ditempatkan. Tetapi hal berikut seharusnya berfungsi, kecuali penganalisis statis mengeluh tentang kode yang tidak dapat dijangkau:
Try Throw New Exception() Catch ex As Exception Throw ex.GetBaseException() End Try ' versus Try Throw New Exception() Catch ex As Exception Throw ex.GetBaseException() End Try
Dari bahasa yang Anda sebutkan, Ruby memiliki properti yang sama. PHP, C, C ++ dan Java tidak hanya karena mereka membuang baris baru sebagai spasi, dan memerlukan titik koma untuk membatasi pernyataan.
Berikut kode yang setara dari contoh Python di Ruby:
>> def foo >> return { 1 => 2 } >> end => nil >> def bar >> return >> { 1 => 2 } >> end => nil >> foo => {1=>2} >> bar => nil
sumber
Throw
danex.GetBaseException()
merupakan garis logis yang terpisah. Lebih khusus lagi, karena Basic secara historis menggunakan baris untuk membatasi pernyataannya, "gotcha" kemungkinan besar akan menjadi situasi di mana programmer mengira dia membuat pernyataan baru pada baris logis baru, tetapi belum.Penerjemah JavaScript secara otomatis menambahkan a
;
di akhir setiap baris jika tidak menemukannya (dengan beberapa pengecualian, tidak masuk ke sini :).Jadi pada dasarnya masalahnya bukanlah lokasi kurung kurawal (yang di sini mewakili literal objek, bukan blok kode seperti dalam kebanyakan bahasa), tetapi "fitur" kecil ini yang memaksa contoh pertama Anda ke
return ;
=>undefined
. Anda dapat memeriksa perilakureturn
di spesifikasi ES5 .Untuk bahasa lain yang memiliki perilaku serupa, lihat jawaban Konrad .
sumber
undefined
untuk dikembalikan. Saya menulis sedikit tentang bahasa lain yang diawali dengan afaik , jadi ambillah dengan sebutir garam :).Hampir dipastikan. Bahasa pemrograman go Google menunjukkan perilaku yang sangat mirip (meskipun dengan efek yang berbeda). Seperti yang dijelaskan di sana:
Secara diam-diam, saya pikir Rob Pike hanya menginginkan alasan untuk meminta One True Brace Style.
sumber
Jawaban atas pertanyaan itu cukup mudah. Bahasa apa pun yang memiliki "penyisipan titik koma otomatis" mungkin bermasalah di baris itu. Masalahnya dengan ini
return { name: 'rajat' };
..adalah mesin js akan memasukkan titik koma setelah
return;
pernyataan (dan oleh karena itu, kembaliundefined
). Contoh ini adalah alasan yang baik untuk membuka tanda kurung kurawal selalu di sisi kanan dan tidak pernah di sisi kiri juga. Karena Anda sudah memperhatikan dengan benar, jika ada tanda kurung kurawal di baris yang sama, penerjemah akan memperhatikan itu dan tidak bisa memasukkan titik koma.sumber
FWIW, JSLint melaporkan beberapa peringatan dengan sintaks tersebut:
$ jslint -stdin function foo(){ return { x: "y" }; } ^D (3): lint warning: unexpected end of line; it is ambiguous whether these lines are part of the same statement return ........^ (3): lint warning: missing semicolon { x: "y" }; ..^ (3): lint warning: unreachable code { x: "y" }; ..^ (3): lint warning: meaningless block; curly braces have no impact { x: "y" }; ..^ (3): lint warning: use of label { x: "y" }; .....^ (3): lint warning: missing semicolon { x: "y" }; ...........^ (3): lint warning: empty statement or extra semicolon { x: "y" }; ............^ 0 error(s), 7 warning(s)
sumber
Bahasa pertama di mana saya menemukan ini adalah awk (yang juga memiliki bagian sintaks "keanehan"; titik dua opsional, penggabungan string hanya menggunakan spasi dan seterusnya ...) Saya pikir para desainer DTrace, yang berdasarkan sintaks D secara longgar di awk, sudah cukup akal untuk TIDAK menyalin fitur ini, tetapi saya tidak dapat mengingatnya. Contoh sederhana (menghitung jumlah tag ENTITY di DTD, dari Mac saya):
$ cat printEntities.awk # This prints all lines where the string ENTITY occurs /ENTITY/ { print $0 } $ awk -f printEntities.awk < /usr/share/texinfo/texinfo.dtd | wc -l 119
Jika skrip kecil ini malah ditulis dengan tanda kurung pada satu barisnya sendiri, inilah yang akan terjadi:
$ cat printAll.awk # Because of the brace placement, the print statement will be executed # for all lines in the input file # Lines containing the string ENTITY will be printed twice, # because print is the default action, if no other action is specified /ENTITY/ { print $0 } $ awk -f printAll.awk < /usr/share/texinfo/texinfo.dtd | wc -l 603 $ /bin/cat < /usr/share/texinfo/texinfo.dtd | wc -l 484 $
sumber