Phỏng vấn javascript. Điều gì sẽ được xuất ra bàn điều khiển? Giải thích vì sao. Câu hỏi lập trình chung

Nhiều như những gì bạn thích.

  • Bạn cần hiển thị một số loại thông báo dưới dạng cảnh báo, 3 giây sau khi tập lệnh được khởi chạy. Làm thế nào để làm nó?

Vì thế:

Hoặc như thế này:

  • Kế thừa trong JavaScript khác với kế thừa trong PHP như thế nào?

Không giống như PHP, nơi việc kế thừa có thể được thực hiện theo một cách, trong JavaScript có nhiều cách như vậy. Ở cấp độ ngôn ngữ, tính kế thừa trên nguyên mẫu được triển khai.

Trong JavaScript, mỗi đối tượng có thể có mối liên kết với một đối tượng khác - cái gọi là "nguyên mẫu". Trong trường hợp tìm kiếm một số thuộc tính (hoặc phương pháp) trong đối tượng ban đầu kết thúc không thành công, trình thông dịch cố gắng tìm thuộc tính (phương thức) có cùng tên trong nguyên mẫu của nó, sau đó trong nguyên mẫu của nguyên mẫu, v.v. Ví dụ: nếu chúng ta yêu cầu lệnh gọi tới obj.prop (hoặc hoàn toàn giống nhau, obj["prop" ]), JavaScript sẽ bắt đầu tìm kiếm thuộc tính prop trong chính obj, sau đó trong nguyên mẫu của obj, nguyên mẫu của nguyên mẫu obj, v.v. cho đến hết.

  • Cho một ví dụ về tính kế thừa trong JavaScript.

Ví dụ: để đối tượng "mèo" kế thừa từ đối tượng "động vật".Trong kế thừa trên nguyên mẫu, điều này được triển khai như một tài liệu tham khảo

Hoặc đây là một ví dụ chi tiết hơn một chút. MyType kế thừa từ Obj:


  • Một vài lời về các đối tượng trong JavaScript?

Các đối tượng (chúng cũng là mảng kết hợp, hàm băm) và cách làm việc với chúng trong JavaScript được triển khai khác với hầu hết các ngôn ngữ. Một đối tượng trong JavaScript là một đối tượng thông thường mảng kết hợp hay nói cách khác là "băm". Nó lưu trữ bất kỳ khóa => giá trị nào khớp và có một số phương thức tiêu chuẩn.

  • Phương thức đối tượng trong JavaScript là gì?

Một phương thức đối tượng trong JavaScript chỉ đơn giản là một hàm được thêm vào một mảng kết hợp.

  • Tại sao phải viết var trước một biến trong JavaScript?

Nếu bạn tạo một biến thông qua một phép gán thông thường, một “biến toàn cục” sẽ được tạo. Ví dụ:

Nếu bạn tạo một biến bằng từ var, thì một "biến cục bộ" sẽ được tạo và biến này sẽ không còn tồn tại khi hàm hoàn thành. Ví dụ:

  • Có hai chức năng:hàm f(a,b) ( trả về a+b )var f = function(a,b) ( return a+b ).Có sự khác biệt giữa chúng? Nếu vậy thì cái nào?

Có sự khác biệt trong khả năng hiển thị của chức năng. Phiên bản không phải var của hàm hiển thị ở mọi nơi trong phạm vi hiện tại. Bao gồm cả định nghĩa của hàm. Tùy chọn var gán một hàm cho một biến, do đó hàm này chỉ hiển thị sau khi được xác định.

  • Làm cách nào để tạo một mảng trong JavaScript?

Dưới đây là một số cách.

  • Có thể sử dụng hàm làm hàm tạo trong JavaScript không?

Như thế này:

  • Có bao nhiêu và những cấu trúc lặp nào trong JavaScript?

Ba: trong khi, trong khi và làm...trong khi.

  • Mã sẽ làm gì: ngắt dấu; ?

Sẽ thoát khỏi vòng lặp hiện tại hoặc khối chuyển đổi tại "đánh dấu ".

  • Có thể định nghĩa một mảng như thế này: var a = "a,b".split(",")?

Vâng, bạn có thể.

  • Cảnh báo (typeof null); là gì? ?

Sẽ hiển thị thông báo "đối tượng".

  • Và đây là: cảnh báo (null instanceof Object); ?

Sẽ hiển thị thông báo "false".

  • 0.1 + 0.2 == 0.3 ?

Không phải bởi vì giá trị được tính toán sẽ là 0,3000000000000000004. Đây là hiệu ứng của độ chính xác tính toán và không giới hạn ở JavaScript.

  • Alert(typeof NaN); là gì? ?

