11/08/2018, 20:21

Những vấn đề thường được hỏi khi phỏng vấn về Javascript

Nhu cầu về Javascript developer hiện nay trong thị trường IT là rất lớn. Nếu bạn có kiến thức ở mảng này thì cơ hội nghề nghiệp cũng như thu nhập của bạn cũng sẽ không hề ít. Nhưng trước khi bạn có được công việc mà bạn mong muốn, bạn sẽ phải thể hiện cho nhà tuyển dụng thấy khả năng của mình thông ...

Nhu cầu về Javascript developer hiện nay trong thị trường IT là rất lớn. Nếu bạn có kiến thức ở mảng này thì cơ hội nghề nghiệp cũng như thu nhập của bạn cũng sẽ không hề ít. Nhưng trước khi bạn có được công việc mà bạn mong muốn, bạn sẽ phải thể hiện cho nhà tuyển dụng thấy khả năng của mình thông qua quá trình phỏng vấn. Trong bài viết này, tôi sẽ chia sẻ với các bạn về những vấn đề thường được nhà tuyển dụng hỏi khi phỏng vấn một ứng viên về Javascript.

Hãy cố gắng trả lời câu hỏi trước khi đọc phần trả lời nhé. Cùng bắt đầu nào!

Vấn đề đầu tiên, Scope

Cùng xem xét đoạn code sau.

(function() {
   var a = b = 5;
})();

console.log(b);

Theo bạn, kết quả in ra console sẽ như thế nào?

Câu trả lời là 5. Lý do?

Trong đoạn code trên ta dùng hai phép gán, nhưng để ý kỹ đừng để bị đánh lừa, biến a được khai báo sử dụng từ khoá var. Điều này có nghĩa là a là biến cục bộ, trong khi đó b là biến toàn cục.

Để hiểu rõ đoạn code này, chúng ta sử dụng strict mode bằng cách khai báo 'use strict' bên trong thân hàm. Nếu strict mode được bật, đoạn code sẽ văng lỗi Uncaught ReferenceError: b is not defined. Strict mode sẽ yêu cầu bạn khai báo tường minh mọi thứ, vì thế đoạn code sẽ đươc viết lại như sau.

(function() {
   'use strict';
   var a = window.b = 5;
})();

console.log(b);

Vấn đề thứ hai, tạo native method

Hãy tạo ra phương thức square được sử dụng bởi đối tượng kiểu Number, phương thức này sẽ trả về kết quả là bình phương của số cho trước. Ví dụ.

var a = 2
console.log(a.square());

-> 4

Câu hỏi này dùng để kiểm tra kiến thức của developer về việc kế thừa trong Javascript cũng như về thuộc tính prototype của đối tượng. Nó cũng đồng thời xác nhận lại việc developer có kiến thức về việc mở rộng thêm phương thức cho các kiểu dữ liệu truyền thống, mặc dù điều này là điều không nên làm.

Một điểm quan trọng khác đó là chứng minh được rằng bạn có nhận thức về việc làm thế nào để không override những phương thức đã được định nghĩa trước đó. Điều này giải quyết bằng cách xác nhận rằng phương thức đã được tồn tại hay chưa trước khi bạn tạo nó.

Câu trả lời như sau.

Number.prototype.square = Number.prototype.square || function () {return this * this}

Vấn đề thứ ba, Hoisting

function test() {
   console.log(a);
   console.log(foo());

   var a = 1;
   function foo() {
      return 2;
   }
}

test();

Kết quả sau khi thực thi đoạn code này là gì, và tại sao?

Câu trả lời là undefined và 2. Lý do?

Việc khai báo biến và hàm đã được đưa lên đầu hàm sau khi áp dụng hoisting. Vì thế tại thời điểm biến a được console.log ra màn hình thì giá trị của nó chưa được xác định. Nói một cách đơn giản hơn, đoạn code trên sẽ được sắp xếp lại như sau trước khi thực thi.

function test() {
   var a;
   function foo() {
      return 2;
   }

   console.log(a);
   console.log(foo());

   a = 1;
}

test();

Vấn đề thứ tư, từ khoá this

Cùng xem xét đoạn code dưới đây

var name = 'Hoang';
var obj = {
   name: 'Alibaba',
   prop: {
      name: 'Aladin',
      getName: function() {
         return this.name;
      }
   }
};

console.log(obj.prop.getName());

var test = obj.prop.getName;

console.log(test());

Hãy trả lời kết quả sau khi đoạn code được thực thi và giải thích lý do.

Câu trả lời là đoạn code sẽ xuất ra màn hình là Aladin và Hoang. Lý do là vì context của hàm, thứ mà được liên kết với từ khoá this , trong Javascript nó phụ thuộc vào việc hàm được gọi như thế nào chứ không phụ thuộc vào cách khai báo.

Khi dòng console.log đầu tiên được gọi, hàm getName() được gọi dưới tư cách là hàm của obj.prop. Vì thế context sẽ được đưa về là obj.prop và this.name sẽ là obj.prop.name. Khi hàm getName() được gán cho biến test lúc này đang là một thuộc tính có scope global, thì kết quả trả về sẽ là window.name, cái mà đã được gán ở dòng đầu tiên.

Để tìm hiểu rõ hơn về từ khoá this, các bạn có thể tìm hiểu tại đây.

Vấn đề thứ năm, bind(), call() và apply()

Đọc lại đoạn code ở vấn đề thứ tư, vậy làm thế nào để dòng console.log cuối cùng in ra được kết quả là Aladin

Câu trả lời là có thể thay đổi context của function bằng cách sử dụng call() hay apply(). Nếu bạn chưa biết về chúng, các bạn có thể tìm hiểu qua bài viết bind, call và apply trong Javascript. Còn đối với câu hỏi trên đáp án sẽ như sau.

console.log(test.call(obj.prop));

Tóm lại

Trong bài viết này tôi đã giới thiệu với các bạn một số vấn đề mà nhà tuyển dụng thường hỏi để kiểm tra một Javascript developer. Câu hỏi khi phỏng vấn thực tế có thể sẽ khác biệt nhưng vấn đề tôi tin chắc là sẽ tương tự. Tôi hy vọng các bạn thấy nhưng chia sẻ của tôi là hữu ích, trong trường hợp bạn chưa thể trả lời được hết các câu hỏi, đừng lo lắng vì chỉ cần cố gắng tìm hiểu thì bạn có thể làm tốt hơn trong những lần kế tiếp.

Nếu các bạn có bất cứ những câu hỏi thú vị nào về việc phỏng vấn Javascript developer, đừng ngần ngại chia sẻ chúng ở phần comment nhé, chúng sẽ giúp ích được cho rất nhiều người khác đấy. Xin chào và hẹn gặp lại trong những bài viết tiếp theo.

Bài gốc: Codeaholicguy

0