Em chào anh/chị,
Em đã học javascript được 2 tháng, anh chị có thể đóng vai HR phỏng vấn em một vài câu hỏi liên quan đến javascript để em review lại kiến thức được không? Cũng như để em kiểm tra lại xem có mất gốc và vững căn bản chưa. Em xin được trả lời mọi câu hỏi liên quan đến javascript mà không tra google ạ.
Em nghĩ chắc cũng có nhiều người cùng câu hỏi, mong là topic này được SEO trang 1 công cụ tìm kiếm.
Em cam ơn!
JS và java đề có thể lập trình OOP, JS trước phiên bản ES6 lập trình OOP theo prototype tức mọi object sẽ được kế thừa các thuộc tính từ prototype cha. Từ ES6 trở về sau JS có thêm class, extend.
Vào thập niên 90 cả js và java đều cùng 1 cty netscape phát triển, tên gọi là Javascript để marketing chứ không liên quan gì nhau.
Khác:
Js là dynamic type: khai báo biến không cần chỉ định kiểu dữ liệu, java là static type.
JS chạy nhanh hơn vì có trình biên dịch JIT, java phải biên dịch ra byte code.
Giống:
Nodejs được viết dựa trên C++ và javascript, các framework chạy trên nodejs cũng được viết bằng javascript.
Khác
Nơi code được thực thi:
– nodeJS chạy ở server.
– javascript chạy ở trình duyệt các framework javascript chạy được trên server, thiết bị nhúng, di động, app desktop, …
JS là ngôn ngữ lập trình còn nodejs là runtime environment để thực thi javascript.
Nodejs chỉ chạy được trên V8 engine còn javascript chạy trên được nhiều trình duyệt khác nhau, mỗi trình duyệt lại có 1 engine khác nhau.
Đây là 3 thành phần thiết yếu tạo nên trang web.
HTML để cho trang web có cấu trúc, làm bộ khung cho web.
CSS để căn lề, làm layout, màu sắc, hiệu ứng, … cho các element HTML và để làm đẹp cho web.
JS để làm cho web trở nên động bằng cách tương tác với các thành phần khác:
– JS tương tác với DOM: thêm sửa xoá get value element HTML, …
– JS tương tác với browser, xử file user, …
– JS gửi và nhận dữ liệu giữa client và server, fetch data từ server để cập nhật lại web.
theo mong đợi của cá nhân mình, nếu là pv fresher, thì không biết cứ nói không biết, không cần phải cố nghĩ ra điều gì đó để “trả lời được”
java và javascript chỉ giống nhau cái tên có chữ java chứ không liên quan nhau, còn lịch sử cty nào, bla bla thì cứ kệ
js không sinh ra để phục vụ oop, code oop bằng js đến hiện tại cũng chỉ để các ông loè nhau mà thôi, không cần phải đưa vào câu trả lời làm gì, chỉ gây loãng, làm người hỏi có cảm giác bạn đang chém gió
bạn có thể cho mình biết là kiến thức này đến từ đâu không?
sẽ hay hơn nếu có những thông tin này
interpreter language vs compiler language
single thread vs multithread (ở đây ý muốn nói java có thể code được multithread)
vì bạn đã nghĩ sai về nodejs (nodejs là platform, không phải ngôn ngữ), nên những câu liên quan đến việc nơi code thực thi đều vô nghĩa
js trên js engine, ở đâu có js engine là ở đó chạy được code js (không nhất thiết phải là engine v8, ví dụ như
trình duyệt safari xài engine khác)
câu này không đúnng, runtime environment là v8, chỉ là một phần của nodejs
tương tự, câu này và nhiều câu khác bạn đều nhầm lần nodejs là ngôn ngữ lập trình
đoạn cuối khi nói về 3 thành phần, nghe hơi lý thuyết quá, mình mong đợi một câu trả lời đơn giản hơn
Ok mình tiếp nhé. Học JavaScript thì phải biết về bất đồng bộ rồi.
Callback giúp ích gì khi viết code bất đồng bộ?
Cho đoạn code sau, kết quả cho ra là gì? Giải thích.
function longTask() {
for (let i = 0; i < 1000000; i++)
console.log(i);
}
function runAsync(callback) {
console.log('Start');
callback();
console.log('Done');
}
runAsync(longTask);
Callback là truyền hàm A vào hàm B (A là tham số của B), tại một vị trí được chỉ định nào đó trong thân hàm B thì A sẽ được thực thi. Dùng callback để xử lý bất đồng bộ có nghĩa là javascript ưu tiên chạy các tác vụ đồng bộ thực thi trước nên các tác vụ bất đồng được xếp vào hàng đợi chạy sau, tại thời điểm hàm bất đồng bộ đó trả về kết quả thì cần phải có một cái gì đó để xử lý kết quả này nên cần tới callback. Dùng callback trong async còn có mục đích bắt các task async chạy theo đúng thứ tự mình muốn. A là callback của B, B(A) B chạy xong ra kết quả thì A mới được chạy.
Kết quả là :
Start
0
1
....
1000000
Done!
Giải thích: runAsync(longTask); này là lời gọi hàm để thực thi hàm runAsync và truyền longTask vào làm đối số (chỉ tham chiếu tới longTask ở phần khai báo bên trên chứ không chạy ngay). Trong lúc chạy runAsync, log Start trước, đến longTask() chạy in 0 => 1000000 rồi đến log Done.
Dạ em đọc trên mạng thấy bảo JIT là sự kết hợp của biên dịch và thông dịch nên chạy nhanh hơn các ngôn ngữ khác. Vậy sai là do javascript nhanh vì có JIT hay sai là javascript không dùng JIT anh?
Đoạn này chưa clear lắm. Ở đây bạn có nhắc tác vụ (task) đồng bộ và task bất đồng bộ, thì bạn hiểu sự khác nhau giữa 2 loại tác vụ này như nào? Lấy ví dụ. Và trong đoạn code của mình thì hàm nào là đồng bộ, hàm nào là bất đồng bộ.
Chuẩn rồi.
Việc A có chạy hay không là tùy vào B gọi callback lúc nào thôi. Không có chuyện B xong thì A mới được chạy. Giả sử có callback A đấy nhưng B nó không thích gọi thì sao.
Cuối cùng là tại sao đoạn code của mình không in ra như sau?
Thật ra em vẫn chưa rõ về bất đồng bộ lắm mặc dù em thấy nó xuất hiện ở nhiều ngôn ngữ chứ không phải mỗi JS, kiểu như các task diễn ra đồng thời song song cùng lúc. Theo em hiểu thì bất đồng bộ có nghĩa là tại 1 thời điểm trong khi task A đang chạy thì thực thi task B luôn không cần chờ task A xong.
Ví dụ soạn bài viết trên editor của web daynhauhoc, task upload hình ảnh sẽ phải tốn thời gian khá lâu vì file nặng, mạng yếu, chờ server trả link, … Nếu lập trình đồng bộ như bình thường thì user vừa submit ảnh thì web sẽ bị đứng không click, không sroll được, xong task xử lý ảnh thì mới được thao tác tiếp. Còn bất đồng bộ là trong khi task upload ảnh đang chạy thì user vẫn có thể gõ chữ tiếp, task upload chỉ hiện icon spinner xoay xoay khi nào xong thì update lại thành dấu tích. Trong lúc call API POST ảnh lên server thì những task khác hoạt động bình thường không bị block.
Em thấy đoạn code trên anh đặt tên hàm là runAsync nhưng em không nhìn ra bất đồng bộ chỗ nào hết, em chỉ thấy đây là hàm có sử dụng callback bình thường thôi. Trong even loop thì cả 2 hàm runAsync và longTask chỉ chạy trong ngăn xếp stack chạy theo thứ tự bình thường của hàm đồng bộ.
Thì như anh vừa nói callback phụ thuộc vào vị trí thực thi trong thân hàm cha
nên anh gọi callback() ở giữa console.log('Start') và console.log('Done') thì nó ra như này
Phần lấy ví dụ mình trông đợi một câu trả lời mang tính “diễn dịch”, từ tổng quát trước rồi lấy ví dụ cụ thể. Ở đây bạn có thể nói trong JS thì chỉ có các tác vụ IO mới là bất đồng bộ, ví dụ như gọi API, đọc file, database, API của browser,… Còn chạy code JS kiểu nào đi nữa cũng không bất đồng bộ được (mặc dù JS có những cơ chế hỗ trợ async).
js: ngôn ngữ lập trình, kiểu dữ liệu động, thông dịch, đơn luồng, gốc của nó là ngôn ngữ hướng cấu trúc, được tạo ra ban đầu là phục vụ cho các browser xử lý các chức năng như xử lý xự kiện, render dom, xử lý giao diện trên browser, vì html đơn thuần là ngôn ngữ đánh dấu chỉ có các tag, nên cần 1 ngôn ngữ kịch bản để xử lý sự kiện
java: ngôn ngữ lập trình, kiểu dữ liệu chặt chẽ (tĩnh), hỗ trợ đa luồng, là ngôn ngữ hướng đối tượng, vừa biên dịch vừa thông dịch, tạo ra để viết mọi thứ , từ ứng dụng, game, nhúng vào thiết bị điện tử, nó là 1 trong những ngôn ngữ đi đầu cho khái niệm viết 1 lần chạy mọi nơi chỉ cần có cài máy ảo, cần biên dịch về mã bytecode rồi mới chạy
còn việc chạy hơn hay chậm hơn phụ thuộc vào sự tối ưu code khi biên dịch, nên java khi biên dich thì đã đc tối ưu hóa để chạy nhanh hơn là đọc trực tiếp từng dòng từ file như js
js:là ngôn ngữ lập trình
nodejs:là framework đc xậy dựng lên để hổ trợ phát triển ứng dụng web viết bằng js
1 bên là ngôn ngữ, 1 bên là framework , nên mình thấy ngay từ khái niệm đã khác nhau rồi nên chúng ko giống nhau
html,js,css là 1 trong những thành phần tạo nên 1 trang web
html: như cái tên của nó ngôn ngữ đánh dấu siêu văn bản, đơn thuần là 1 văn bản có cấu trúc chỉ gồm các tag
css: định nghĩa các style cho các tag
js: đóng vai trò là 1 ngôn ngữ kịch bản để xử lý xự kiện cho trang web
ok, tôi hơi nhầm lẫn , vì nodejs nó chứa tất cả mọi thứ luôn bao gồm cả nền tảng hoạt động như trình thông dịch, không như các ngôn ngữ tĩnh như java,c# nó tách riêng phần nền tảng hoạt động ra khỏi cái khung
Người phỏng vấn: người duyệt web hay than phiền JavaScript chạy một hồi làm nặng máy, trình duyệt ngốn RAM. Là lập trình viên JavaScript bạn có thể dùng kỹ thuật nào đó tương tự như Garbage Collection để giải phóng bớt RAM?