var var1 = 1,
var2 = 1,
var3 = 1;
Ini sama dengan ini:
var var1 = var2 = var3 = 1;
Saya cukup yakin ini adalah urutan variabel didefinisikan: var3, var2, var1, yang akan setara dengan ini:
var var3 = 1, var2 = var3, var1 = var2;
Apakah ada cara untuk mengonfirmasi ini dalam JavaScript? Mungkin menggunakan beberapa profiler?
javascript
variables
variable-assignment
David Calhoun
sumber
sumber
this.var1 = this.var2 = this.var3 = 1
?Jawaban:
Sebenarnya,
adalah tidak setara dengan:
Perbedaannya adalah dalam pelingkupan:
Sebenarnya ini menunjukkan bahwa penugasan itu asosiatif yang benar. The
bad
contoh adalah setara dengan:sumber
var var1=var2
terjadi setelahvar3 = 1
dan sesudahvar2 = var3
. itu sepertivar3=1; var2=var3; var var1=var2
var v1, v2, v3;
Kemudian nanti:v1 = v2 = v3 = 6;
Mereka masih akan berada dalam lingkup lokal. Karena David menyebutkan peringatan, ini akan berfungsi seperti yang diharapkan (jika sebelum var'd):alert(v1 = v2 = v3 = 6);
Penugasan dalam javascript berfungsi dari kanan ke kiri.
var var1 = var2 = var3 = 1;
.Jika nilai dari salah satu variabel ini adalah
1
setelah pernyataan ini, maka secara logis itu harus dimulai dari kanan, jika tidak nilai atauvar1
danvar2
tidak akan ditentukan.Anda dapat menganggapnya setara dengan di
var var1 = (var2 = (var3 = 1));
mana set kurung paling dalam dievaluasi terlebih dahulu.sumber
(
segera memilikinyavar
. Menghapus set kurung luar memungkinkan untuk mengkompilasi tanpa kesalahanvar var1 = (var2 = (var3 = 1));
,. Pada saat itu saya merasa bahwa itu tidak menggambarkan hal itu dengan baik, tetapi saya kira itu sama.var var1 = var2 = var3 = 1;.
sama denganvar var3 = 1; var var2 = var3; var var1 = var2;
Dalam hal ini
var
kata kunci berlaku untuk ketiga variabel.yang tidak setara dengan ini:
Dalam hal ini
var
kata kunci di balik layar hanya berlakuvar1
karena pengangkatan variabel dan sisa ekspresi dievaluasi secara normal sehingga variabelvar2, var3
menjadi globalJavascript memperlakukan kode ini dalam urutan ini:
sumber
(a && b)
secara logis(a ? b : a)
dan berperilaku seperti multiplikasi (mis.!!a * !!b
)(a || b)
secara logis(a ? a : b)
dan berperilaku seperti penambahan (mis.!!a + !!b
)(a = 0, b)
kependekan dari tidak peduli jikaa
itu benar, secara implisit kembalib
Precedence Operator JavaScript (Urutan Operasi)
Perhatikan bahwa operator koma sebenarnya adalah operator yang paling tidak diistimewakan, tetapi tanda kurung adalah yang paling istimewa, dan mereka berjalan seiring ketika membangun ekspresi satu baris.
Pada akhirnya, Anda mungkin memerlukan 'thunks' daripada nilai-nilai yang dikodekan dengan keras, dan bagi saya, thunk adalah fungsi dan nilai yang dihasilkan ('hal' yang sama).
sumber
Coba ini:
Catat single '=' pada peringatan pertama. Ini akan menunjukkan bahwa hasil dari ekspresi penugasan adalah nilai yang diberikan, dan peringatan 2 akan menunjukkan kepada Anda bahwa penugasan memang terjadi.
Secara logis, tugas itu harus dirantai dari kanan ke kiri. Namun, karena ini semua atom ke javascript (tidak ada threading) mesin tertentu dapat memilih untuk benar-benar mengoptimalkannya sedikit berbeda.
sumber
Sudah jelas sekarang, bahwa mereka tidak sama. Cara untuk kode itu
Dan, bagaimana dengan biayanya? Persis sama dengan var, jangan biarkan assigment let membingungkan Anda karena ruang lingkup blok.
Kita bisa melakukan hal berikut:
Catatan: btw, saya tidak merekomendasikan menggunakan banyak tugas, bahkan beberapa deklarasi di baris yang sama.
sumber
coffee-script
dapat mencapai ini dengan penuh percaya diri ..sumber