Phỏng vấn thuật toán javascript

Undefined có nghĩa là không xác định. Trong javascript, khi bạn khai báo một biến nhưng chưa gán giá trị cho nó, giá trị của biến đó sẽ là undefined.

var test;
alert[test]; //undefined

Bất cứ biến nào cũng có thể bị làm rỗng bằng cách thiết lập giá trị về không xác định [

typeof undefined; // undefined
typeof null; // object
1].

var test = undefined;
alert[test]; //undefined

Null có nghĩa là giá trị rỗng hoặc giá trị không tồn tại, nó có thể được sử dụng để gán cho một biến như là một đại diện không có giá trị.

var test = null;
alert[test]; //null

Ngoài ra thì còn một chú ý nữa đó là

typeof undefined; // undefined
typeof null; // object
2 có kiểu giá trị là
typeof undefined; // undefined
typeof null; // object
1 nhưng
typeof undefined; // undefined
typeof null; // object
4 lại là 1
typeof undefined; // undefined
typeof null; // object
5

typeof undefined; // undefined
typeof null; // object

Kể tên các kiểu dữ liệu cơ bản trong Javascript

Kiểu dữ liệu nguyên thủy:

  • typeof undefined; // undefined
    typeof null; // object
    
    6: Các số nguyên hoặc số thực. Ví dụ: 5 hoặc 5.05
  • typeof undefined; // undefined
    typeof null; // object
    
    7: là các text như “Các kiểu dữ liệu trong JavaScript”, text có thể có một hoặc nhiều ký tự.
  • typeof undefined; // undefined
    typeof null; // object
    
    8: chỉ có 2 giá trị là true hoặc false.
  • typeof undefined; // undefined
    typeof null; // object
    
    9: là các giá trị không xác định.
  • var x = 3;
    var y = "3";
    x + y; // Returns "33"
    
    0: đơn giản là không có giá trị nào cả.
  • var x = 3;
    var y = "3";
    x + y; // Returns "33"
    
    1: mới được giới thiệu trong ES6. Nó lưu trữ các giá trị duy nhất và ẩn danh

Kiểu dữ liệu không nguyên thủy [tham chiếu]:

  • var x = 3;
    var y = "3";
    x + y; // Returns "33"
    
    2: Thể hiện một đối tượng và các thuộc tính có thể truy cập đến.
  • var x = 3;
    var y = "3";
    x + y; // Returns "33"
    
    3: Nhóm các giá trị giống nhau.
  • var x = 3;
    var y = "3";
    x + y; // Returns "33"
    
    4: Biểu thức chính quy.

Giải thích về ép kiểu ngầm trong JavaScript?

Ép kiểu ngầm trong javascript là sự chuyển đổi tự động của giá trị từ kiểu dữ liệu này sang kiểu khác. Nó xảy ra khi thực hiện một biểu thức với các kiểu dữ liệu khác nhau.

Ép kiểu String

Ép kiểu string xảy ra khi dùng toán tử

var x = 3;
var y = "3";
x + y; // Returns "33"
5. Một số cộng với một chuỗi, kiểu số sẽ bị ép thành kiểu chuỗi.

Ví dụ:

var x = 3;
var y = "3";
x + y; // Returns "33"

var x = 24;
var y = "Hello";
x + y; // Returns "24Hello";

Để hiểu về hai ví dụ khi ta cộng một số vào chuỗi, thì khi JavaScript thấy biểu thức

var x = 3;
var y = "3";
x + y; // Returns "33"
6 với hai kiểu khác nhau [một số và một chuỗi], nó chuyển đổi kiểu số thành chuỗi để thực hiện hành động. Sau khi chuyển đổi, cả hai biến đều là kiểu chuỗi, thao tác
var x = 3;
var y = "3";
x + y; // Returns "33"
5 lúc này sẽ thành phép nối chuỗi kết quả là ra chuỗi "33" và "24Hello".

Ngược lại, khi thực hiện phép toán

var x = 3;
var y = "3";
x + y; // Returns "33"
8, thì chuỗi lại bị ép kiểu ngầm thành số. Ví dụ:

var x = 3;
Var y = "3";
x - y    //Returns 0 since the variable y [string type] is converted to a number type

