Bộ câu hỏi phỏng vấn Javascript phần 2

Closure trong javascript là gì, cho ví dụ?


Trong javascript, closure là một chức năng có quyền truy cập vào phạm vi cha, ngay cả sau khi scope đã đóng.

Đầu tiên bạn phải hiểu về scope như đã nói ở trên? Scope chính là tuổi thọ của một biến trong javascript. Bạn có thể thấy trong đó một biến được định nghĩa đóng một vai trò lớn trong khoảng thời gian của biến đó và các hàm trong chương trình của bạn có quyền truy cập vào đó.

Ví dụ:

Khi sử dụng closure

function newCounter() {
  var count = 0;

  return function () {
    count += 1;
    return count;
  };
}

var counter = newCounter();

console.log(counter());
// Output: 1

console.log(counter());
// Output: 2

console.log(counter());
// Output: 3

Không ai có thể truy cập được count ngoài function newCounter() nhưng function được trả về bởi newCounter vẫn có quyền truy cập count nếu chúng ta tiếp tục khai báo thêm những lần nữa. Điều đó có nghĩa là các biến thay đổi giá trị.

Khi không sử dụng closure

function getValue() {
  var a = 1;
  var b = 2;
  return a + b;
}

var val = getValue();
console.log(val);
// Output: 3

Kể các cách khai báo 1 biến trong Javascript?


Có 3 cách:

  • Var: var test = 10;​
  • Let: let test = 10;​
  • Const: const test = 10;

Object trong Javascript là gì?


Trong JavaScript, một object là một thực thể độc lập, với thuộc tính và kiểu. Lấy cái cốc làm ví dụ. Cái cốc là một object có những thuộc tính của riêng nó. Một cái tách có màu sắc, thiết kế, trọng lượng, chất liệu tạo ra nó, vân vân... Tương tự như vậy, JavaScript objects có thể có những thuộc tính định nghĩa nên đặc tính của nó.

image

Đối tượng trong Javascript là một tập hợp các cặp khóa - giá trị, tương tự như bản đồ, từ điển, hay hash-table trong ngôn ngữ lập trình khác.

  • Đối tượng là một tập hợp các thuộc tính
  • Thuộc tính là một cặp khóa - giá trị chứa tên và giá trị
  • Tên thuộc tính là một giá trị duy nhất có thể bị ép buộc vào một chuỗi và trỏ đến một giá trị
  • Giá trị thuộc tính có thể là bất kỳ giá trị nào, bao gồm các đối tượng khác hoặc các hàm, được liên kết với tên/khóa

Dưới đây là cách tạo object trong Javascript

// literal
const dog = {};

// constructor
const cat = new Object();

// static method
const horse = Object.create({});

Array trong Javascript là gì?


Một array là một đối tượng chứa các giá trị (thuộc bất kỳ kiểu nào) ở các vị trí được lập index:

var arr = ["hello world", 42, true];
arr[0]; // "hello world"
arr[1]; // 42
arr[2]; // true
arr.length; // 3

typeof arr; // "object"

JavaScript là ngôn ngữ kiểu tĩnh hay kiểu động?


JavaScript là ngôn ngữ kiểu động. Trong ngôn ngữ kiểu động, kiểu dữ liệu của biến được kiểm tra trong khi đang chạy chương trình ngược lại với kiểu tĩnh, nơi kiểu dữ liệu của biến được kiểm tra khi biên dịch.

JavaScript là ngôn ngữ kiểu tĩnh hay kiểu động

Vì Javascript là ngôn ngữ kiểu động, nên một biến có thể giữ bất kỳ kiểu dữ liệu nào. Ví dụ:

var a = 23;
var a = "Hello World!";

</div>

<div class="question question--basic">
  <h2>Toán tử typeof trong Javascript là gì?</h2><hr />

JavaScript cung cấp một toán tử `typeof` có thể kiểm tra một giá trị và cho bạn biết nó là loại gì:

