Tin tức và phân tích của tất cả các thiết bị di động

Các câu hỏi và câu trả lời thường gặp về cuộc phỏng vấn JavaScript

Có JavaScript trong danh mục đầu tư của bạn sẽ tăng cơ hội nhận được vai trò nhà phát triển. Như vậy, chúng ta hãy xem Câu hỏi thường gặp về Phỏng vấn JavaScript.

JavaScript là một trong những ngôn ngữ được sử dụng nhiều nhất trong phát triển web. Bây giờ nó được sử dụng để tạo hầu hết mọi loại ứng dụng.

Trước khi chuyển sang câu hỏi phỏng vấn, chúng ta hãy xem lợi ích của việc học JavaScript.

JavaScript là ngôn ngữ lập trình nhẹ, được giải thích hoặc biên dịch theo thời gian. Đây là một trong những ngôn ngữ chính của World Wide Web. Bạn biết hai ngôn ngữ www cơ bản khác. Tốt hơn nên tìm kiếm chúng nếu không.

JavaScript chủ yếu được viết cho web. Nhưng bây giờ nó không chỉ là về web. Với sự trợ giúp của các môi trường như Node, Deno, v.v., chúng ta có thể chạy nó trên hầu hết mọi nền tảng.

Hãy xem nó có những ưu điểm gì nhé.