Ép kiểu Boolean

Ép kiểu boolean xảy ra khi sử dụng các toán tử logic, lệnh if hay kiểm tra vòng lặp. Để hiểu về ép kiểu logic, ta cần hiểu về giá trị truthy và falsy.

Giá trị truthy là cái sẽ được ép kiểu thành true. Còn falsy sẽ được ép kiểu thành false.

Tất cả các giá trị ngoại trừ

var x = 3;
var y = "3";
x + y; // Returns "33"
9,
var x = 24;
var y = "Hello";
x + y; // Returns "24Hello";
0,
var x = 24;
var y = "Hello";
x + y; // Returns "24Hello";
1,
var x = 24;
var y = "Hello";
x + y; // Returns "24Hello";
2,
typeof undefined; // undefined
typeof null; // object
4,
typeof undefined; // undefined
typeof null; // object
1, và
var x = 24;
var y = "Hello";
x + y; // Returns "24Hello";
5 thì đều là truthy.

Câu lệnh If:

var x = 0;
var y = 23;

if [x] {
  console.log[x];
} // The code inside this block will not run since the value of x is 0[Falsy]

if [y] {
  console.log[y];
} // The code inside this block will run since the value of y is 23 [Truthy]

Toán tử Logic:

Toán tử logic trong javascript không giống các ngôn ngữ lập trình khác, nó không trả về true hay false, mà nó trả về một toán hạng.

OR [ || ] - Nếu giá trị đầu tiên là truthy, giá trị đầu tiên sẽ được trả về, ngược lại thì nó trả về giá trị thứ hai.

AND [ && ] - Nếu hai giá trị đều là truthy, giá trị thứ hai sẽ được trả về. Nếu giá trị đầu là falsy sẽ trả về giá trị đầu hoặc giá trị hai là falsy sẽ trả về giá trị hai.

Ví dụ:

var x = 220;
var y = "Hello";
var z = undefined;

x | | y    // Returns 220 since the first value is truthy

x | | z   // Returns 220 since the first value is truthy

x && y    // Returns "Hello" since both the values are truthy

y && z   // Returns undefined since the second value is falsy

if[ x && y ]{
  console.log["Code runs" ]; // This block runs because x && y returns "Hello" [Truthy]
}

if[ x || z ]{
  console.log["Code runs"];  // This block runs because x || y returns 220[Truthy]
}

Ép kiểu dấu bằng

Xảy ra khi thực hiện phép "==". Nhớ lại thì phép "==" được dùng để so sánh hai giá trị khác kiểu.

Thực tế khi sử dụng "==" một ép kiểu ngầm đã xảy ra, chuyển đổi tất cả toán hạng về cùng kiểu và so sánh chúng.

Ví dụ:

var a = 12;
var b = "12";
a == b; // Returns true because both 'a' and 'b' are converted to the same type and then compared. Hence the operands are equal.

Ép kiểu ngầm không xảy ra khi dùng "===".

var test = undefined;
alert[test]; //undefined
0

Kết quả:

var x = 24;
var y = "Hello";
x + y; // Returns "24Hello";
6
var x = 24;
var y = "Hello";
x + y; // Returns "24Hello";
7

Giải thích:

Phép toán trên sẽ thực hiện từ phải sang trái, chúng sẽ so sánh lần lượt các phép tính ở dòng lệnh bên trên

var x = 24;
var y = "Hello";
x + y; // Returns "24Hello";
8 sẽ trả về
var x = 24;
var y = "Hello";
x + y; // Returns "24Hello";
6 tiếp tục
var x = 24;
var y = "Hello";
x + y; // Returns "24Hello";
6 so sánh với 3, khi đó
var x = 24;
var y = "Hello";
x + y; // Returns "24Hello";
6 sẽ bị ép kiểu thành
var x = 3;
Var y = "3";
x - y    //Returns 0 since the variable y [string type] is converted to a number type
2 và kết quả là
var x = 24;
var y = "Hello";
x + y; // Returns "24Hello";
6. Dòng lệnh thứ 2 giải thích tương tự chúng ta sẽ thu được về kết quả là
var x = 24;
var y = "Hello";
x + y; // Returns "24Hello";
7

