Bisakah seseorang, tolong, jelaskan kepada saya mengapa kasus pertama tidak menimbulkan kesalahan di sini?

const target = {}

console.log("I won't throw: ", target.some?.property[0])

const value = target.some?.property
console.log("I will throw: ", value[0])

Berikut ini contoh kotak pasir: https://codesandbox.io/s/dark-currying-wb27l

1
user3210641 18 April 2020, 03:37

1 menjawab

Jawaban Terbaik

Notasi kurung memiliki prioritas operator yang sama dengan notasi titik. Mereka melakukan hal yang sama persis. Cara lain untuk melihatnya adalah bahwa yang berikut ini tidak akan melempar:

const target = {}

console.log("I won't throw: ", target.some?.property.someProperty);

Kecuali dengan [0] bukan someProperty.

Jika rangkaian opsional ?. berhenti pada titik tertentu, akses properti lebih lanjut tidak akan terjadi, dan seluruh ekspresi dievaluasi menjadi undefined.

Berlawanan dengan

const value = target.some?.property
console.log("I will throw: ", value[0])

Di sini, value ditetapkan undefined, karena some tidak ada. Kemudian, value[0] muncul karena Anda tidak dapat mengakses properti undefined.

Dengan rantai opsional, akses properti lebih lanjut akan terjadi, dalam ekspresi yang sama, jika rantai berhasil. Dalam ekspresi yang sama, jika rantai gagal, akses properti lebih lanjut tidak akan terjadi. Tapi itu hanya ketika mempertimbangkan ekspresi yang sama. Setelah ekspresi yang berisi rangkaian opsional telah dievaluasi (di sini, ia ditugaskan ke variabel), logika khusus yang disediakan oleh rangkaian opsional tidak lagi berlaku.

0
CertainPerformance 18 April 2020, 00:39