"Con số"

  • Đầu ra sẽ là gì cảnh báo (NaN === NaN); ?

"SAI"

  • Sự khác biệt giữa các thuộc tính bên trongHTML và bên ngoàiHTML là gì?

Thuộc tính InnerHTML của bất kỳ phần tử DOM nào đều chứa mã HTML bên trong phần tử đó. Khi đặt giá trị mới cho thuộc tính này, HTML bên trong mã được trình duyệt hiển thị lại.

bên ngoàiHTML gần giống như bên trongHTML, sự khác biệt là những gì nó trả về HTML đầy đủ yếu tố.

Ngoài ra, điều quan trọng cần lưu ý là InternalHTML được hỗ trợ bởi tất cả trình duyệt hiện đại và externalHTML được hỗ trợ trong IE (với một số khác biệt so với các trình duyệt khác), trong phiên bản mới nhất Opera và trong các trình duyệt dựa trên WebKit mới nhất (Safari, Chrome), nhưng không được hỗ trợ trong Firefox.

Đối với mã:

bên trongHTML sẽ trả về:

bên ngoàiHTML sẽ trả về:


  • Sự khác biệt giữa các toán tử == và === là gì?

Toán tử == so sánh về đẳng thức, nhưng === so sánh về danh tính. Ưu điểm của toán tử === là nó không chuyển hai giá trị về cùng một kiểu. Đây là lý do tại sao nó được sử dụng phổ biến.

  • Sự khác biệt giữa Object.getOwnPropertyNames() và Object.keys() là gì?

Object.getOwnPropertyNames() trả về các thuộc tính có thể đếm được và không đếm được từ một đối tượng hoặc mảng.

Object.keys() trả về các thuộc tính có thể đếm được từ một đối tượng hoặc mảng.

  • Cấu trúc ngôn ngữ nào có thể được sử dụng để kiểm soát luồng tập lệnh và theo dõi lỗi?

Điều này có thể thực hiện được bằng cách sử dụng cấu trúc try()... Catch()

  • Tại sao gọi a(); diễn ra thành công và lệnh gọi b(); đưa ra một thông báo lỗi?

Hàm a() được khởi tạo ở giai đoạn tải tập lệnh, như thể nó “bật lên” và hàm b được khởi tạo khi biến b được khai báo

  • Biến toàn cục là gì? Chúng được tạo ra như thế nào? Các vấn đề khi sử dụng biến toàn cục là gì?

Biến toàn cục là biến có sẵn (hiển thị) trong toàn bộ tài liệu, trái ngược với biến cục bộ (giới hạn trong khối Mã chương trình, trong đó nó được xác định)

Số đông Nhà phát triển JavaScript tránh sử dụng các biến toàn cục. Một trong những lý do - xung đột có thể xảy ra tên của các biến toàn cục và cục bộ. Ngoài ra, mã sử dụng biến toàn cục có thể khó bảo trì và kiểm tra hơn.

  • Bao đóng trong JavaScript là gì?

Nói một cách đơn giản thì đây là chức năng nội tại, I E. chức năng bên trong một chức năng.

Họ gọi đó là sự đóng cửa vì sau khi cha mẹ hoặc chức năng bên ngoài, mã nội bộ vẫn "tồn tại" trong trình thông dịch và có thể được thực thi. Sẽ không có lỗi xảy ra ngay cả khi hàm bên trong (đóng) sử dụng các biến từ hàm bên ngoài.Ví dụ: tính năng này có thể được sử dụng để tạo các hàm xử lý sự kiện:


  • Viết hàm lấy một chuỗi có tên tệp và trả về phần mở rộng (đoạn sau dấu chấm cuối cùng).

    • Nguyên mẫu trong javascript là gì?

    TRONG phác thảo chung nguyên mẫu là một thuộc tính cho phép bạn thêm thuộc tính vào các đối tượng hiện có; nó cũng được sử dụng để mô phỏng tính kế thừa lớp trong JavaScript. Một câu trả lời chi tiết được viết ở đây . Một lựa chọn khác là đề cập đến Prototype.js. Đây là một thư viện phổ biến bổ sung các khả năng OOP tiện lợi cho các chương trình JavaScript.

    • Bạn biết những phương pháp đính kèm trình xử lý sự kiện nào?

    Sự kiện có thể được thêm vào theo ba cách:

    • htmlElement.onclick = function(event) ( .... ) - bằng cách này bạn chỉ có thể thêm một trình xử lý
    • htmlElement.addEventListener("click", ...) - bằng cách này bạn có thể đính kèm một số trình xử lý, giữ nguyên thứ tự của các trình xử lý
    • htmlElement.attachEvent("on"+event_name, handler) - bạn cũng có thể đính kèm một số, không giữ nguyên thứ tự của các trình xử lý, không có quyền truy cập vào phần tử mà sự kiện được kích hoạt.