Cho biết kết quả của đoạn code dưới đây?

var test = undefined;
alert[test]; //undefined
1

Kết quả:

var x = 24;
var y = "Hello";
x + y; // Returns "24Hello";
7

Giải thích:

typeof undefined; // undefined
typeof null; // object
2 có kiểu giá trị là undefined nhưng null lại là 1 object

Cho biết kết quả của đoạn code dưới đây?

var test = undefined;
alert[test]; //undefined
2

Kết quả:

var x = 3;
Var y = "3";
x - y    //Returns 0 since the variable y [string type] is converted to a number type
7

Giải thích:

typeof 1 là Number và typeof Number là string

Hàm setInterval trả về cái gì?

var test = undefined;
alert[test]; //undefined
3

  • A: một id duy nhất

  • B: số lượng milliseconds

  • C: function truyền vào

  • D:

    typeof undefined; // undefined
    typeof null; // object
    
    1

Đáp án: A

Nó trả về một id duy nhất. Id này dùng để clear interval sau này với hàm

var x = 3;
Var y = "3";
x - y    //Returns 0 since the variable y [string type] is converted to a number type
9.

Sự khác nhau giữa Bind, Call và Apply trong Javascript?

Ba hàm

var x = 0;
var y = 23;

if [x] {
  console.log[x];
} // The code inside this block will not run since the value of x is 0[Falsy]

if [y] {
  console.log[y];
} // The code inside this block will run since the value of y is 23 [Truthy]
0,
var x = 0;
var y = 23;

if [x] {
  console.log[x];
} // The code inside this block will not run since the value of x is 0[Falsy]

if [y] {
  console.log[y];
} // The code inside this block will run since the value of y is 23 [Truthy]
1 và
var x = 0;
var y = 23;

if [x] {
  console.log[x];
} // The code inside this block will not run since the value of x is 0[Falsy]

if [y] {
  console.log[y];
} // The code inside this block will run since the value of y is 23 [Truthy]
2 là các prototype của Function nên chỉ có Function mới có thể gọi được 3 hàm này. Sở dĩ, một Function có thể gọi Function khác vì trong JavaScript, Function cũng là một loại Object, mà đã là Object thì sẽ có prototype, hay nói cách khác là gọi được phương thức của nó.

  • Nhìn chung, hàm call và apply là gần giống nhau. Chúng đều gọi hàm trực tiếp. Chỉ khác ở cách truyền tham số vào [
    var x = 0;
    var y = 23;
    
    if [x] {
      console.log[x];
    } // The code inside this block will not run since the value of x is 0[Falsy]
    
    if [y] {
      console.log[y];
    } // The code inside this block will run since the value of y is 23 [Truthy]
    
    2 truyền vào một array chứa toàn bộ các tham số còn
    var x = 0;
    var y = 23;
    
    if [x] {
      console.log[x];
    } // The code inside this block will not run since the value of x is 0[Falsy]
    
    if [y] {
      console.log[y];
    } // The code inside this block will run since the value of y is 23 [Truthy]
    
    1 truyền lần lượt từng tham số.]
  • Hàm
    var x = 0;
    var y = 23;
    
    if [x] {
      console.log[x];
    } // The code inside this block will not run since the value of x is 0[Falsy]
    
    if [y] {
      console.log[y];
    } // The code inside this block will run since the value of y is 23 [Truthy]
    
    0 thì hơi khác hơn một chút. Hàm này không gọi hàm trực tiếp mà nó sẽ trả về một hàm mới. Và bạn có thể sử dụng hàm số mới này sau. Về cách truyền tham số vào thì nó giống với hàm
    var x = 0;
    var y = 23;
    
    if [x] {
      console.log[x];
    } // The code inside this block will not run since the value of x is 0[Falsy]
    
    if [y] {
      console.log[y];
    } // The code inside this block will run since the value of y is 23 [Truthy]
    
    1.

Hàm anonymous là gì và khi nào nên sử dụng?

Một Anonymous Function là một hàm không có tên [hay còn gọi là hàm ẩn danh], là một hàm được sinh ra đúng vào thời điểm chạy của chương trình.

