javascript - Mengapa Array boleh memanggil kaedah secara langsung, tetapi objek Objek biasa tidak boleh?
phpcn_u1582
phpcn_u1582 2017-07-05 11:05:29
0
3
1335

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.

phpcn_u1582
phpcn_u1582

membalas semua(3)
学霸

Perbalahan inieval()解析'{}'道理一样,js解析代码会优先把{看成和function{}的大括号一样,会分开解析先解析{(开始),在解析}(结束)。这样的话当然会报错了。
eval()解析'{}'时是怎么办的,加个括号'({})';这样就会把{} 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()//报错
(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是发现后面还有.于是会把8.看成一个数,这样的话没加.toString ia sudah tentu salah.
Jadi tidak mengapa jika ia ditulis seperti ini

8..toString()// 正确
学习ing

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()却是出现语法错误,因为{}.toString()中的{}将会被看成一个语句块,而不是对象直接量.
因为 JavaScript 将从左到右解析{}.toString(),当遇到{时,它将会看做一个语句块的开始,之后遇到},语句块结束,在遇到. blok pernyataan

bukannya

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()
将可以正常工作.(注意包围在{}两边的括号).
因为当解析({}).toString()时,首先遇到( Dan jika anda menggunakan ({}).toString() ia akan berfungsi seperti biasa (Perhatikan kurungan yang mengelilingi {}).
Kerana apabila menghuraikan ({}).toString(), mula-mula jumpa (, kemudian
merawat bahagian di dalam kurungan sebagai ungkapan

, 🎜 mendapat objek kosong 🎜, jadi Ia adalah sah untuk melakukan panggilan kaedah pada objek kosong ini.🎜
小葫芦

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, 为什么字符串可以直接调用方法,Number类型、Boolean类型却不行。 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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan