Mengapa cara berikut ini berfungsi?
<something>.stop().animate(
{ 'top' : 10 }, 10
);
Padahal ini tidak berhasil:
var thetop = 'top';
<something>.stop().animate(
{ thetop : 10 }, 10
);
Untuk membuatnya lebih jelas: Saat ini saya tidak dapat meneruskan properti CSS ke fungsi animasi sebagai variabel.
Jawaban:
{ thetop : 10 }
adalah objek literal yang valid. Kode akan membuat objek dengan properti bernamathetop
yang memiliki nilai 10. Keduanya berikut ini sama:Di ES5 dan sebelumnya, Anda tidak bisa menggunakan variabel sebagai nama properti di dalam objek literal. Satu-satunya pilihan Anda adalah melakukan hal berikut:
ES6 mendefinisikan ComputedPropertyName sebagai bagian dari tata bahasa untuk objek literal, yang memungkinkan Anda untuk menulis kode seperti ini:
Anda dapat menggunakan sintaks baru ini di versi terbaru dari setiap browser utama.
sumber
eval()
tidak akan berfungsi di dalam objek literal untuk nama properti dinamis, Anda hanya akan mendapatkan kesalahan. Bukan hanya itu, tetapieval()
benar-benar tidak boleh digunakan untuk hal-hal seperti itu. Ada artikel yang bagus tentang penggunaan yang benar dan salaheval
: blogs.msdn.com/ericlippert/archive/2003/11/01/53329.aspx{[key] : "value"}
, jika kunci nol, itu akan memberikan{ null: "value"}
, sedangkan saya ingin hasilnya{}
Dengan ECMAScript 2015 Anda sekarang dapat melakukannya secara langsung dalam deklarasi objek dengan notasi tanda kurung:
Di mana
key
bisa segala jenis ekspresi (misalnya variabel) mengembalikan nilai.Jadi di sini kode Anda akan terlihat seperti:
Di mana
thetop
akan dievaluasi sebelum digunakan sebagai kunci.sumber
Kutipan ES5 yang mengatakan itu seharusnya tidak bekerja
Catatan: aturan telah berubah untuk ES6: https://stackoverflow.com/a/2274327/895245
Spec: http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.5
Ini berarti:
{ theTop : 10 }
sama persis dengan{ 'theTop' : 10 }
The
PropertyName
theTop
adalahIdentifierName
, sehingga akan dikonversi ke'theTop'
nilai string, yang merupakan nilai string'theTop'
.Tidak mungkin menulis inisialisasi objek (literal) dengan kunci variabel.
Tiga opsi hanya
IdentifierName
(memperluas string string)StringLiteral
,, danNumericLiteral
(juga memperluas string).sumber
thetop
adalahIdentifierName
, jadi mengapa itu tidak berhasil ? Pertanyaan itu masih terbuka.{a:1}.a
, jadia
jelas tidak memperluas nilai variabel dalam kasus pengenal. Tapi ya, menjelaskan lebih lanjut adalah perbaikan dalam kasus ini.Saya telah menggunakan yang berikut ini untuk menambahkan properti dengan nama "dinamis" ke objek:
key
adalah nama properti baru.Objek properti yang diteruskan
animate
adalah{left: 20, width: 100, top: 10}
Ini hanya menggunakan yang diperlukan
[]
notasi yang seperti yang direkomendasikan oleh jawaban lain, tetapi dengan lebih sedikit baris kode!sumber
Menambahkan braket persegi di sekitar variabel berfungsi baik untuk saya. Coba ini
sumber
Saya tidak dapat menemukan contoh sederhana tentang perbedaan antara ES6 dan ES5, jadi saya membuatnya. Kedua sampel kode membuat objek yang persis sama. Tetapi contoh ES5 juga bekerja di browser lama (seperti IE11), di mana contoh ES6 tidak.
ES6
ES5
sumber
Pembaruan 2020 / contoh ...
Contoh yang lebih kompleks, menggunakan tanda kurung dan literal ... sesuatu yang mungkin harus Anda lakukan misalnya dengan vue / axios. Bungkus literal dalam tanda kurung, jadi
sumber
Kode yang diberikan:
Terjemahan:
Seperti yang Anda lihat,
{ thetop : 10 }
deklarasi tidak menggunakan variabelthetop
. Sebaliknya itu menciptakan objek dengan nama kuncithetop
. Jika Anda ingin kunci menjadi nilai variabelthetop
, maka Anda harus menggunakan tanda kurung siku sekitarthetop
:Sintaks braket persegi telah diperkenalkan dengan ES6. Di versi JavaScript yang lebih lama, Anda harus melakukan hal berikut:
sumber
Saya tidak bisa percaya ini belum diposting: cukup gunakan panah-notasi dengan evaluasi anonim!
Sepenuhnya non-invasif, tidak mengacaukan namespace, dan hanya membutuhkan satu baris:
demo:
Tampilkan cuplikan kode
berguna dalam lingkungan yang belum mendukung
{[myKey]: myValue}
sintaks baru , seperti — tampaknya; Saya baru saja memverifikasi di Konsol Pengembang Web saya — Firefox 72.0.1, dirilis 2020-01-08.(Saya yakin Anda berpotensi membuat beberapa solusi yang lebih kuat / dapat diperluas atau apa pun yang melibatkan penggunaan yang cerdas
reduce
, tetapi pada saat itu Anda mungkin akan lebih baik dilayani dengan hanya membagi Obyek-penciptaan ke dalam fungsinya sendiri daripada secara kompulsif mengganggunya semua sebaris)bukan hal itu penting karena OP bertanya ini sepuluh tahun yang lalu, tapi untuk kelengkapan demi dan untuk menunjukkan bagaimana hal ini persis dengan jawaban atas pertanyaan seperti yang dinyatakan, saya akan menunjukkan ini dalam konteks aslinya:
sumber
Dengan cara ini Anda juga dapat mencapai hasil yang diinginkan
sumber
Implementasi ES5 untuk menetapkan kunci di bawah ini:
Saya telah melampirkan cuplikan yang saya gunakan untuk mengonversi ke objek kosong.
sumber
Anda dapat melakukan hal berikut untuk ES5:
Atau ekstrak ke suatu fungsi:
sumber
Jika Anda ingin kunci objek sama dengan nama variabel, ada tulisan singkat di ES 2015. Notasi baru di ECMAScript 2015
sumber
Anda dapat melakukannya dengan cara ini:
sumber
Anda juga dapat mencoba seperti ini:
sumber