Nhiều như những gì bạn thích.

  • Bạn cần hiển thị một số loại thông báo dưới dạng cảnh báo, 3 giây sau khi tập lệnh được khởi chạy. Làm thế nào để làm nó?

Vì thế:

Hoặc như thế này:

  • Kế thừa trong JavaScript khác với kế thừa trong PHP như thế nào?

Không giống như PHP, nơi việc kế thừa có thể được thực hiện theo một cách, trong JavaScript có nhiều cách như vậy. Ở cấp độ ngôn ngữ, tính kế thừa trên nguyên mẫu được triển khai.

Trong JavaScript, mỗi đối tượng có thể có mối liên kết với một đối tượng khác - cái gọi là "nguyên mẫu". Nếu việc tìm kiếm một thuộc tính (hoặc phương thức) nhất định trong đối tượng nguồn không thành công, trình thông dịch sẽ cố gắng tìm thuộc tính (phương thức) có cùng tên trong nguyên mẫu của nó, sau đó trong nguyên mẫu của nguyên mẫu, v.v. Ví dụ: nếu chúng ta yêu cầu một gọi tới obj.prop (hoặc, hoàn toàn giống nhau, obj["prop"]), JavaScript sẽ bắt đầu tìm kiếm thuộc tính prop trong chính đối tượng obj, sau đó trong nguyên mẫu của obj, nguyên mẫu của nguyên mẫu của obj, v.v. cho đến hết.

  • Cho một ví dụ về tính kế thừa trong JavaScript.

Ví dụ: để đối tượng "mèo" kế thừa từ đối tượng "động vật".Trong kế thừa trên nguyên mẫu, điều này được triển khai như một tài liệu tham khảo

Hoặc đây là một ví dụ chi tiết hơn một chút. MyType kế thừa từ Obj:


  • Một vài lời về các đối tượng trong JavaScript?

Các đối tượng (chúng cũng là mảng kết hợp, hàm băm) và cách làm việc với chúng trong JavaScript được triển khai khác với hầu hết các ngôn ngữ. Một đối tượng trong JavaScript là một mảng kết hợp thông thường, hay nói cách khác là một "băm". Nó lưu trữ bất kỳ khóa => giá trị nào khớp và có một số phương thức tiêu chuẩn.

  • Phương thức đối tượng trong JavaScript là gì?

Một phương thức đối tượng trong JavaScript chỉ đơn giản là một hàm được thêm vào một mảng kết hợp.

  • Tại sao phải viết var trước một biến trong JavaScript?

Nếu bạn tạo một biến thông qua một phép gán thông thường, một “biến toàn cục” sẽ được tạo. Ví dụ:

Nếu bạn tạo một biến bằng từ var, thì một "biến cục bộ" sẽ được tạo và biến này sẽ không còn tồn tại khi hàm hoàn thành. Ví dụ:

  • Có hai chức năng:hàm f(a,b) ( trả về a+b )var f = function(a,b) ( return a+b ).Có sự khác biệt giữa chúng? Nếu vậy thì cái nào?

Có sự khác biệt trong khả năng hiển thị của chức năng. Phiên bản không phải var của hàm hiển thị ở mọi nơi trong phạm vi hiện tại. Bao gồm cả định nghĩa của hàm. Tùy chọn var gán một hàm cho một biến, do đó hàm này chỉ hiển thị sau khi được xác định.

  • Làm cách nào để tạo một mảng trong JavaScript?

Dưới đây là một số cách.

  • Có thể sử dụng hàm làm hàm tạo trong JavaScript không?

Như thế này:

  • Có bao nhiêu và những cấu trúc lặp nào trong JavaScript?

Ba: trong khi, trong khi và làm...trong khi.

  • Mã sẽ làm gì: ngắt dấu; ?

Sẽ thoát khỏi vòng lặp hiện tại hoặc khối chuyển đổi tại "đánh dấu ".

  • Có thể định nghĩa một mảng như thế này: var a = "a,b".split(",")?

Vâng, bạn có thể.

  • Cảnh báo (typeof null); là gì? ?

Sẽ hiển thị thông báo "đối tượng".

  • Và đây là: cảnh báo (null instanceof Object); ?

