Sebagai contoh, kita boleh mengisih tatasusunan seperti ini:
[1,2,3].sort()
Tetapi anda tidak boleh memanggil kaedah objek seperti ini:
{}.toString()
Selain itu, mengapa kaedah boleh dipanggil terus pada rentetan, tetapi tidak pada jenis Nombor dan Boolean?
Saya tahu sesuatu tentang rentetan Apabila memanggil kaedah rentetan, objek Rentetan sementara akan dijana Mengapa jenis Nombor dan Boolean tidak berfungsi.
Perbalahan inieval()
解析'{}'
道理一樣,js解析代碼會(huì)優(yōu)先把{
看成和function{}
的大括號(hào)一樣,會(huì)分開(kāi)解析先解析{
(開(kāi)始),在解析}
(結(jié)束)。這樣的話(huà)當(dāng)然會(huì)報(bào)錯(cuò)了。
而eval()
解析'{}'
時(shí)是怎么辦的,加個(gè)括號(hào)'({})'
;這樣就會(huì)把{}
dianalisis secara keseluruhan, dan kemudian ia menjadi objek.
Adapun "Mengapa rentetan boleh memanggil kaedah secara langsung, tetapi jenis Nombor dan Boolean tidak boleh"
Jenis Boolean boleh,
Bagi nombor, kaedah tidak boleh dipanggil secara langsung, itu juga sebab penguraian js, seperti
8.toString()//報(bào)錯(cuò)
(8).toString()// 正確
8.0.toString()// 正確
Kemudian mengapa, kerana tiada integer sebenar dalam js, dan integer diwakili oleh nombor titik terapung, jadi apabila js menghuraikan 8
是發(fā)現(xiàn)后面還有.
于是會(huì)把8.
看成一個(gè)數(shù),這樣的話(huà)沒(méi)加.
的toString
ia sudah tentu salah.
Jadi tidak mengapa jika ia ditulis seperti ini
8..toString()// 正確
Pertama sekali, idea anda salah Benda Objek Biasa boleh panggil kaedah Contohnya
var o = {};
o.toString(); // OK
Tetapi {}.toString()
mempunyai ralat sintaks, kerana {}
dalam {}.toString()
akan dibaca menjadi {}.toString()
卻是出現(xiàn)語(yǔ)法錯(cuò)誤,因?yàn)?code>{}.toString()中的{}
將會(huì)被看成一個(gè)語(yǔ)句塊,而不是對(duì)象直接量.
因?yàn)?JavaScript 將從左到右解析{}.toString()
,當(dāng)遇到{
時(shí),它將會(huì)看做一個(gè)語(yǔ)句塊的開(kāi)始,之后遇到}
,語(yǔ)句塊結(jié)束,在遇到.
blok pernyataan
objek literal.
Oleh kerana JavaScript akan menghuraikan {}.toString()
dari kiri ke kanan, apabila menemui {
, ia akan menjadi dianggap sebagai permulaan blok pernyataan Selepas menemui }
, blok pernyataan berakhir Apabila menemui .
, ralat sintaks akan berlaku.({}).toString()
將可以正常工作.(注意包圍在{}
兩邊的括號(hào)).
因?yàn)楫?dāng)解析({}).toString()
時(shí),首先遇到(
Dan jika anda menggunakan {}
).
Kerana apabila menghuraikan ({}).toString()
, mula-mula jumpa (
, kemudian merawat bahagian di dalam kurungan sebagai ungkapan
Mengenai {}.toString()
, seseorang telah menyatakannya dengan sangat jelas. Ini kerana enjin js akan menganggap {} sebagai tanda blok semasa menghuraikan. Walau bagaimanapun, saya merasakan bahawa ia adalah sangat pelik Saya telah mencuba beberapa pelayar pada Mac saya dan tidak ada masalah dengan masalah yang disebutkan oleh poster.
Apa yang saya nak tambah ialah soalan kedua poster tersebut, 為什么字符串可以直接調(diào)用方法,Number類(lèi)型、Boolean類(lèi)型卻不行。
Saya rasa anda mesti ada tersilap tempat.
var num = 1.2333;
var flag = true;
console.log({}.toString()) //[object, object]
console.log(num.toFixed(2)); //1.23
console.log(flag.toString()); //'true' 這里是字符串
Di sini, num ialah literal berangka dan bendera ialah nilai Boolean. Kedua-duanya boleh memanggil kaedah. Jika pengarang mengetahui sesuatu tentang rentetan, dia harus memahami bahawa jenis data asas tidak mempunyai atribut dan kaedah, hanya objek yang mempunyainya.
Tetapi mengapa kita boleh memanggil kaedah jenis data asas seperti memanggil kaedah objek? (cth: 'a bc'.trim())
Ini kerana apabila kaedah dipanggil pada nilai jenis data asas, js akan menukarnya menjadi objek pembalut sementara. Literal rentetan boleh memanggil sifat dan kaedah seperti objek rentetan (String baharu('abc')), dan literal berangka boleh memanggil sifat dan kaedah seperti objek berangka.
Sudah tentu, objek pembungkusan sementara ini hanya wujud pada masa kod dilaksanakan. Selepas kaedah dilaksanakan, objek sementara dimusnahkan serta-merta.
Jadi apa yang dikatakan oleh poster ialah mustahil untuk memanggil kaedah pada nilai jenis Nombor dan Boolean.