Thông thường khi bạn khai báo một hàm thì trình biên dịch sẽ lưu lại trong bộ nhớ nên bạn có thể gọi ở trên hay dưới vị trí khai báo hàm đều được, nhưng với anonymous functions thì nó sẽ được sinh ra khi trình biên dịch xử lý tới vị trí của nó. Ví dụ:

var test = undefined;
alert[test]; //undefined
4

Trong ví dụ này cho dù bạn gọi hàm ở phía trên hay dưới đều hoạt động tốt là vì chương trình đã lưu hàm đó vào bộ nhớ. Nhưng nếu ta sử dụng anonymous function như ví dụ dưới đây sẽ bị lỗi ngay.

var test = undefined;
alert[test]; //undefined
5

Vậy thì, khi nào thì cần Anonymous Function?

Nếu hàm cần được truyền ở nhiều nơi:

  • Định nghĩa 1 hàm thông thường.
  • Truyền hàm đó vào 1 hàm.

Nếu hàm chỉ truyền 1 nơi?

  • Bất tiện khi tạo ra 1 hàm mới [các chi phí như đặt tên hàm].
  • Giúp tăng tính ràng buộc cho việc chỉ được phép truyền 1 lần.
  • Bên cạnh đó hỗ trợ được thêm khả năng chỉ gọi 1 lần.

Strict mode trong JavaScript là gì?

Strict hiểu đơn giản theo nghĩa tiếng Việt là "nghiêm ngặt, nghiêm khắc". Strict Mode là một quy mẫu nghiêm khắc của Javascript. Nếu như coi việc viết code bình thường là Normal Mode, thì

var x = 0;
var y = 23;

if [x] {
  console.log[x];
} // The code inside this block will not run since the value of x is 0[Falsy]

if [y] {
  console.log[y];
} // The code inside this block will run since the value of y is 23 [Truthy]
7 sẽ có thêm nhiều quy định khác so với Normal Mode. Việc đó khiến cho một thao tác vốn bình thường có thể chạy ngon lành trở nên lỗi, và throw ra errors.

Nhìn chung, Strict được tạo ra nhằm:

  • Ngăn chặn sử dụng, và throw errors khi người lập trình thực hiện những xử lý được coi là unsafe, những xử lý mà có thể là ngoài ý muốn.
  • Vô hiệu hoá các tính năng có thể gây nhầm lẫn, hoặc không nên được sử dụng.
  • Ngăn chặn sử dụng một số từ mà có thể sẽ được sử dụng làm keywork trong tương lai. Dưới đây là một số ví dụ

Gán giá trị cho biến chưa được khai báo

var test = undefined;
alert[test]; //undefined
6

Báo lỗi khi sử dụng

var x = 0;
var y = 23;

if [x] {
  console.log[x];
} // The code inside this block will not run since the value of x is 0[Falsy]

if [y] {
  console.log[y];
} // The code inside this block will run since the value of y is 23 [Truthy]
8

var test = undefined;
alert[test]; //undefined
7

Các tham số của hàm không được trùng nhau

var test = undefined;
alert[test]; //undefined
8

Không cho phép khai báo biến dưới dạng hệ nhị phân

var test = undefined;
alert[test]; //undefined
9

Không được phép ghi đè lên thuộc tính chỉ được phép đọc

var test = null;
alert[test]; //null
0

Không sử dụng được

var x = 0;
var y = 23;

if [x] {
  console.log[x];
} // The code inside this block will not run since the value of x is 0[Falsy]

if [y] {
  console.log[y];
} // The code inside this block will run since the value of y is 23 [Truthy]
9

var test = null;
alert[test]; //null
1

Không cho phép khai báo biến trong

var x = 220;
var y = "Hello";
var z = undefined;

x | | y    // Returns 220 since the first value is truthy

x | | z   // Returns 220 since the first value is truthy

x && y    // Returns "Hello" since both the values are truthy

y && z   // Returns undefined since the second value is falsy

if[ x && y ]{
  console.log["Code runs" ]; // This block runs because x && y returns "Hello" [Truthy]
}

if[ x || z ]{
  console.log["Code runs"];  // This block runs because x || y returns 220[Truthy]
}
0

var test = null;
alert[test]; //null
2