Sẽ hiển thị thông báo "false".

  • 0.1 + 0.2 == 0.3 ?

Không phải bởi vì giá trị được tính toán sẽ là 0,3000000000000000004. Đây là hiệu ứng của độ chính xác tính toán và không giới hạn ở JavaScript.

  • Alert(typeof NaN); là gì? ?

"Con số"

  • Đầu ra sẽ là gì cảnh báo (NaN === NaN); ?

"SAI"

  • Sự khác biệt giữa các thuộc tính bên trongHTML và bên ngoàiHTML là gì?

Thuộc tính InnerHTML của bất kỳ phần tử DOM nào đều chứa mã HTML bên trong phần tử đó. Khi bạn đặt giá trị mới cho thuộc tính này, mã HTML nội bộ sẽ được trình duyệt hiển thị lại.

bên ngoàiHTML gần giống như bên trongHTML, điểm khác biệt là nó trả về HTML đầy đủ của phần tử.

Ngoài ra, điều quan trọng cần lưu ý là InternalHTML được hỗ trợ bởi tất cả các trình duyệt hiện đại và externalHTML được hỗ trợ trong IE (với một số khác biệt so với các trình duyệt khác), trong phiên bản mới nhất Phiên bản Opera và trong các trình duyệt dựa trên WebKit mới nhất (Safari, Chrome), nhưng không được hỗ trợ trong Firefox.

Đối với mã:

bên trongHTML sẽ trả về:

bên ngoàiHTML sẽ trả về:


  • Sự khác biệt giữa các toán tử == và === là gì?

Toán tử == so sánh về đẳng thức, nhưng === so sánh về danh tính. Ưu điểm của toán tử === là nó không chuyển hai giá trị về cùng một kiểu. Đây là lý do tại sao nó được sử dụng phổ biến.

  • Sự khác biệt giữa Object.getOwnPropertyNames() và Object.keys() là gì?

Object.getOwnPropertyNames() trả về các thuộc tính có thể đếm được và không đếm được từ một đối tượng hoặc mảng.

Object.keys() trả về các thuộc tính có thể đếm được từ một đối tượng hoặc mảng.

  • Cấu trúc ngôn ngữ nào có thể được sử dụng để kiểm soát luồng tập lệnh và theo dõi lỗi?

Điều này có thể thực hiện được bằng cách sử dụng cấu trúc try()... Catch()

  • Tại sao gọi a(); diễn ra thành công và lệnh gọi b(); đưa ra một thông báo lỗi?

Hàm a() được khởi tạo ở giai đoạn tải tập lệnh, như thể nó “bật lên” và hàm b được khởi tạo khi biến b được khai báo

  • Biến toàn cục là gì? Chúng được tạo ra như thế nào? Các vấn đề khi sử dụng biến toàn cục là gì?

Biến toàn cục là một biến có sẵn (hiển thị) trong toàn bộ tài liệu, trái ngược với biến cục bộ (được giới hạn bởi khối mã chương trình mà nó được xác định)

Hầu hết các nhà phát triển JavaScript đều tránh sử dụng các biến toàn cục. Một trong những lý do là có thể có xung đột về tên của các biến toàn cục và cục bộ. Ngoài ra, mã sử dụng biến toàn cục có thể khó bảo trì và kiểm tra hơn.

  • Bao đóng trong JavaScript là gì?

Nói một cách đơn giản, đây là một chức năng nội bộ, tức là. chức năng bên trong một chức năng.

Họ gọi đó là một bao đóng vì sau khi hàm cha hoặc hàm ngoài được thực thi, mã bên trong vẫn “tồn tại” trong trình thông dịch và có thể được thực thi. Sẽ không có lỗi xảy ra ngay cả khi hàm bên trong (đóng) sử dụng các biến từ hàm bên ngoài.Ví dụ: tính năng này có thể được sử dụng để tạo các hàm xử lý sự kiện:


  • Viết hàm lấy một chuỗi có tên tệp và trả về phần mở rộng (đoạn sau dấu chấm cuối cùng).

    • Nguyên mẫu trong javascript là gì?

    Nói chung, nguyên mẫu là một thuộc tính cho phép bạn thêm thuộc tính vào các đối tượng hiện có và cũng được sử dụng để mô phỏng tính kế thừa lớp trong JavaScript. Một câu trả lời chi tiết được viết ở đây . Một lựa chọn khác là đề cập đến Prototype.js. Đây là một thư viện phổ biến bổ sung các khả năng OOP tiện lợi cho các chương trình JavaScript.

    • Bạn biết những phương pháp đính kèm trình xử lý sự kiện nào?

    Sự kiện có thể được thêm vào theo ba cách:

    • htmlElement.onclick = function(event) ( .... ) - bằng cách này bạn chỉ có thể thêm một trình xử lý
    • htmlElement.addEventListener("click", ...) - bằng cách này bạn có thể đính kèm một số trình xử lý, giữ nguyên thứ tự của các trình xử lý
    • htmlElement.attachEvent("on"+event_name, handler) - bạn cũng có thể đính kèm một số, không giữ nguyên thứ tự của các trình xử lý, không có quyền truy cập vào phần tử mà sự kiện được kích hoạt.

