Top 12 câu hỏi khi phỏng vấn về Javascript thường gặp



  • Javascript là một trong những ngôn ngữ phổ biến hiện nay , Javascript rất linh động nó có khả năng viết các ứng dụng đa nền tảng với React Native , viết Backend với NodeJS giống như PHP, JAVA,Python ,…
    Chính vì sự phổ biến , nổi tiếng của Javascript mà các cty hiện nay đang khao khát nhân lực về JS,NodeJS,… và việc phỏng vấn cũng trở nên hết sức khó khăn. Đừng lo lắng ! với kinh nghiệm phỏng vấn nhiều năm của mình , hôm nay mình xin tổng hợp đến các bạn 12 câu hỏi thường gặp về JS bao gồm đáp án và lời giải nhé .

    phong-van-xin-viec-nganh-dien-01.jpg

    Câu 1 : Javascript global execution context tạo ra 2 thứ: global object và từ khóa "this"?
    Đáp án : Đúng
    Về cơ bản thì bối cảnh thực thi toàn cầu (Global execution context) giúp bạn có thể truy cập ở mọi nơi trong code của bạn.

    Câu 2: Có thể thêm thuộc tính vào một string hay không?
    Ví dụ :

    String.prototype.giveAnhdvPizza = () => {
      return "NodeJS Việt Nam";
    };
     
    const name = "anhdv";
     
    name.giveanhdvPizza();
    
    

    A: "NodeJS Việt Nam"
    B: TypeError: not a function
    C : SyntaxError
    D : undefined

    Đáp án :A

    String là một buitl-in constructor, vì thế chúng ta có thể thêm các thuộc tính vào. Mình chỉ thêm một phương thức vào nguyên mẫu của nó. Các chuỗi nguyên thủy được tự động chuyển đổi thành một string object, được tạo bởi prototype function. Vì vậy, tất cả các string (string object) đều có quyền truy cập vào phương thức đó!

    Câu 3 : Stack trong Javascript có gì ?
    Ví dụ :

    const foo = () => console.log("First");
    const bar = () => setTimeout(() => console.log("Second"));
    const baz = () => console.log("Third");
     
    bar();
    foo();
    baz();
    

    Lựa chọn đáp án đúng nhất:
    A: First Second Third
    B: First Third Second
    C : Second First Third
    D : Second Third First

    Đáp án : B
    Chúng ta có một hàm setTimeout và gọi nó trước. Tuy nhiên, nó đã được log cuối cùng.
    Điều này là do trong các trình duyệt, chúng ta không chỉ có runtime engine, chúng ta cũng có một thứ gọi là WebAPI. WebAPI cung cấp cho chúng ta hàm setTimeout để bắt đầu, và ví dụ như DOM.
    Sau khi callback được đẩy lên WebAPI, chính hàm setTimeout (nhưng không phải là callback!) Được bật ra khỏi stack. Bây giờ, foo được gọi và 'First' đang được log. foo được bật ra khỏi stack, và baz được gọi. 'Third' được log WebAPI không thể chờ đẩy nhiệm vụ vào vào stack bất cứ khi nào nó sẵn sàng. Thay vào đó, nó đẩy hàm callback đến một thứ gọi là hàng đợi (queue). Đây là nơi một vòng lặp sự kiện bắt đầu hoạt động. Một vòng lặp sự kiện nhìn vào stack và nhiệm vụ trong hàng đợi. Nếu stack trống, nó sẽ lấy nhiệm vụ đầu tiên trên hàng đợi và đẩy nó lên stack. Lúc này bar được gọi, 'Second' được log và nó bật ra khỏi stack.

    Câu 4: Khi bấm vào đoạn văn bản thì log ra cái gì?
    Ví dụ :

    <div onclick="console.log('div')">
      <p onclick="console.log('p')">
        Click here!
      </p>
    </div>
    

    A: p div
    B: div p
    C : p
    D : div

    Đáp án : A
    Nếu chúng ta click vào p, chúng ta sẽ thấy hai bản ghi: p và div.
    Trong quá trình truyền bá sự kiện, có 3 giai đoạn: bắt giữ (capturing), nhắm mục tiêu (target) và sủi bọt (bubbling).
    Theo mặc định, các trình xử lý sự kiện (event handlers) được thực thi trong giai đoạn sủi bọt (trừ khi bạn đặt useCapture thành true). Nó đi từ phần tử lồng sâu nhất ra bên ngoài.
    Câu 5 : Sự khác nhau của hàm call và hàm bind là gì?

    Chúng ta có đoạn code sau :

    const person = { name: "Lydia" };
     
    function sayHi(age) {
      console.log(`${this.name} is ${age}`);
    }
     
    sayHi.call(person, 21);
    sayHi.bind(person, 21);
    

    A: undefined is 21 Lydia is 21
    B: function function
    C : Lydia is 21 Lydia is 21
    D : Lydia is 21 function

    Đáp án : D

    Đối với với cả hai trường hợp, chúng ta có thể truyền object mà chúng ta muốn this tham chiếu đến
    . Tuy nhiên, .call được thực thi ngay lập tức! Bạn có thể hiểu hàm call là: Gọi hàm và cho phép bạn truyền vào một object và các đối số phân cách nhau bởi dấu phẩy. VD: function.call(thisArg, arg1, arg2, ...) Còn hàm bind là: Trả về một hàm số mới, cho phép bạn truyền vào một object và các đối số phân cách nhau bởi dấu phẩy.
    VD: var newFunction = fun.bind(thisArg[, arg1[, arg2[, ...]]]) Vì .bind trả về một copy của function, nhưng với một bối cảnh bị ràng buộc (bound context)! Nó không được thực thi ngay lập tức.
    Câu 6 : typeOf typeOf number trả về kết quả gì?
    Ví dụ :

    console.log(typeof typeof 6);
    

    A: "number"
    B: "string"
    C : "object"
    D : "undefined"

    Đáp án : B
    typeof 1 trả về "number". Do đó, typeof "number" trả về "string"

    Câu 7 : Chương trình Javascript sau trả về kết quả gì?

    (() => {
      let x, y;
      try {
        throw new Error();
      } catch (x) {
        (x = 1), (y = 2);
        console.log(x);
      }
      console.log(x);
      console.log(y);
    })();
    

    A: 1 undefined 2
    B: undefined undefined undefined
    C : 1 1 2
    D : 1 undefined undefined
    Đáp án : A

    Khối catch nhận đối số x. Biến này không giống như x khi chúng ta truyền đối số. Biến x này là block-scoped.
    Sau đó, chúng ta đặt biến block-scoped này bằng 1 và đặt giá trị của biến y.
    Bây giờ, chúng ta log biến block-scoped x, kết quả bằng 1. Bên ngoài khối catch, x vẫn là undefined và y là 2. Khi chúng ta muốn console.log(x) bên ngoài khối catch, nó trả về undefined và y trả về 2.

    Câu 8 : Toán tử !! tính chất truthy và falsy của dữ liệu.

    !!null;
    !!"";
    !!1;
    

    A: false true false
    B: false false true
    C : false true true
    D : true true false
    Đáp án :B
    null là falsy. !null trả về true. !true trả về false.

    "" là falsy. !"" trả về true. !true trả về false.

    1 là truthy. !1 trả về false. !false trả về true

    Câu 9 : Phương thức setInterval trả về cái gì?

    setInterval(() => console.log("NodeJS"), 1000);
    

    A: Một id duy nhất
    B: Số mili giây được chỉ định
    C : passed function
    D : undefined
    Đáp án : A

    Nó trả về một id duy nhất. Id này có thể được sử dụng để xóa khoảng nghỉ đó với hàm clearInterval().

    Câu 10 : Chuyển đổi số bằng toán tử +, tính chất truthy value
    Kết quả của chương trình Javacript sau đây là gì?
    +true;
    !"ICT Hà Nội";
    A: 1 and false
    B: false and NaN
    C : false and false
    Đáp án : A
    Toán tử + ở đây đã chuyển đổi một toán hạng thành một số. true là 1 và false là 0.

    Do trong Javascript thì chỉ có:
    Kiểu Boolean có falsy value là false
    Kiểu Number có falsy value là 0 và NaN
    Kiểu String có falsy value là ''
    Kiểu null là có falsy value null
    Kiểu undefined có falsy value là undefined

    Vậy chúng ta có tổng cộng là 6 falsy value. Các giá trị còn lại đều là truthy value.

    Chính vì thế chuỗi 'ICT Hà Nội' là một truthy value. Do đó phủ định của truthy value. Dĩ nhiên kết quả sẽ trả về giá trị là false.

    Câu 11 : Điều gì xảy ra kho tạo thuộc tính cho hàm giống như Object ?

    Kết quả của chương trình Javacript sau đây là gì?

    function bark() {
      console.log("Woof!");
    }
     
    bark.animal = "dog";
    
    

    A: Không có gì. Thế này hoàn toàn ok.
    B: SyntaxError. You cannot add properties to a function this way.
    C : undefined
    D : ReferenceError

    Đáp án: A

    Điều này là hoàn toàn có thể trong JavaScript, bởi vì các hàm là các object! (Tất cả mọi thứ ngoài các kiểu nguyên thủy đều là các object)

    Một hàm là một loại object đặc biệt. Code bạn tự viết không phải là hàm thực tế. Hàm này là một object có thuộc tính. Thuộc tính này là bất khả xâm phạm.

    Câu 12 : Khởi tạo đối tượng có từ khóa new và không có từ khóa new khác gì nhau?
    Kết quả của chương trình Javacript sau đây là gì?

    function Person(firstName, lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
    }
     
    const lydia = new Person("Lydia", "Hallie");
    const sarah = Person("Sarah", "Smith");
     
    console.log(lydia);
    console.log(sarah);
    
    

    A: Person {firstName: "Lydia", lastName: "Hallie"} and undefined
    B: Person {firstName: "Lydia", lastName: "Hallie"} and Person {firstName: "Sarah", lastName: "Smith"}
    C : Person {firstName: "Lydia", lastName: "Hallie"} and {}
    D:Person {firstName: "Lydia", lastName: "Hallie"} and ReferenceError

    Đáp án: A

    Đối với sarah, chúng ta đã không sử dụng từ khóa new. Khi sử dụng từ khóa new, nó đề cập đến empty object mới mà chúng ta tạo. Tuy nhiên, nếu bạn không thêm new, nó sẽ tìm đến global object!

    Khi nói rằng this.firstName sẽ tương đương với "Sarah" và this.lastName sẽ bằng "Smith".

    Bản chất thực sự của hành động trên là định nghĩa global.firstName = 'Sarah' và global.lastName = 'Smith'

    Chính sarah thì là undefined

    Vậy là chúng ta đã điểm qua hết 12 câu hỏi phỏng vấn thường gặp về JS,mình cá rằng với 12 câu hỏi này các bạn sẽ đủ tự tin trong quá trình phỏng vấn xin việc , chúc các bạn thành công !


Log in to reply
 

});