Không chấp nhận khai báo các keyword. Ở chế độ strict mode thì các bạn sẽ không sử dụng được các từ khóa sau để khai báo làm tên biến, hằng,...

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield
  • arguments

Làm sao để clone một mảng?

Để clone một mảng, chúng ta có thể sử dụng một trong các cách dưới đây:

1. Sử dụng hàm slice:

var test = null;
alert[test]; //null
3

2. Sử dụng hàm
var x = 220;
var y = "Hello";
var z = undefined;

x | | y    // Returns 220 since the first value is truthy

x | | z   // Returns 220 since the first value is truthy

x && y    // Returns "Hello" since both the values are truthy

y && z   // Returns undefined since the second value is falsy

if[ x && y ]{
  console.log["Code runs" ]; // This block runs because x && y returns "Hello" [Truthy]
}

if[ x || z ]{
  console.log["Code runs"];  // This block runs because x || y returns 220[Truthy]
}
1 và
var x = 220;
var y = "Hello";
var z = undefined;

x | | y    // Returns 220 since the first value is truthy

x | | z   // Returns 220 since the first value is truthy

x && y    // Returns "Hello" since both the values are truthy

y && z   // Returns undefined since the second value is falsy

if[ x && y ]{
  console.log["Code runs" ]; // This block runs because x && y returns "Hello" [Truthy]
}

if[ x || z ]{
  console.log["Code runs"];  // This block runs because x || y returns 220[Truthy]
}
2 [deep copy]:

var test = null;
alert[test]; //null
4

3. Sử dụng toán tử spread operator
var x = 220;
var y = "Hello";
var z = undefined;

x | | y    // Returns 220 since the first value is truthy

x | | z   // Returns 220 since the first value is truthy

x && y    // Returns "Hello" since both the values are truthy

y && z   // Returns undefined since the second value is falsy

if[ x && y ]{
  console.log["Code runs" ]; // This block runs because x && y returns "Hello" [Truthy]
}

if[ x || z ]{
  console.log["Code runs"];  // This block runs because x || y returns 220[Truthy]
}
3 trong ES6:

var test = null;
alert[test]; //null
5

4. Sử dụng
var x = 220;
var y = "Hello";
var z = undefined;

x | | y    // Returns 220 since the first value is truthy

x | | z   // Returns 220 since the first value is truthy

x && y    // Returns "Hello" since both the values are truthy

y && z   // Returns undefined since the second value is falsy

if[ x && y ]{
  console.log["Code runs" ]; // This block runs because x && y returns "Hello" [Truthy]
}

if[ x || z ]{
  console.log["Code runs"];  // This block runs because x || y returns 220[Truthy]
}
4:

var test = null;
alert[test]; //null
6

5. Sử dụng
var x = 220;
var y = "Hello";
var z = undefined;

x | | y    // Returns 220 since the first value is truthy

x | | z   // Returns 220 since the first value is truthy

x && y    // Returns "Hello" since both the values are truthy

y && z   // Returns undefined since the second value is falsy

if[ x && y ]{
  console.log["Code runs" ]; // This block runs because x && y returns "Hello" [Truthy]
}

if[ x || z ]{
  console.log["Code runs"];  // This block runs because x || y returns 220[Truthy]
}
5

var test = null;
alert[test]; //null
7

Ngoài ra chúng ta cũng có thể clone mảng qua các hàm như vòng lặp

var x = 220;
var y = "Hello";
var z = undefined;

x | | y    // Returns 220 since the first value is truthy

x | | z   // Returns 220 since the first value is truthy

x && y    // Returns "Hello" since both the values are truthy

y && z   // Returns undefined since the second value is falsy

if[ x && y ]{
  console.log["Code runs" ]; // This block runs because x && y returns "Hello" [Truthy]
}

if[ x || z ]{
  console.log["Code runs"];  // This block runs because x || y returns 220[Truthy]
}
6, vòng lặp
var x = 220;
var y = "Hello";
var z = undefined;

x | | y    // Returns 220 since the first value is truthy

x | | z   // Returns 220 since the first value is truthy

x && y    // Returns "Hello" since both the values are truthy

y && z   // Returns undefined since the second value is falsy