Tuần phỏng vấn về Habré đã trôi qua, nhưng tôi quyết định kết thúc với độc giả vẫn còn được kính trọng bằng một bài báo, trong đó tôi sẽ chia sẻ một số nhiệm vụ mà nhà tuyển dụng đã giao cho tôi trong các cuộc phỏng vấn trong suốt quá trình làm việc. tháng trước(trong số đó có Yandex, Topface, ITMozg, một vài công ty khởi nghiệp rất thú vị và một vài công ty khởi nghiệp khá âm u).

Tất nhiên, bạn sẽ không thể thành công trong một cuộc phỏng vấn chỉ bằng cách ghi nhớ câu trả lời cho những câu hỏi này. Câu trả lời cho mỗi câu hỏi sẽ cần được giải thích, đôi khi rất chi tiết. Nhiều câu hỏi sẽ được người phỏng vấn bổ sung thêm. Tôi yêu cầu bạn hãy coi những câu hỏi này như một loại “thanh” mà bạn cần phải tự mình đạt được để trở thành Junior trong một công ty tốt.

Trên thực tế, bản thân các nhiệm vụ

1

Hãy tưởng tượng rằng chúng ta có một trường lưới hình vuông nơi một người lang thang bước đi.
Viết một đối tượng "Người lang thang" chứa tọa độ của nó và bốn phương thức thực hiện các bước lên, xuống, phải và trái của người lang thang.
Cách triển khai chuỗi như thế này trong một đối tượng như vậy:

Vagabond.goUp().goLeft().goDown().goDown().goRight();

2

Có một mảng có độ dài tùy ý, chứa đầy các giá trị ngẫu nhiên:

Danh sách biến = ;

bạn cần tìm giá trị của phần tử tối đa.

3

Cần phải gửi một bộ dữ liệu đến máy chủ mà không cần tải lại trang. Liệt kê các cách để thực hiện việc này, kể tên cách nào có nhiều trình duyệt nhất.

4

Sự khác biệt giữa vịt == và === là gì?

5

Bộ nhớ cục bộ, cookie và bộ nhớ phiên là gì? sự khác biệt giữa chúng là gì?

6
Màn hình chỉ @media và (độ rộng tối đa: 1200px) ( )

Đây là loại thiết kế gì? Tại sao nó có thể cần thiết?

7

Sự khác biệt giữa hợp nhất và rebase trong Git là gì?

8

Var a = F mới(); var b = new F(); cảnh báo(a == b); hàm F()()

Thực hiện a == b trả về true .

9

Viết kết quả của các phép tính:

"1" + 2; 1 + "2"; null == không xác định; vô giá trị == 0; không > 0; vô giá trị >= 0; "a" > "A";

10