Ưu điểm của JavaScript

  • Dễ dàng để bắt đầu. Bạn có thể học nó ngay cả khi không có bất kỳ kiến ​​thức mã hóa nào.
  • Có một cộng đồng lớn xung quanh nó. Bạn sẽ nhận được tất cả sự trợ giúp cần thiết nếu bạn gặp khó khăn ở bất cứ đâu.
  • Có nhiều thư viện/framework được xây dựng bằng JavaScript giúp phát triển ứng dụng nhanh hơn.
  • Chúng ta có thể tạo các ứng dụng frontend, backend, android, iOS, v.v. bằng JavaScript. Chúng tôi có thể tạo hầu hết mọi loại ứng dụng với nó. Nhưng nó đáng tin cậy hơn cho việc phát triển web.
  • Các kiểu dữ liệu trong JavaScript là gì?

    Các kiểu dữ liệu được sử dụng để lưu trữ các loại dữ liệu khác nhau. Các kiểu dữ liệu sẽ khác nhau tùy thuộc vào ngôn ngữ lập trình. Trong JavaScript chúng ta có 8 Loại dữ liệu. Chúng ta hãy xem từng cái một.

    • Con số
    • Sợi dây
    • Hợp lý
    • không xác định
    • Số không
    • BigInt
    • Biểu tượng
    • Sự vật

    Tất cả các kiểu dữ liệu ngoại trừ Object đều được gọi là giá trị nguyên thủy. Và chúng không thay đổi.

    Các phương thức tích hợp trong JavaScript là gì?

    Các phương thức tích hợp trong JavaScript khác nhau đối với từng loại dữ liệu. Chúng ta có thể truy cập các phương thức tích hợp này bằng cách sử dụng kiểu dữ liệu thích hợp. Chúng ta hãy xem một số phương thức tích hợp cho các kiểu dữ liệu và cấu trúc dữ liệu khác nhau.

  • Con số
  • Sợi dây
    • thành chữ thường
    • bắt đầu với
    • biểu đồ tại
  • Mảng
  • Có nhiều phương pháp tích hợp sẵn cho từng loại dữ liệu. Bạn có thể kiểm tra tài liệu tham khảo cho tất cả các phương thức tích hợp của các kiểu dữ liệu và cấu trúc dữ liệu khác nhau.

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

    Mảng là một trong những cấu trúc dữ liệu cơ bản trong JavaScript. Mảng có thể chứa dữ liệu tùy ý vì JavaScript là động. Hãy xem cách tạo mảng trong JavaScript.

    Chúng ta có thể tạo một mảng bằng dấu ngoặc vuông[]. Tạo đối tượng rất đơn giản và nhanh chóng

    // Empty array
    const arr = [];
    
    // Array with some random values
    const randomArr = [1, "One", true];
    
    console.log(arr, randomArr);

    Chúng ta có thể tạo một mảng bằng cách sử dụng hàm tạo Array. Mọi người hiếm khi sử dụng hàm tạo để tạo mảng trong các dự án chung.

    // Empty array
    const arr = new Array();
    
    // Array with some random values
    const randomArr = new Array(1, "One", true);
    
    console.log(arr, randomArr);

    Mảng JavaScript có thể thay đổi, tức là chúng ta có thể tự do sửa đổi chúng sau khi chúng được tạo.

    Làm cách nào để tạo một đối tượng trong JavaScript?

    Ngoài mảng, đối tượng còn là một cấu trúc dữ liệu cơ bản khác trong JavaScript. Các đối tượng sử dụng một kho lưu trữ các cặp khóa-giá trị. Khóa phải là giá trị bất biến trong khi giá trị có thể là bất kỳ giá trị nào. Hãy xem cách tạo đối tượng trong JavaScript.

    Chúng ta có thể tạo đối tượng bằng dấu ngoặc nhọn {}. Tạo các đối tượng rất đơn giản và nhanh chóng.

    // Empty object
    const object = {};
    
    // Object with some random values
    const randomObject = { 1: 2, one: "Two", true: false };
    
    console.log(object, randomObject);

    Chúng ta có thể tạo các đối tượng bằng cách sử dụng trình tạo đối tượng. Mọi người hiếm khi sử dụng điều này trong các dự án chung.

    // Empty object
    const object = new Object();
    
    // Object with some random values
    const randomObject = new Object();
    randomObject[1] = 2;
    randomObject["one"] = "Two";
    randomObject[true] = false;
    
    console.log(object, randomObject);

    Các đối tượng JavaScript có thể thay đổi, tức là chúng ta có thể sửa đổi chúng sau khi tạo, như bạn có thể thấy trong ví dụ thứ hai.

    Làm cách nào để gỡ lỗi mã JavaScript?

    Gỡ lỗi mã không phải là dễ dàng. Điều này thay đổi tùy theo ngôn ngữ lập trình, dự án này sang dự án khác, v.v.; hãy xem những điều phổ biến được sử dụng để gỡ lỗi JavaScript.

    1. Đăng nhập

    Chúng ta có thể sử dụng câu lệnh console.log ở nhiều nơi trong mã của mình để xác định lỗi. Mã sẽ ngừng chạy các dòng mã tiếp theo khi có lỗi ở dòng trước đó.

    Ghi nhật ký là một trong những phương pháp gỡ lỗi cũ khá hiệu quả đối với các dự án nhỏ. Đây là một kỹ thuật gỡ lỗi phổ biến cho bất kỳ ngôn ngữ lập trình nào.

    2. Công cụ phát triển

    JavaScript được sử dụng phổ biến nhất để phát triển các ứng dụng web. Vì vậy hầu như tất cả các trình duyệt hiện nay đều có công cụ dành cho nhà phát triển để giúp gỡ lỗi mã JavaScript.

    Một trong những phương pháp gỡ lỗi được sử dụng phổ biến nhất là đặt điểm dừng trong các công cụ phát triển. Điểm dừng dừng thực thi JavaScript và cung cấp cho bạn tất cả thông tin về việc thực thi tại thời điểm đó.

    Chúng ta có thể đặt nhiều điểm dừng xung quanh nơi xảy ra lỗi và xem nguyên nhân gây ra lỗi. Đây là cách hiệu quả nhất để gỡ lỗi các ứng dụng web JavaScript.

    3. tôi đang đi

    Chúng ta có thể sử dụng IDE để gỡ lỗi JavaScript. Mã VS hỗ trợ gỡ lỗi với các điểm dừng. Tính năng gỡ lỗi có thể khác nhau tùy thuộc vào IDE bạn đang sử dụng. Nhưng hầu hết các IDE sẽ có tính năng này.

    Làm cách nào để thêm mã JavaScript vào tệp HTML?

    Chúng ta có thể thêm tệp HTML JavaScript bằng thẻ script. Bạn có thể kiểm tra ví dụ dưới đây.

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <title>newsblog.pl</title>
      </head>
      <body>
        <h1>newsblog.pl</h1>
    
        <script>
          // JavaScript code goes here
          console.log("This is JavaScript code");
        </script>
      </body>
    </html>

    Cookie là gì?

    Cookie là cặp khóa-giá trị được sử dụng để lưu trữ những mẩu thông tin nhỏ. Thông tin có thể là bất cứ điều gì. Chúng tôi có thể đặt thời gian hết hạn cho các cookie sẽ bị xóa sau ngày hết hạn. Chúng được sử dụng rộng rãi để lưu trữ thông tin về người dùng.

    Cookies sẽ không bị xóa ngay cả khi chúng tôi làm mới trang cho đến khi chúng tôi xóa chúng hoặc chúng hết hạn. Bạn có thể kiểm tra cookie của bất kỳ ứng dụng/trang web nào trong bất kỳ trình duyệt nào bằng cách mở các công cụ dành cho nhà phát triển.

    Chúng ta có thể đọc tệp cookie bằng JavaScript bằng document.cookie. Nó sẽ trả về tất cả các cookie chúng tôi đã tạo.

    console.log("All cookies", document.cookie);

    Nó sẽ trả về một chuỗi trống nếu không có cookie.

    Chúng tôi có thể tạo cookie bằng cách đặt cặp khóa-giá trị thành document.cookie. Hãy xem một ví dụ.

    document.cookie = "one=One;";

    Trong cú pháp trên, một khóa cookie và một khóa là giá trị của nó. Chúng tôi có thể thêm nhiều thuộc tính hơn vào cookie, chẳng hạn như tên miền, đường dẫn, ngày hết hạn, v.v.; mỗi cái phải được phân tách bằng dấu chấm phẩy (;). Tất cả các thuộc tính là tùy chọn.

    Hãy xem một ví dụ với các thuộc tính.

    document.cookie = "one=One;expires=Jan 31 2023;path=/;";

    Trong đoạn mã trên, chúng tôi đã thêm ngày hết hạn và đường dẫn tới cookie. Nếu ngày hết hạn không được cung cấp, cookie sẽ bị xóa sau khi kết thúc phiên. Đường dẫn mặc định sẽ là đường dẫn tệp. Định dạng ngày hết hạn phải ở định dạng GMT.

    Hãy xem cách tạo nhiều cookie.

    document.cookie = "one=One;expires=Jan 31 2023;path=/;";
    document.cookie = "two=Two;expires=Jan 31 2023;path=/;";
    document.cookie = "three=Three;expires=Jan 31 2023;path=/;";

    Cookie sẽ không bị ghi đè nếu khóa hoặc đường dẫn khác khi cài đặt nhiều cookie. Nếu key và đường dẫn giống nhau thì cookie trước đó sẽ bị ghi đè. Hãy xem ví dụ dưới đây sẽ thay thế bộ cookie trước đó.

    document.cookie = "one=One;expires=Jan 31 2023;path=/;";
    document.cookie = "one=Two;path=/;";

    Chúng tôi đã xóa ngày hết hạn khỏi cookie và thay đổi giá trị.

    Sử dụng ngày hết hạn làm ngày trong tương lai khi kiểm tra xem mã của bạn có hoạt động bình thường không. Nếu bạn giữ nguyên ngày 31 tháng 1 năm 2023 ngay cả sau ngày 31 tháng 1 năm 2023 thì cookie sẽ không được tạo.

    Chúng tôi đã xem cách tạo và cập nhật cookie. Hãy xem cách xóa cookie.

    Xóa cookie thật dễ dàng. Chỉ cần thay đổi ngày hết hạn của cookie thành bất kỳ ngày nào trong quá khứ. Hãy xem ví dụ dưới đây.

    // Creating cookies
    document.cookie = "one=One;expires=Jan 31 2023;path=/;";
    document.cookie = "two=Two;expires=Jan 31 2023;path=/;";
    document.cookie = "three=Three;expires=Jan 31 2023;path=/;";
    
    // Deleting the last cookie
    document.cookie = "three=Three;expires=Jan 1 2023;path=/;";

    Bạn sẽ không tìm thấy cookie cuối cùng trong cookie vì nó đã bị xóa ở dòng mã cuối cùng. Vậy là xong phần hướng dẫn về cookie tối thiểu.

    Các khung JavaScript khác nhau là gì?

    Có nhiều khung JavaScript. React, Vue, Angular, v.v. để tạo giao diện người dùng. Express, Koa, Nest, v.v. để phát triển phía máy chủ. NextJS, Gatsby, v.v. để tạo các trang tĩnh. React Native, Ionic, v.v. để phát triển ứng dụng di động. Chúng tôi đã đề cập đến một số khung JavaScript ở đây. Bạn có thể tìm thêm các framework sẽ mất nhiều thời gian để nghiên cứu. Khám phá khi bạn cần chúng.

    Đóng cửa trong JavaScript

    Đóng cửa là một chức năng liên quan đến phạm vi từ vựng và môi trường từ vựng gốc. Việc đóng cửa cho phép chúng tôi truy cập dữ liệu từ phạm vi bên ngoài. Các bao đóng được tạo khi tạo các hàm.

    function outer() {
      const a = 1;
      function inner() {
        // We can access all the data from the outer function scope here
        // The data will be available even if we execute this function outside the outer function 
        // as inners' closure formed while creating it
        console.log("Accessing a inside inner", a);
      }
      return inner;
    }
    
    const innerFn = outer();
    innerFn();

    Closure được sử dụng rộng rãi trong các ứng dụng JavaScript. Bạn có thể đã sử dụng chúng trước đây mà không nhận ra rằng chúng đã bị đóng. Còn nhiều điều cần tìm hiểu về việc đóng cửa. Hãy chắc chắn rằng bạn hiểu đầy đủ khái niệm này.

    Nâng cao trong JavaScript

    Hoisting là một quá trình trong JavaScript trong đó việc khai báo các biến, hàm và lớp sẽ chuyển lên đầu phạm vi trước khi thực thi mã.

    // Accessing `name` before declaring
    console.log(name);
    
    // Declaring and initializing the `name`
    var name = "newsblog.pl";

    Nếu bạn chạy đoạn mã trên, bạn sẽ không thấy bất kỳ lỗi nào. Nhưng ở hầu hết các ngôn ngữ, bạn sẽ gặp lỗi. Đầu ra sẽ không được xác định vì việc nâng chỉ di chuyển các khai báo lên trên cùng và không khởi tạo chúng ở số dòng 3.

    Thay đổi var thành let hoặc const như sau và chạy lại mã.

    // Accessing `name` before declaring
    console.log(name);
    
    // Declaring and initializing the `name`
    const name = "newsblog.pl";

    Bây giờ bạn sẽ gặp lỗi tham chiếu cho biết chúng tôi không thể truy cập biến trước khi nó được khởi tạo.

    ReferenceError: Cannot access 'name' before initialization

    Vì vậy, ở đây let và const được giới thiệu trong ES6 và không thể truy cập được trước khi khởi tạo như lỗi được đề xuất. Điều này là do các biến được khai báo bằng let hoặc const sẽ nằm trong múi giờ chết (TDZ) cho đến khi dòng được khởi tạo. Chúng tôi không có quyền truy cập vào các biến từ TDZ.

    Cà ri trong JavaScript

    Currying là một kỹ thuật chuyển đổi các hàm có nhiều tham số thành ít tham số hơn với nhiều lệnh gọi. Nhờ nó, chúng ta có thể chuyển đổi hàm có thể gọi được add(a, b, c, d) thành hàm có thể gọi được là add(a)(b)(c)(d). Hãy xem một ví dụ về cách thực hiện việc này.

    function getCurryCallback(callback) {
      return function (a) {
        return function (b) {
          return function (c) {
            return function (d) {
              return callback(a, b, c, d);
            };
          };
        };
      };
    }
    
    function add(a, b, c, d) {
      return a + b + c + d;
    }
    
    const curriedAdd = getCurryCallback(add);
    
    // Calling the curriedAdd
    console.log(curriedAdd(1)(2)(3)(4));

    Chúng ta có thể khái quát hóa getCurryCallback để sử dụng trong nhiều chức năng khác nhau nhằm chuyển đổi sang cuộc gọi cà ri. Bạn có thể tham khảo Thông tin JavaScript để biết thêm thông tin về điều này.

    Sự khác biệt giữa tài liệu và cửa sổ

    Cửa sổ là đối tượng cao nhất trong trình duyệt. Chứa tất cả thông tin cửa sổ trình duyệt như lịch sử, vị trí, điều hướng, v.v; có sẵn trên toàn cầu bằng JavaScript. Chúng tôi có thể sử dụng nó trực tiếp trong mã của mình mà không cần nhập. Chúng ta có thể truy cập các thuộc tính và phương thức của đối tượng cửa sổ mà không cần có cửa sổ.

    Tài liệu là một phần của đối tượng cửa sổ. Tất cả HTML được tải trên trang web sẽ được chuyển đổi thành đối tượng tài liệu. Đối tượng tài liệu đề cập đến một phần tử HTMLDocument đặc biệt sẽ có các thuộc tính và phương thức khác nhau giống như tất cả các phần tử HTML.

    Cửa sổ nơi đối tượng đại diện cho cửa sổ trình duyệt và tài liệu đại diện cho tài liệu HTML được tải trong cửa sổ trình duyệt đó.

    Sự khác biệt giữa phía client và phía server

    Phía khách hàng đề cập đến người dùng cuối sử dụng ứng dụng. Phía máy chủ đề cập đến máy chủ web nơi ứng dụng được triển khai.

    Trong thuật ngữ giao diện người dùng, chúng ta có thể nói rằng trình duyệt trên máy tính của người dùng là phía máy khách và dịch vụ đám mây là phía máy chủ.

    Sự khác biệt giữa InnerHTML và InnerText

    Cả InternalHTML và InnerText đều là thuộc tính của các phần tử HTML. Với các thuộc tính này, chúng ta có thể thay đổi nội dung của phần tử HTML.

    Chúng ta có thể gán một chuỗi HTML cho thuộc tính InnerHTML được hiển thị giống như HTML thông thường. Hãy xem ví dụ dưới đây.

    const titleEl = document.getElementById("title");
    
    titleEl.innerHTML = '<span style="color:orange;">newsblog.pl</span>';

    Thêm một phần tử có id tiêu đề vào HTML của bạn và thêm đoạn mã trên vào tệp JavaScript của bạn. Chạy mã và xem kết quả. Bạn sẽ có newsblog.pl màu cam. Và nếu bạn kiểm tra phần tử, nó sẽ nằm trong thẻ span. Vì vậy, InternalHTML sẽ lấy chuỗi HTML và hiển thị nó dưới dạng HTML đơn giản.

    InternalText ở phía bên kia sẽ lấy một chuỗi bình thường và hiển thị nó như cũ. Nó sẽ không hiển thị bất kỳ HTML nào như InternalHTML. Thay đổi InternalHTML thành InnerText trong đoạn mã trên và kiểm tra kết quả.

    const titleEl = document.getElementById("title");
    
    titleEl.innerText="<span style="color:orange;">newsblog.pl</span>";

    Bây giờ bạn sẽ thấy chuỗi chính xác mà chúng tôi cung cấp trên trang web.

    Sự khác biệt giữa let và var

    Từ khóa let và var được sử dụng để tạo biến trong JavaScript. Từ khóa let đã được giới thiệu trong ES6.

    Đặt phạm vi khối và var bị hạn chế chức năng.

    {
      let a = 2;
      console.log("Inside block", a);
    }
    console.log("Outside block", a);

    Chạy đoạn mã trên. Bạn sẽ gặp lỗi ở dòng cuối cùng vì chúng tôi không thể truy cập let a bên ngoài khối vì nó nằm trong phạm vi khối. Bây giờ đổi nó thành var và chạy lại.

    {
      var a = 2;
      console.log("Inside block", a);
    }
    console.log("Outside block", a);

    Sẽ không có lỗi vì chúng ta cũng có thể truy cập vào biến bên ngoài khối. Bây giờ hãy thay thế khối bằng một hàm.

    function sample() {
      var a = 2;
      console.log("Inside function", a);
    }
    sample();
    console.log("Outside function", a);

    Bạn sẽ gặp lỗi tham chiếu nếu chạy đoạn mã trên vì chúng ta không thể truy cập var a it bên ngoài hàm vì nó có phạm vi hàm.

    Chúng ta có thể khai báo lại các biến bằng từ khóa var, nhưng chúng ta không thể khai báo lại các biến bằng từ khóa let. Hãy xem một ví dụ.

    var a = "newsblog.pl";
    var a = "Chandan";
    console.log(a);
    let a = "newsblog.pl";
    let a = "Chandan";
    console.log(a);

    Đoạn mã đầu tiên sẽ không báo cáo bất kỳ lỗi nào và giá trị của a sẽ được thay đổi thành giá trị được gán cuối cùng. Đoạn mã thứ hai sẽ báo lỗi vì chúng ta không thể khai báo lại các biến bằng let.

    Sự khác biệt giữa lưu trữ phiên và lưu trữ cục bộ

    Lưu trữ phiên và lưu trữ cục bộ được sử dụng để lưu trữ thông tin trên máy tính của người dùng có thể truy cập được mà không cần Internet. Chúng ta có thể lưu trữ các cặp khóa-giá trị trong cả bộ nhớ phiên và bộ nhớ cục bộ. Cả khóa và giá trị sẽ được chuyển đổi thành chuỗi nếu bạn cung cấp kiểu dữ liệu hoặc cấu trúc dữ liệu khác.

    Bộ nhớ phiên sẽ bị xóa vào cuối phiên (khi bạn đóng trình duyệt). Bộ nhớ vị trí sẽ không bị xóa cho đến khi chúng tôi xóa nó.

    Chúng tôi có thể truy cập, cập nhật và xóa bộ nhớ phiên và bộ nhớ vị trí thông qua các đối tượng sessionStorage và localStorage tương ứng.

    NaN trong JavaScript là gì?

    NaN được viết tắt là Not-a-Number. Thể hiện rằng một cái gì đó không phải là số hợp lệ/hợp lệ trong JavaScript. Trong một số trường hợp, chúng tôi sẽ nhận được NaN làm đầu ra như 0/ /0không xác định * 2, 1 + không xác định, null * không xác định, v.v.,

    Phạm vi từ vựng là gì?

    Phạm vi từ vựng đề cập đến việc truy cập các biến từ phạm vi của cha mẹ chúng. Giả sử chúng ta có một hàm có hai hàm bên trong. Hàm trong cùng có thể truy cập các biến phạm vi của hai hàm cha của nó. Tương tự, hàm cấp hai có thể truy cập phạm vi ngoài cùng của hàm. Hãy xem nó trên một ví dụ.

    function outermost() {
      let a = 1;
      console.log(a);
      function middle() {
        let b = 2;
        // `a` are accessible here
        console.log(a, b);
        function innermost() {
          let c = 3;
          // both `a` and `b` are accessible here
          console.log(a, b, c);
        }
        innermost();
      }
      middle();
    }
    outermost();

    JavaScript sử dụng chuỗi phạm vi để tìm một biến khi chúng ta truy cập nó ở đâu đó trong mã. Đầu tiên nó sẽ kiểm tra biến trong phạm vi hiện tại, sau đó trong phạm vi cha, cho đến phạm vi toàn cục.

    Cái gì được truyền theo giá trị và cái gì được truyền bằng tham chiếu?

    Truyền theo giá trị và truyền theo tham chiếu là hai cách để truyền đối số cho hàm trong JavaScript.

    Truyền theo giá trị: Tạo bản sao của dữ liệu gốc và chuyển nó vào hàm. Vì vậy, khi chúng ta thực hiện bất kỳ thay đổi nào trong hàm sẽ không ảnh hưởng đến dữ liệu gốc. Hãy xem ví dụ dưới đây.

    function sample(a) {
      // changing the value of `a`
      a = 5;
      console.log("Inside function", a);
    }
    let a = 3;
    sample(a);
    console.log("Outside function", a);

    Bạn sẽ thấy giá trị ban đầu của a không bị thay đổi mặc dù chúng ta đã thay đổi nó bên trong hàm.

    Truyền theo tham chiếu: Truyền tham chiếu dữ liệu tới một hàm. Vì vậy, khi chúng ta thực hiện bất kỳ thay đổi nào đối với hàm, nó cũng sẽ thay đổi dữ liệu gốc.

    function sample(arr) {
      // adding a new value to the array
      arr.push(3);
      console.log("Inside function", arr);
    }
    let arr = [1, 2];
    sample(arr);
    console.log("Outside function", arr);

    Bạn sẽ thấy giá trị ban đầu của arr sẽ bị thay đổi khi chúng ta thay đổi nó bên trong hàm.

    Lưu ý: tất cả các kiểu dữ liệu nguyên thủy được truyền theo giá trị và các kiểu dữ liệu không nguyên thủy được truyền theo tham chiếu.

    Ghi nhớ là gì?

    Ghi nhớ là một kỹ thuật lưu trữ các giá trị đã tính toán trong bộ đệm và sử dụng lại chúng khi chúng ta cần mà không cần tính toán lại. Điều này sẽ tăng tốc độ thực thi mã nếu tính toán rất nặng. Có sự đánh đổi về mặt lưu trữ, đây không phải là vấn đề lớn so với thời gian.

    const memo = {};
    function add(a, b) {
      const key = `${a}-${b}`;
    
      // checking whether we computed the value already or not
      if (memo[key]) {
        console.log("Not computing again");
        return memo[key];
      }
    
      // adding the newly computed value to cache
      // here cache is a simple global object
      memo[key] = a + b;
      return memo[key];
    }
    
    console.log(add(1, 2));
    console.log(add(2, 3));
    console.log(add(1, 2));

    Đây là một ví dụ đơn giản để chứng minh khả năng ghi nhớ. Ở đây, việc cộng hai số không phải là một công việc tính toán khó khăn. Nó chỉ dành cho bản demo.

    Tham số dư là gì?

    Tham số còn lại được sử dụng để thu thập tất cả các tham số còn lại trong hàm. Giả sử chúng ta có một hàm sẽ chấp nhận ít nhất 2 đối số và có thể chứa bất kỳ số lượng tham số nào. Vì chúng tôi không có số lượng đối số tối đa nên chúng tôi có thể thu thập đối số đầu tiên 2 các tham số có biến thông thường và tất cả các tham số khác có tham số còn lại sử dụng toán tử còn lại.

    function sample(a, b, ...rest) {
      console.log("Rest parameter", rest);
    }
    
    sample(1, 2, 3, 4, 5);

    Tham số còn lại sẽ là một mảng gồm ba đối số cuối cùng trong ví dụ trên. Điều này cho phép chúng ta có bất kỳ số lượng tham số nào cho hàm.

    Một hàm chỉ có thể có một tham số còn lại. Và tham số còn lại phải ở cuối cùng theo thứ tự các tham số.

    Phá hủy đối tượng là gì?

    Phá hủy đối tượng được sử dụng để truy cập các biến từ một đối tượng và gán chúng cho các biến có cùng tên với khóa của đối tượng. Hãy xem một ví dụ.

    const object = { a: 1, b: 2, c: 3 };
    
    // Object destructuring
    const { a, b, c } = object;
    
    // Now, a, b, c will be used as normal variables
    console.log(a, b, c);

    Chúng ta có thể thay đổi các biến của biến bị phá hủy trong cùng một dòng như sau.

    const object = { a: 1, b: 2, c: 3 };
    
    // Changing the names of `a` and `b`
    const { a: changedA, b: changedB, c } = object;
    
    // Now, changedA, changedB, c will be used as normal variables
    console.log(changedA, changedB, c);

    Phá hủy mảng là gì?

    Phá hủy mảng được sử dụng để truy cập các biến từ một mảng và gán chúng cho các biến. Hãy xem một ví dụ.

    const array = [1, 2, 3];
    
    // Array destructuring
    // It's based on the index of the array
    const [a, b, c] = array;
    
    // Now, we can use a, b, c as normal variables
    console.log(a, b, c);

    Chụp sự kiện và truyền bá sự kiện là gì?

    Nắm bắt sự kiện và tạo bong bóng sự kiện là hai cách để truyền bá sự kiện trong HTML DOM. Giả sử có hai phần tử HTML, phần tử này nằm trong phần tử kia. Và sự kiện xảy ra trong phần tử bên trong. Bây giờ chế độ lan truyền sự kiện sẽ xác định thứ tự thực hiện các sự kiện này.

    Tạo bong bóng sự kiện: đầu tiên kích hoạt trình xử lý sự kiện trên một phần tử, sau đó đến phần tử của nó, sau đó di chuyển lên phần tử trên cùng. Đây là hành vi mặc định cho tất cả các sự kiện.

    Ghi lại sự kiện: chúng ta cần chỉ định trong trường hợp chúng ta cần sử dụng loại sự kiện sủi bọt này. Chúng ta có thể chỉ định điều này khi thêm trình xử lý sự kiện. Các sự kiện sẽ được thực hiện theo thứ tự sau nếu tính năng chụp sự kiện được bật.

  • Các sự kiện bắt đầu từ phần tử trên cùng đến phần tử đích trở xuống.
  • Sự kiện trên mục tiêu sẽ được làm lại.
  • Sự lan truyền sự kiện sủi bọt bong bóng sẽ lặp lại cho đến khi vật phẩm trên cùng được chọn.
  • Chúng ta có thể dừng việc truyền bá sự kiện bằng cách gọi phương thức event.stopPropogation trong trình xử lý sự kiện.

    Lời hứa trong JavaScript là gì?

    Promise đối tượng được sử dụng cho các hoạt động không đồng bộ sẽ thành công hay thất bại trong tương lai.

    Một lời hứa có thể ở một trong các trạng thái sau.

  • đang diễn ra – khi hoạt động vẫn đang được tiến hành.
  • đã hoàn thành – khi thao tác thành công. Chúng ta sẽ có kết quả (nếu có) ở trạng thái thành công.
  • bị từ chối – khi hoạt động thất bại. Chúng ta sẽ có lý do (lỗi) tại sao nó thất bại.
  • Hãy xem hai ví dụ về trường hợp thành công và thất bại.

    // Promise which will complete successfully
    const successPromise = new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve({ message: "Completed successfully" });
      }, 300);
    });
    successPromise
      .then((data) => {
        console.log(data);
      })
      .catch((error) => {
        console.log(error);
      });
    
    // Promise which will complete with failure state
    const failurePromise = new Promise((resolve, reject) => {
      setTimeout(() => {
        reject(new Error("Failing the promise for testing"));
      }, 300);
    });
    failurePromise
      .then((data) => {
        console.log(data);
      })
      .catch((error) => {
        console.log(error);
      });

    Bạn có thể có nhiều hơn một và sau đó xâu chuỗi chúng lại với nhau nếu cần. Dữ liệu được trả về trước đó sẽ được chấp nhận trong lần gọi lại tiếp theo.

    Giải thích các loại phạm vi khác nhau trong JavaScript

    Có hai loại phạm vi trong JavaScript. Bảo hiểm toàn cầu và địa phương.

    Bạn cũng có thể đã nghe nói về phạm vi chức năng và phạm vi khối. Đây là các phạm vi cục bộ cho var và let, const tương ứng.

    Chức năng tự gọi là gì?

    Hàm tự gọi là hàm không tên sẽ được thực thi ngay sau khi tạo. Hãy xem một số ví dụ.

    // Without any parameters
    (function sayHello() {
      console.log("Hello, World!");
    })();
    
    // With parameters
    (function add(a, b) {
      console.log("Sum", a + b);
    })(1, 2);

    Chúng ta thậm chí có thể truyền đối số cho các hàm tự gọi, như bạn có thể thấy trong ví dụ.

    Chức năng mũi tên là gì?

    Hàm mũi tên là cú pháp của hàm thông thường với một số thay đổi. Chúng hoạt động giống như các chức năng bình thường trong các trường hợp sử dụng chung. Các hàm mũi tên rất hữu ích khi chúng ta cần gọi lại. Hãy xem cú pháp của nó.

    // arrow functions will return by default if it doesn't have any brackets
    let add = (a, b) => a + b;
    
    console.log(add(1, 2));

    Có một số khác biệt giữa hàm mũi tên và hàm thông thường.

    • Các hàm mũi tên không có ràng buộc này. Từ khóa this bên trong hàm mũi tên đề cập đến phạm vi chính của this.
    • Hàm mũi tên không thể được sử dụng làm hàm tạo

    Cuộc gọi lại là gì?

    Lệnh gọi lại là một hàm được truyền cho một hàm khác được gọi bên trong hàm đó. Sử dụng lệnh gọi lại là một điều phổ biến trong JavaScript. Hãy xem một ví dụ.

    function sample(a, b, callback) {
      const result = a + b;
      callback(result);
    }
    
    function finished(result) {
      console.log("Finished with", result);
    }
    
    sample(1, 2, finished);

    Hàm đã hoàn thành được chuyển dưới dạng gọi lại mẫu. Hàm đã hoàn thành được gọi kèm theo kết quả sau khi thực hiện một số hành động. Bạn sẽ thấy việc sử dụng lệnh gọi lại chủ yếu trong các hoạt động không đồng bộ như lời hứa, setTimeout, v.v.

    Các loại lỗi khác nhau là gì?

    Hãy kiểm tra một số lỗi trong JavaScript.

    ReferenceError: Lỗi này sẽ xảy ra nếu biến chúng ta đang truy cập có sẵn.

    TypeError: JavaScript sẽ đưa ra lỗi này nếu lỗi không khớp với các loại lỗi khác. Điều này cũng sẽ xảy ra nếu chúng ta cố gắng thực hiện một hành động không khớp với dữ liệu.

    SyntaxError: Lỗi này sẽ xảy ra nếu cú ​​pháp JavaScript không chính xác.

    Ngoài ra còn có các loại lỗi khác. Tuy nhiên, đây là những loại lỗi phổ biến trong JavaScript.

    Các phạm vi biến khác nhau trong JavaScript là gì?

    Có hai phạm vi thay đổi trong JavaScript. Các biến được khai báo bằng từ khóa var sẽ có phạm vi hàm và các biến được khai báo bằng let và const sẽ có phạm vi khối.

    Để biết thêm thông tin về phạm vi của các biến này, hãy xem câu hỏi 17.

    Ký tự thoát trong JavaScript là gì?

    Dấu gạch chéo ngược là ký tự thoát trong JavaScript. Nó được sử dụng để in một số ký tự đặc biệt mà chúng ta thường không thể in được. Giả sử chúng ta muốn in dấu nháy đơn (‘) bên trong một chuỗi, điều này bình thường chúng ta không thể làm được vì chuỗi sẽ kết thúc ở dấu nháy đơn thứ hai. Trong trường hợp này, chúng ta sẽ sử dụng ký tự thoát để tránh kết thúc chuỗi tại thời điểm đó.

    const message="Hi, I"m newsblog.pl';
    console.log(message);

    Chúng ta có thể đạt được kết quả trên mà không cần sử dụng ký tự thoát bằng cách thay thế dấu ngoặc đơn bên ngoài bằng dấu ngoặc kép. Nhưng đây chỉ là một ví dụ về việc sử dụng ký tự thoát. Có những ký tự khác mà chúng ta chắc chắn cần ký tự thoát, chẳng hạn như n, t, v.v.,

    BOM và DOM là gì?

    Mô hình đối tượng trình duyệt (BOM): Tất cả các trình duyệt đều có BOM đại diện cho cửa sổ trình duyệt hiện tại. Nó chứa đối tượng cửa sổ trên cùng của chúng tôi được sử dụng để thao tác với cửa sổ trình duyệt.

    Mô hình đối tượng tài liệu (DOM): Trình duyệt tạo DOM khi HTML được tải vào cấu trúc cây. Chúng ta có thể thao tác các phần tử HTML bằng cách sử dụng API DOM.

    Đối tượng màn hình là gì?

    Đối tượng màn hình là một trong những thuộc tính của đối tượng cửa sổ toàn cục. Chứa các thuộc tính khác nhau của màn hình mà cửa sổ trình duyệt hiện tại được hiển thị. Một số thuộc tính là chiều rộng, chiều cao, hướng, pixelDepth, v.v.

    Ứng dụng

    Có thể có những câu hỏi tiếp theo cho tất cả các câu hỏi trên. Vì vậy bạn cần chuẩn bị sẵn khái niệm cho tất cả các câu hỏi trên.

    Bạn cũng có thể đọc Câu hỏi thường gặp và câu trả lời trong cuộc phỏng vấn Java.

    Chúc bạn học vui vẻ 🙂

    Mục lục