if[ x && y ]{
  console.log["Code runs" ]; // This block runs because x && y returns "Hello" [Truthy]
}

if[ x || z ]{
  console.log["Code runs"];  // This block runs because x || y returns 220[Truthy]
}
7,
var x = 220;
var y = "Hello";
var z = undefined;

x | | y    // Returns 220 since the first value is truthy

x | | z   // Returns 220 since the first value is truthy

x && y    // Returns "Hello" since both the values are truthy

y && z   // Returns undefined since the second value is falsy

if[ x && y ]{
  console.log["Code runs" ]; // This block runs because x && y returns "Hello" [Truthy]
}

if[ x || z ]{
  console.log["Code runs"];  // This block runs because x || y returns 220[Truthy]
}
8,...

Scope của 1 biến trong javascript là gì? Có bao nhiêu loại scope?

Scope của 1 biến là phạm vi trong chương trình của bạn mà biến đó được định nghĩa và thể sử dụng được.

Trong javascript có 3 loại scope:

  • var x = 220;
    var y = "Hello";
    var z = undefined;
    
    x | | y    // Returns 220 since the first value is truthy
    
    x | | z   // Returns 220 since the first value is truthy
    
    x && y    // Returns "Hello" since both the values are truthy
    
    y && z   // Returns undefined since the second value is falsy
    
    if[ x && y ]{
      console.log["Code runs" ]; // This block runs because x && y returns "Hello" [Truthy]
    }
    
    if[ x || z ]{
      console.log["Code runs"];  // This block runs because x || y returns 220[Truthy]
    }
    
    9: có phạm vị hoạt động ở bất kỳ trong mã javascript của bạn.
  • var a = 12;
    var b = "12";
    a == b; // Returns true because both 'a' and 'b' are converted to the same type and then compared. Hence the operands are equal.
    
    0: có phạm vi hoạt động trong function mà bạn khai báo biến đó.
  • var a = 12;
    var b = "12";
    a == b; // Returns true because both 'a' and 'b' are converted to the same type and then compared. Hence the operands are equal.
    
    1: có phạm vị trong cặp dấu {} mà bạn khai báo biến đó. [ES6]

Khi nào cần sử dụng async và defer trong javascript?

var test = null;
alert[test]; //null
8

Với thẻ script không có thuộc tính gì khác thì HTML file sẽ được parse cho đến khi gặp phải thẻ

var a = 12;
var b = "12";
a == b; // Returns true because both 'a' and 'b' are converted to the same type and then compared. Hence the operands are equal.
2, đến lúc này thì quá trình parse sẽ tạm dùng và để fetch script file về [nếu là external file], sau đó
var a = 12;
var b = "12";
a == b; // Returns true because both 'a' and 'b' are converted to the same type and then compared. Hence the operands are equal.
3 những code script này, sau đó mới tiếp tục lại quá trình parse html.

var test = null;
alert[test]; //null
9

Với thẻ script có thuộc tính

var a = 12;
var b = "12";
a == b; // Returns true because both 'a' and 'b' are converted to the same type and then compared. Hence the operands are equal.
4, khi quá trình parse html gặp phải script này, nó sẽ vẫn tiếp tục parse html cho đến khi script này được download xong, thì quá trình parse html mới tạm dừng để
var a = 12;
var b = "12";
a == b; // Returns true because both 'a' and 'b' are converted to the same type and then compared. Hence the operands are equal.
3 những code script này, sau đó lại tiếp tiếp quá trình parse html.

typeof undefined; // undefined
typeof null; // object
0

Với thẻ script có thuộc tính

var a = 12;
var b = "12";
a == b; // Returns true because both 'a' and 'b' are converted to the same type and then compared. Hence the operands are equal.
6, quá trình parse html sẽ không bị dừng lại mà parse cho đến khi hoàn thành, quá trình download các script file được tiến hành song song, và cuối cùng thì sẽ execute những script code này khi html đã parse xong.

Việc hiểu rõ tính chất, nguyên lý của 2 thuộc tính trên sẽ giúp biết rõ nên sử dụng chúng trong từng trường hợp cụ thể nào. Một số gợi ý:

Chủ Đề