Danh sách biến = ; hàm sum() ( var sum = 0; for (i=0; i

11

Hãy tưởng tượng một trang lớn và phức tạp tải rất chậm. Hãy nói rằng mọi thứ đều tồi tệ với cô ấy. Nhiệm vụ của bạn là tối ưu hóa thời gian tải. Hành động của bạn?

Phần kết luận

Hầu hết tất cả các nhiệm vụ phải được hoàn thành bằng miệng hoặc trong IDE “Giấy & Bút chì” cũ tốt. Không ai yêu cầu mã không có lỗi. Những người phù hợp hơn chủ yếu quan tâm đến quá trình suy nghĩ chứ không phải kiến ​​thức về sự phức tạp của công nghệ. Tuy nhiên, một cách tự nhiên, mức độ hiểu biết về HTML, JS và CSS cũng rất quan trọng (tùy theo ý muốn của bạn). Các cuộc phỏng vấn trong một số trường hợp gợi nhớ nhiều hơn đến một kỳ thi với những giáo viên giỏi (đây là trường hợp của ITMozg và Topface), trong một số trường hợp - một cuộc trò chuyện thân thiện vui vẻ với việc uống trà (Yandex, Radario), và trong một số - ma quỷ biết điều gì (tôi sẽ không nêu tên các công ty, tuy nhiên, họ ít được biết đến).

Nếu độc giả nào sau khi đọc xong nảy ra suy nghĩ “Hóa ra không có gì phải sợ hãi trong các cuộc phỏng vấn ngay cả ở những công ty tuyệt vời nhất. Làm việc trong Yandex và Topface là trong tầm tay”, điều đó có nghĩa là tôi không viết điều này một cách vô ích.

Cám ơn vì sự quan tâm của bạn. Chúc mọi người may mắn.

Trong các cuộc phỏng vấn, mọi người thường thích hỏi những câu hỏi giống nhau, những câu trả lời đã được học từ lâu.

Hôm nay chúng ta sẽ xem xét những vấn đề ít được đề cập đến.

Vì vậy, hãy bắt đầu!

1. foo.x bằng gì?

var foo = (n: 1);
thanh var = foo;
foo.x = foo = (n: 2);

Câu hỏi này được hỏi bởi 3% công ty hàng đầu (Apple, Google, Facebook).

Điều chính cần lưu ý ở đây là foo được tham chiếu bởi foo.x được “đặt” trước khi foo thay đổi. foo.x đề cập đến giá trị cũ của foo.

  • Hãy lref là kết quả của việc đánh giá Tay TráiBênBiểu Hiện.
  • Hãy giới thiệu lại là kết quả của việc đánh giá Bài tậpBiểu hiện.

Điều này có nghĩa là trong foo cũ sẽ có thuộc tính mới x bằng (n: 2) . Và foo mới sẽ được viết (n: 2).

Giá trị của foo cũ là ở dạng bar:

// quán ba
{
n: 1,
x: (
n: 2
}
}

Vì trong đầu ra tiếp theo của foo.x, foo của chúng ta đề cập đến giá trị mới của nó, trong đó x bị thiếu, nên foo.x sẽ không được xác định.

Trả lời: không xác định

2. Viết hàm cộng dạng add(num1)(num2)..

Lưu ý: Số lượng từ không giới hạn

Trong bản gốc, vấn đề này được giải quyết theo cách này:

Hằng số cộng = (a) => (
gọi tổng = a;
const func = (b) => (
nếu (b) (
tổng += b;
hàm trả về;
) khác (
trả lại số tiền;
}
};
hàm trả về;
); thêm(2)(3)(); // 5;

Nhưng sau đó họ đưa ra cho bạn một điều kiện.

Xóa dấu ngoặc đơn thừa ở cuối
cộng(2)(3) // 5 cộng(1)(2)(5) // 8 ...

Bây giờ nhiệm vụ đã trở nên khó khăn hơn. Và giải pháp nằm ở việc ghi đè phương thức giá trị của.

Hằng số cộng = (a) => (
gọi tổng = a;
const func = (b) => (
tổng += b;
hàm trả về;
};
func.valueOf = () => tổng; hàm trả về;
); console.log(add(2)(3)); // 5;

Khi chúng tôi gọi console.log anh ấy mong được nhìn thấy Sợi dây, nếu nó không có ở đó thì nó sẽ cố gắng kiếm từ giá trị nhận được Sợi dây.

Trong ví dụ trên, sau khi thực hiện add(2)(3), một hàm được trả về, console.log sẽ biến thành Chuỗi, trong các hành động này, phương thức valueOf sẽ được gọi để chuyển hàm thành nguyên thủy và vì chúng ta đã ghi đè phương thức này, nó sẽ trả về tổng giá trị của chúng ta thay vì giá trị tiêu chuẩn.

Ghi chú:

Ví dụ này không hiệu quả với tất cả mọi người. bảng điều khiển.

3. Điều gì sẽ được hiển thị trong bảng điều khiển? Giải thích vì sao.

var a=(),
b=(khóa:"b"),
c=(khóa:"c");

a[b]=123;
a[c]=456;

console.log(a[b]);

Chuyện gì đang xảy ra vậy? Khi một thuộc tính mới được đặt trên một đối tượng, JavaScript sẽ ngầm thực hiện xâu chuỗiý nghĩa. Trong đoạn mã trên, b và c là các đối tượng, do đó cả hai đều được chuyển đổi thành "" (Chuỗi). Bởi vì xâu chuỗi các giá trị bằng nhau thì hóa ra chúng ta gán một giá trị mới cùng một tài sản.

Nó tương đương với cách viết:

Var a=(),
b="đối tượng",
c="đối tượng";

a[b]=123;
a[c]=456;

4. Viết một hàm đơn giản để tìm hiểu xem một trong các tham số đầu vào có bằng 3 hay không.

Ở đây nhấn mạnh vào việc kiểm tra kiến ​​thức về tranh luận, nhưng đôi khi họ còn đi xa hơn và yêu cầu cho biết cách thức hoạt động của nó. Array.prototype.slice.call(đối số).

Hàm isThreePassed())(
const args = Array.prototype.slice.call(arguments);
return args.indexOf(3) != -1;
) isThreePassed(1,2) //false
isThreePassed(9,3,4,9) //true

Như chúng ta biết, tranh luận không phải là một mảng mà là một đối tượng thông thường, vì vậy nó không có phương thức hữu ích như Chỉ số. Với mục đích này nó được sử dụng Array.prototype.slice.call(đối số), cái nào làm cho lý lẽ -> mảng.

Tuy nhiên, nó hoạt động như thế nào?

.gọi() Và. áp dụng() cho phép bạn thiết lập rõ ràng cái này trong chức năng. Và nếu bạn vượt qua lập luận như thế này, Cái đó lát cắt sẽ làm việc với nó như với một mảng thông thường.

Đây là một thử nghiệm thú vị:

Hằng số o = (
"0": "không",
"1 một"
); .slice.call(o); // ; const oo = (
"0": "không",
"1 một",
chiều dài: 2
); .slice.call(oo); // ["không một"];