```js
var a;
typeof a; // "undefined"

a = "hello world";
typeof a; // "string"

a = 42;
typeof a; // "number"

a = true;
typeof a; // "boolean"

a = null;
typeof a; // "object" -- weird, bug

a = undefined;
typeof a; // "undefined"

a = { b: "c" };
typeof a; // "object"

So sánh == và === trong Javascript


JavaScript có 2 loại so sánh:

  • Strict comparison (===) kiểm tra giá trị bằng nhau mà không tự động ép kiểu.
  • Abstract comparison (==) kiểm tra giá trị bằng nhau có tự động ép kiểu.
var a = "42";
var b = 42;

a == b; // true
a === b; // false

Một số quy tắc so sánh đơn giản:

  • Nếu giá trị của một trong hai bên của phép so sánh là true hoặc false, hãy tránh == và sử dụng ===.
  • Nếu giá trị của một trong hai bên của phép so sánh là các giá trị cụ thể này (0, "" hoặc [] -- mảng trống), hãy tránh == và sử dụng ===.
  • Trong tất cả các trường hợp khác, bạn có thể yên tâm sử dụng ==. Nó không chỉ an toàn mà trong nhiều trường hợp, nó đơn giản hóa mã của bạn giúp dễ đọc hơn.

Bài tập thuật toán Lucky sevens


Yêu cầu: Viết một hàm có tên lucky_sevens nhận một mảng các số nguyên và trả về giá trị true nếu ba phần tử liên tiếp bất kỳ có tổng bằng 7.

Giải pháp:

function lucky_sevens(arr) {
  // nếu mảng có ít hơn 3 phần tử thì trả về false
  if (arr.length < 3) {
    return "not possible";
  }

  // chạy một vòng lặp từ phần tử vị trí 3 đến cuối và kiểm tra xem 3 số liên tiếp có tổng bằng 7 hay không
  for (var i = 2; i < arr.length; i++) {
    if (arr[i] + arr[i - 1] + arr[i - 2] === 7) {
      return true;
    }
  }
  return false;
}

lucky_sevens([2, 1, 5, 1, 0]);

Giá trị trả về là gì?

[..."Lydia"];
  • A: ["L", "y", "d", "i", "a"]
  • B: ["Lydia"]
  • C: [[], "Lydia"]
  • D: [["L", "y", "d", "i", "a"]]

Đáp án: A

String là một iterable. Thế nên spread operator sẽ map toàn bộ các ký tự trong chuỗi lại thành một mảng.

Điểm khác nhau giữa method GET và method POST?


GET:

  • Có thể bị cache.
  • Nằm trong history của browser.
  • Có thể bookmarked
  • Dữ liệu truyền đi sẽ hiện trên url và chúng bị giới hạn (độ dài tối đa của URL là 2048).
  • Hạn chế về loại dữ liệu: chỉ có ký tự ASCII được cho phép

POST:

  • Dùng để submit data tới servers.
  • Không bị cache
  • Không nằm trong history của browser.
  • Không thể bookmarked
  • Dữ liệu truyền đi nằm trong body của request.
  • Không bị giới hạn dữ liệu truyền đi.
  • Không giới hạn loại dữ liệu truyền đi.

Con trỏ "This" trong javascript được dùng để làm gì?


Trong javascript, chúng ta dùng từ khóa this để đại diện cho một đối tượng (Object). Đối tượng đó là chủ thế của ngữ cảnh, hoặc là chủ thế của code đang được chạy.

Ví dụ:

var person = {
  firstName: "kungfutech.edu.vn",
  lastName: "Thaycacac",
  showName: function () {
    console.log(this.firstName + " " + this.lastName);
  },
};

//Ở đây this sẽ là object person
person.showName(); //kungfutech.edu.vn Thaycacac

Một trường hợp khác, khi ta khai báo biến global và hàm global, toàn bộ các biến và hàm đó sẽ nằm trong một object có tên là window. Lúc này, khi ta gọi hàm showName, chính object window là object gọi hàm đó, this trỏ tới chính object window.

var firstName = "kungfutech.edu.vn",
  lastName = "Thaycacac";
// 2 biến này nằm trong object window

function showName() {
  console.log(this.firstName + " " + this.lastName);
}

window.showName(); //kungfutech.edu.vn Thaycacac - this trỏ tới object window
showName(); //kungfutech.edu.vn Thaycacac - Object gọi hàm showName vẫn là object window
Avatar Techmely Team
VIẾT BỞI

Techmely Team