Mengapa -1**2 kesalahan sintaks dalam JavaScript?

Dijalankan di konsol browser ia mengatakan SyntaxError: Unexpected token **. Mencoba itu di node:

> -1**2
...
...
...
...^C

Saya pikir ini adalah sebuah ekspresi aritmatika di mana ** adalah tenaga operator. Tidak ada masalah dengan operator lain.

Anehnya, mengetik */ pada baris kedua pemicu eksekusi:

> -1**2
... */
-1**2
  ^^
SyntaxError: Unexpected token **

Apa yang terjadi di sini?

Mengomentari pertanyaan (21)
Larutan

dijalankan di browser konsol kata SyntaxError: Unexpected token **.

Karena itu's spec. Dirancang seperti itu untuk menghindari kebingungan tentang apakah itu's kuadrat dari negasi dari satu (yaitu(-1) ** 2), atau negasi dari alun-alun dari satu (yaitu-(1 ** 2)). Desain ini adalah hasil dari diskusi yang luas dari operator didahulukan, dan pemeriksaan cara ini ditangani dalam bahasa lain, dan akhirnya keputusan itu dibuat untuk menghindari perilaku tak terduga dengan membuat ini sebuah kesalahan sintaks.

Komentar (15)

Dari dokumentasi pada MDN:

Di JavaScript, adalah mustahil untuk menulis sebuah ambigu eksponensial ekspresi, yaitu anda tidak dapat menempatkan operator unary (+/-/~/!/hapus/batal/jenis) segera sebelum dasar jumlah.

Alasan ini juga dijelaskan dalam teks yang sama:

Dalam banyak bahasa seperti PHP dan Python dan lain-lain yang memiliki eksponensial operator (biasanya ^ atau **), yang eksponensial operator didefinisikan untuk memiliki lebih diutamakan dari unary operator unary + dan unary -, tetapi ada beberapa pengecualian. Misalnya, di Bash ** operator didefinisikan untuk memiliki prioritas lebih rendah dari unary operator.

Sehingga untuk menghindari kebingungan itu diputuskan bahwa kode harus menghapus ambiguitas dan secara eksplisit menempatkan tanda kurung:

(-1)**2

atau:

-(1**2) 

Sebagai catatan, biner - tidak diobati dengan cara itu -- yang memiliki prioritas lebih rendah-dan begitu ekspresi terakhir memiliki hasil yang sama seperti ini ekspresi valid:

0-1**2

Eksponensial Didahulukan dalam Bahasa Pemrograman yang Lain.

Seperti yang sudah ditegaskan dalam kutipan di atas, sebagian besar bahasa pemrograman yang memiliki infix eksponensial operator, memberikan lebih diutamakan untuk itu operator dari ke unary minus.

Berikut ini adalah beberapa contoh lain dari bahasa pemrograman yang memberikan lebih diutamakan untuk operator unary minus:

Komentar (5)