5. Kết hợp hai mảng lồng nhau

], ] ->

Vấn đề có thể được giải quyết bằng nhiều cách khác nhau. Thông thường họ muốn tìm hiểu xem người được phỏng vấn có biết một phương pháp như giảm bớt .

Ý tưởng là lặp qua tất cả các phần tử của mảng ban đầu và các “mảng con” của nó để trả về các giá trị tìm thấy cho mảng mới. Điều này xảy ra đệ quy cho đến khi chúng ta đạt đến phần tử cuối cùng.

Nó cũng giúp chúng ta hình thành một mảng mới concat .

Const Flatten = (arr) => arr.reduce((flat, toFlatten) => flat.concat(Array.isArray(toFlatten) ? Flatten(toFlatten) : toFlatten), );

Đó là tất cả! 🙏🏼 👍

Chúng tôi tiếp tục xem xét các câu hỏi phỏng vấn thường gặp.

6. Kế thừa nguyên mẫu là gì?

Câu trả lời đúng sẽ là: ban đầu, mỗi đối tượng có một thuộc tính - một nguyên mẫu. Bạn có thể thêm các phương thức và thuộc tính vào nó. Tạo các đối tượng khác dựa trên nguyên mẫu. Đối tượng đã tạo sẽ tự động kế thừa các thuộc tính của nguyên mẫu của nó. Nếu thuộc tính bị thiếu trong đối tượng mới, nó sẽ được tìm kiếm trong nguyên mẫu.

Đặt car = function(model) ( this.model = model; ); car.prototype.getModel = function())( return this.model; ) let honda = new car("honda"); console.log(honda.getModel()); //honda let bmw = xe mới("bmw"); console.log(bmw.getModel()); //xe BMW
Hàm car được gọi là hàm tạo. Tiếp theo, chúng ta thêm phương thức getModel vào nguyên mẫu của nó bằng cách sử dụng cấu trúc đặc biệt car.prototype.getModel(). Nếu bạn không hiểu những gì đang được nói ở đây, tôi thực sự khuyên bạn nên tự làm quen với OOP nguyên mẫu: https://learn.javascript.ru/prototypes
30% sẽ hỏi bạn câu hỏi này hoặc một câu hỏi tương tự.

7. Sự khác nhau giữa khai báo hàm và biểu thức hàm?

Hàm funcA())( console.log("khai báo hàm"); ); var funcB = function() ( console.log("biểu thức hàm"); )

Như bạn có thể thấy, biểu thức hàm là một biến mà hàm được gán.
Một tính năng quan trọng là một hàm được khai báo thông qua khai báo hàm có thể được truy cập thông qua văn bản chương trình trước phần mô tả của nó. Mặc dù biểu thức hàm hoạt động giống như một biến, do đó hàm chỉ có thể được truy cập sau. Nếu chúng ta đang ở ví dụ trước, ngay từ đầu chúng ta đã thêm hai dòng:

Console.log(funcA()); //khai báo hàm concole.log(funcB()); //Uncaught ReferenceError: funcB không được xác định.
Nhân tiện, thay vì var bạn có thể sử dụng let, với tất cả các hậu quả tiếp theo liên quan đến phạm vi.
Nếu bạn muốn truyền một hàm làm đối số cho một hàm khác thì bạn cần sử dụng biểu thức hàm. Bởi vì nó là một biến. Tức là chuyển biến này sang hàm khác.

8. Lời hứa là gì và chúng được dùng để làm gì.

Trả lời câu hỏi nàyđôi khi khó khăn, nhưng bạn có thể nói đơn giản rằng với sự trợ giúp của chúng, bạn có thể thực hiện các hành động (chức năng, phương thức) một cách không đồng bộ. Bạn có thể đạt được sự không đồng bộ bằng cách sử dụng lệnh gọi lại, nhưng trong trường hợp lồng nhau lớn ( số lượng lớn hành động không đồng bộ), chúng ta sẽ có mã khó đọc.

$.ajax(( url: "test.json", thành công: function(r) ( $.ajax(( url: "baz.json?" + r.test, thành công: function(result) ( $("#div1 ").html(kết quả); ) )); ) ));

Xem nó phân nhánh bao nhiêu mã này? Bây giờ, hãy viết điều tương tự bằng cách sử dụng lời hứa (theo sơ đồ):

Var p1 = new Promise(function(resolve, từ chối) ( Resolve($.ajax("test.json")); )); p1.then(function(r)( return new Promise(...); )).then(function(result)( $(“#div1”).html(result); ));

9. Câu hỏi về setTimeout()

Rất có thể, bạn sẽ không được hỏi nó là gì, vì câu trả lời cho câu hỏi như vậy quá rõ ràng. Thay vào đó, họ sẽ đưa ra một đoạn mã và bạn sẽ phải trả lời kết quả thực thi của nó là gì.

Console.log("a"); console.log("b"); console.log("c"); //xem kết quả tuần tự của a rồi b và c. Bây giờ chúng ta sẽ làm điều tương tự, nhưng chúng ta sẽ gói đầu ra “a” trong setTimeout().

SetTimeout(function() ( console.log("a"); ), 0);

Về mặt logic, vì thời gian chờ là 0 nên chúng ta có thể giả sử rằng chuỗi đầu ra sẽ giữ nguyên. Tuy nhiên, trên thực tế, chúng ta sẽ thấy b trước, sau đó là c và chỉ ở cuối – a.
Điều này là do khi chúng ta sử dụng setTimeout, mã được đính kèm trong đó sẽ trở nên không đồng bộ. JS sẽ thực thi nó sau khi ngăn xếp trống. Tức là sau b và c.

10. Đóng cửa và cách sử dụng chúng

Bạn có thể sẽ được hỏi một câu hỏi trong một cuộc phỏng vấn.

Khi một hàm trả về một hàm (hoặc đối tượng khác), hàm sau sẽ chứa môi trường của hàm mẹ của nó. Hãy xem một ví dụ:

Đặt bar = function() ( let i = 0; return ( setI(b) ( i = b; ), getI() ( return i; ) ) ); đặt x = bar(); x.setI(2); console.log(x.getI()); //2

Cuối cùng, tôi khuyên bạn đừng vội trả lời trong quá trình phỏng vấn, đặc biệt là những câu hỏi liên quan đến việc phân tích mã đề xuất. Thường những câu hỏi thoạt nhìn rõ ràng đều chứa đựng những mánh khóe và cạm bẫy. Dừng lại, suy nghĩ thêm một phút. Đặt những câu hỏi làm rõ - điều này sẽ thể hiện sự chú ý và thái độ có trách nhiệm của bạn đối với vấn đề. Nó sẽ giúp người phỏng vấn nhìn thấy được suy nghĩ của bạn. Trên thực tế, đây chủ yếu là lý do tại sao khó khăn hoặc nhiệm vụ phức tạp. Điều quan trọng hơn nhiều là phải thể hiện suy nghĩ đúng, ngay cả khi câu trả lời cho câu hỏi cuối cùng là sai.

Một người không thể biết tất cả mọi thứ, về nguyên tắc điều này là không thể. Điều thường xảy ra là ở công việc trước đây, bạn gặp phải những công nghệ và kỹ thuật tương tự, nhưng ở công việc mới, nhóm có quan điểm khác về kiến ​​​​trúc và sử dụng các thư viện không quen thuộc với bạn. Đó là lý do tại sao một người phỏng vấn có năng lực trước hết sẽ cố gắng tìm hiểu xem người trước mặt họ là người như thế nào, họ suy nghĩ như thế nào, khả năng phân tích của họ. Cuối cùng, rất dễ dàng để lấp đầy những khoảng trống còn thiếu, điều này không thể nói về tư duy đúng đắn của một lập trình viên, vốn chỉ được hình thành bằng kinh nghiệm.