Một buổi phỏng vấn JavaScript kỹ thuật là một phần quan trọng giúp đánh giá kiến thức và kỹ năng lập trình viên. Để có buổi phỏng vấn thành công, bạn sẽ cần nắm vững các khái niệm cơ bản cũng như kỹ năng thực hành nhuần nhuyễn. Hãy cùng cập nhật danh sách những câu hỏi phỏng vấn JavaScript phổ biến kèm theo câu trả lời chi tiết để nắm chắc kiến thức cho buổi phỏng vấn sắp tới!
Đọc bài viết sau đây để có góc nhìn chi tiết hơn về:
- Câu hỏi phỏng vấn JavaScript dành cho người mới bắt đầu
- Câu hỏi phỏng vấn JavaScript dành cho người đã có kinh nghiệm
- Câu hỏi phỏng vấn JavaScript về kỹ năng thực hành
JavaScript Developer làm công việc gì?
JavaScript Developer sẽ là một lập trình viên chuyên tạo các ứng dụng web động và có sự tương tác bằng ngôn ngữ lập trình JavaScript. Những người phụ trách phát triển web hiện đại, tạo ra mã phức tạp hỗ trợ giao diện người dùng và nâng cao trải nghiệm của người dùng trên nhiều nền tảng kỹ thuật số khác nhau.
Một số JavaScript Developers sẽ chịu trách nhiệm xây dựng và duy trì toàn bộ trang web, trong khi một số vị trí sẽ tập trung vào các thành phần trực quan giao diện người dùng và đảm bảo kết nối của chúng với các dịch vụ phụ trợ.
Khi sử dụng nhuần nhuyễn JavaScript cùng với các kỹ năng liên quan về lĩnh vực IT, bạn sẽ có nhiều cơ hội phát triển ở nhiều vị trí khác nhau, chẳng hạn như:
- Front-End Developer
- Back-End Developer
- Full-stack Developer
- ReactJS Developer
- Freelance JavaScript Developer
Bên cạnh kiến thức về JavaScript, bạn cũng sẽ cần nắm vững về HTML và CSS, làm quen với các phần mềm liên quan như Node.js, Express.js, MongoDB,… để được cung cấp nền tảng vững chắc phát triển toàn diện cả về Front-End và Back-End trong lĩnh vực IT.
Theo Báo cáo Lương và Thị trường Tuyển dụng IT tại Việt Nam 2024 – 2025 mới nhất do ITviec thực hiện, mức lương trung vị của các vị trí liên quan về JavaScript như sau:
Số năm kinh nghiệm | Mức lương trung vị (đơn vị: VND/ tháng) | ||
Front-End Developer | Full-stack Developer | Back-End Developer | |
< 1 năm | N/A | 14.700.000 | N/A |
1-2 năm | 16.100.000 | 16.650.000 | 19.200.000 |
3-4 năm | 23.300.000 | 29.900.000 | 26.000.000 |
5-8 năm | 34.950.000 | 39.700.000 | 45.300.000 |
>8 năm | 50.950.000 | 50.000.000 | 54.500.000 |
Xem thêm: JavaScript Developer là gì? Các hớng phát triển của JavaScript Developer
Câu hỏi phỏng vấn JavaScript dành cho người mới bắt đầu
Bạn hiểu gì về Data Type trong JavaScript?
Kiểu dữ liệu (data types) của JavaScript được chia thành 2 phần là kiểu dữ liệu nguyên thủy (primitive type) và kiểu dữ liệu không nguyên thủy (non-primitive type).
Primitive Type
Các kiểu dữ liệu được xác định trước do ngôn ngữ JavaScript cung cấp, hay còn được gọi là kiểu dữ liệu tích hợp. Bao gồm số (number), chuỗi (string), boolean, symbols, undefined, null.
typeof "ITviec" // Trả về chuỗi typeof 3.14 // Trả về số typeof true // Trả về boolean typeof 234567890123456789012345678901234567890n // Trả về bigint typeof undefined // Trả về undefined typeof null // Trả về object typeof Symbol('symbol') // Trả về symbol
Non-Primitive Type
Lưu trữ một dữ liệu duy nhất. Để lưu trữ nhiều giá trị phức tạp, bạn có thể sử dụng kiểu dữ liệu không nguyên thủy. Thường bao gồm object, function và array.
var obj1 = { x: 43, y: "ITviec", z: function(){ return this.x; } } var array1 = [5, "ITviec", true, 4.1];
Java vs JavaScript có gì khác biệt?
Java là ngôn ngữ lập trình hướng đối tượng (object), trong khi JavaScript là ngôn ngữ script phía máy khách. Cụ thể:
- Java: Đây là ngôn ngữ lập trình hướng đối tượng và có nền tảng máy ảo cho phép bạn tạo các chương trình biên dịch chạy được trên hầu hết các nền tảng.
- JavaScript: Đây là ngôn ngữ lập trình để phát triển các trang web có tính tương tác. JavaScript có thể cho phép bạn chèn văn bản động vào các thành phần HTML, giúp trang web có tính tương tác và sinh động hơn.
Giải thích Hosting trong JavaScript?
Hosting là hành vi mặc định của JavaScript, trong đó tất cả khai báo biến và hàm được di chuyển lên trên cùng. Điều này có nghĩa là bất kỳ biến và hàm được khai báo ở đâu, chúng đều được di chuyển lên vị trí trên cùng của phạm vi (scope). Phạm vi có thể là cục bộ (local) hoặc toàn cục (global).
hoistedVariable = 3; console.log(hoistedVariable); // đầu ra 3 ngay cả khi biến được khai báo sau khi nó được khởi tạo var hoistedVariable; function doSomething(){ x = 33; console.log(x); var x; }
Ngoài ra, bạn nên lưu ý một số điều khi sử dụng hosting như:
- Hosting chỉ áp dụng cho khai báo var, không áp dụng cho let và const.
- Khai báo hàm được hosting hoàn toàn.
- Chỉ khai báo được hosting, không phải phép gán.
Bạn hiểu gì về NaN trong JavaScript?
Thuộc tính NaN biểu thị cho giá trị “Not-a-Number”, nghĩa là giá trị không phải là số hợp lệ. Kiểu của NaN sẽ trả về là một con số (number). Để kiểm tra xem giá trị có phải là NaN hay không, bạn có thể sử dụng hàm isNaN(), cụ thể như sau:
isNaN("Hello") // Trả về true isNaN(345) // Trả về false isNaN('1') // Trả về false, vì “1” được chuyển đổi thành số (number), kết quả là 0 (một số) isNaN(true) // Trả về false, vì true được chuyển đổi thành kiểu số (number), kết quả trả về là 1 (một con số). isNaN(false) // Trả về false isNaN(undefined) // Trả về true
Giải thích Closures trong JavaScript
Closures là khả năng của một hàm để ghi nhớ các biến và hàm được khai báo trong phạm vi bên ngoài của nó.
var Person = function(pName){ var name = pName; this.getName = function(){ return name; } } var person = new Person("Neelesh"); console.log(person.getName());
Tìm hiểu về closures qua ví dụ như sau:
function randomFunc(){ var obj1 = {name:"ITviec"}; return function(){ console.log(obj1.name + " is "+ "awesome"); } } var initialiseClosure = randomFunc(); initialiseClosure();
Hàm randomFunc() được thực thi và trả về một hàm khi gán nó cho một biến.
var initialiseClosure = randomFunc();
Sau đó, hàm trả về sẽ được thực thi khi gọi initialiseClosure.
initialiseClosure();
Dòng mã trên cho ra kết quả “ITviec is awesome” và điều này có thể thực hiện được nhờ tính năng đóng.
console.log(obj1.name + " is "+ "awesome");
Khi hàm randomFunc() chạy, hàm sẽ trả về đang sử dụng biến obj1 bên trong nó. Do đó, randomFunc(), thay vì hủy giá trị của obj1 sau khi thực thi, sẽ lưu giá trị trong bộ nhớ để tham chiếu thêm.
Đây là lý do tại sao hàm trả về có thể sử dụng biến được khai báo trong phạm vi bên ngoài ngay cả sau khi hàm đã được thực thi.Khả năng lưu trữ biến để tham chiếu thêm của hàm này ngay cả sau khi hàm đã được thực thi được gọi là Closure.
Bạn hiểu gì về client-side và server-side trong JavaScript?
JavaScript phía máy khách (client-side) bao gồm hai phần, một ngôn ngữ cơ bản và các đối tượng được xác định trước để thực hiện JavaScript trong trình duyệt. JavaScript cho máy khách được tự động đưa vào các trang HTML. Khi chạy, trình duyệt hiểu được tập lệnh này.
Trong khi đó, JavaScript phía máy chủ (server-side), bao gồm việc thực thi mã JavaScript trên máy chủ để đáp ứng các yêu cầu của máy khách. Nó xử lý các yêu cầu này và cung cấp phản hồi có liên quan cho máy khách, có thể bao gồm JavaScript phía máy khách để thực thi tiếp theo trong trình duyệt.
DOM là gì?
DOM là viết tắt của Document Object Model, nghĩa là giao diện lập trình cho các tài liệu HTML và XML. Khi trình duyệt cố gắng hiển thị một tài liệu HTML, nó sẽ tạo ra một đối tượng dựa trên tài liệu HTML được gọi là DOM. Khi sử dụng DOM, bạn có thể thao tác hoặc thay đổi nhiều thành phần khác nhau bên trong tài liệu HTML.
Ví dụ về cách mã HTML được chuyển đổi thành DOM:
<html> <head> <title> DOM example </title> </head> <body> <p id="para1">Hello</p> <p id="para2">Hey</p> </body> </html>
Tại sao sử dụng debugger trong JavaScript?
Debugger (trình gỡ lỗi) trong trình duyệt phải được kích hoạt để gỡ lỗi mã. Trình gỡ lỗi tích hợp có thể được bật và tắt để yêu cầu người dùng báo cáo lỗi. Phần còn lại của mã phải được dừng thực thi trước khi chuyển sang dòng tiếp theo trong khi gỡ lỗi.
Sự khác biệt giữa “==” và “===” trong JavaScript
“==” và “===” đều là toán tử so sánh. Sự khác biệt giữa 2 toán tử này là “==” được sử dụng để so sánh các giá trị trong khi “===” được sử dụng để so sánh cả giá trị và kiểu.
var x = 2; var y = "2"; (x == y) // Trả về giá trị true của cả x và y đều giống nhau (x === y) // Trả về giá trị false vì kiểu của x là "số" và kiểu của y là "chuỗi"
Giải thích khái niệm Prototype (nguyên mẫu) trong JavaScript
Tất cả các đối tượng JavaScript đều kế thừa các thuộc tính từ một nguyên mẫu.
- Các đối tượng Date kế thừa các thuộc tính từ nguyên mẫu Date
- Các đối tượng Math kế thừa các thuộc tính từ nguyên mẫu Math
- Các đối tượng Array kế thừa các thuộc tính từ nguyên mẫu Array.
- Trên cùng của chuỗi là Object.prototype. Mỗi nguyên mẫu đều kế thừa các thuộc tính và phương thức từ Object.prototype.
Một nguyên mẫu là bản thiết kế của một đối tượng. Prototype cho phép sử dụng các thuộc tính và phương thức trên một đối tượng ngay cả khi các thuộc tính và phương thức đó không tồn tại trên đối tượng hiện tại.
var arr = []; arr.push(2); console.log(arr);
Trong đoạn mã trên, không định nghĩa bất kỳ thuộc tính hoặc phương thức nào được gọi là push trên array nhưng JavaScript không đưa ra lỗi.
Lý do là sử dụng các nguyên mẫu các đối tượng mảng kế thừa các thuộc tính từ nguyên mẫu Mảng. JavaScript thấy rằng phương thức push không tồn tại trên đối tượng mảng hiện tại và do đó, tìm kiếm phương thức push bên trong nguyên mẫu Mảng và tìm thấy phương thức.
Câu hỏi phỏng vấn JavaScript dành cho người có kinh nghiệm
Hàm bậc cao (Higher-order Function) trong JavaScript là gì?
Các hàm hoạt động trên các hàm khác, bằng cách lấy chúng làm đối số hoặc trả về chúng, được gọi là các hàm bậc cao. Là kết quả của các hàm hạng nhất trong JavaScript.
Một số ví dụ về hàm bậc cao có thể kể đến như:
function higherOrder(fn) { fn(); } higherOrder(function() { console.log("ITviec") }); function higherOrder2() { return function() { return "Do something"; } } var x = higherOrder2(); x()
Giải thích về Scope và Scope Chain trong JavaScript
Phạm vi (Scope) trong JavaScript xác định khả năng truy cập của các biến và hàm tại các phần khác nhau của mã. Phạm vi sẽ cho biết tại một phần nhất định của mã, những biến và hàm nào chúng ta có thể hoặc không thể truy cập.
Có ba loại phạm vi trong JS bao gồm:
- Phạm vi toàn cục (global scope): Các biến hoặc hàm được khai báo trong không gian tên toàn cục có phạm vi toàn cục, nghĩa là tất cả các biến và hàm có phạm vi toàn cục đều có thể được truy cập từ bất kỳ đâu bên trong mã.
- Phạm vi cục bộ (function scope): Tất cả các biến và hàm được khai báo bên trong một hàm đều có thể được truy cập từ bên trong hàm chứ không phải bên ngoài hàm.
- Phạm vi khối (block scope): Cho biết bất kỳ biến nào được khai báo bên trong khối { }, chỉ có thể được truy cập bên trong khối đó và không thể được truy cập bên ngoài khối đó. Các biến được triển khai bằng let và const sẽ có phạm vi khối, biến khai báo bằng var không có phạm vi khối.
Scope Chain sẽ sử dụng scope (phạm vi) để tìm biến, ví dụ như:
var y = 24; function favFunction(){ var x = 667; var anotherFavFunction = function(){ console.log(x); } var yetAnotherFavFunction = function(){ console.log(y); } anotherFavFunction(); yetAnotherFavFunction(); } favFunction();
Ở ví dụ trên, nếu JavaScript không tìm thấy biến trong phạm vi cục bộ, nó sẽ cố gắng kiểm tra biến trong phạm vi bên ngoài. Nếu biến không tồn tại trong phạm vi bên ngoài, nó sẽ cố gắng tìm biến trong phạm vi toàn cục.
Nếu biến cũng không được tìm thấy trong không gian toàn cục, một lỗi tham chiếu sẽ được đưa ra.
Lợi thế của việc sử dụng External JavaScript là gì?
External JavaScript là mã JavaScript (script) được viết trong một tệp riêng có phần mở rộng .js, sau đó liên kết tệp đó bên trong phần tử <head> hoặc <body> của tệp HTML nơi mã sẽ được đặt.
Một số lợi thế của External JavaScript có thể kể đến như:
- Cho phép các lập trình viên thiết lập trực tiếp trên các tệp HTML và JavaScript.
- Có thể sử dụng lại mã.
- Khả năng đọc mã rất đơn giản.
Các loại lỗi trong JavaScript
Có 2 loại lỗi trong JavaScript:
- Lỗi cú pháp (Syntax error): Lỗi cú pháp là lỗi hoặc lỗi chính tả trong mã khiến chương trình không thực thi được hoặc dừng chạy giữa chừng.
- Lỗi logic (logic error): Xảy ra khi cú pháp đúng nhưng logic hoặc chương trình không chính xác. Đôi khi, những lỗi này khó sửa hơn các vấn đề cú pháp vì các ứng dụng không hiển thị tín hiệu lỗi cho lỗi logic.
Memoization trong JavaScript là gì?
Memorization (ghi nhớ) là một dạng lưu trữ đệm trong đó giá trị trả về của một hàm được lưu trữ đệm dựa trên các tham số của nó. Nếu tham số của hàm đó không thay đổi, phiên bản lưu trữ đệm của hàm sẽ được trả về.
// Fibonacci không sử dụng memoization function fibonacci(n) { if (n <= 1) return n; return fibonacci(n - 1) + fibonacci(n - 2); } // Fibonacci sử dụng memoization function memoizedFibonacci() { const cache = {}; return function fib(n) { // Kiểm tra cache if (n in cache) { return cache[n]; } if (n <= 1) { return n; } // Lưu kết quả vào cache cache[n] = fib(n - 1) + fib(n - 2); return cache[n]; } } const memFib = memoizedFibonacci(); // So sánh hiệu năng console.time('Không memoization'); console.log(fibonacci(40)); // Chậm console.timeEnd('Không memoization'); console.time('Có memoization'); console.log(memFib(40)); // Nhanh hơn nhiều console.timeEnd('Có memoization');
Qua ví dụ trên, có thể thấy được lợi ích của memoization:
- Tránh tính toán lặp lại với cùng input.
- Tăng hiệu suất đáng kể với các phép tính phức tạp.
- Đổi dung lượng bộ nhớ lấy tốc độ xử lý.
Sự khác biệt giữa Prototypal và Classic inheritance?
Lập trình viên xây dựng các đối tượng, là các biểu diễn của thực thể thời gian thực, trong lập trình OOP truyền thống. Các lớp và đối tượng là hai loại trừu tượng.
Một lớp là một khái quát hóa của một đối tượng, trong khi một đối tượng là một trừu tượng hóa của một vật thực tế. Ví dụ, một chiếc xe là một chuyên môn hóa của một chiếc xe hơi. Do đó, ô tô (lớp) được kế thừa từ các phương tiện (đối tượng).
Kế thừa cổ điển (Classic inheritance) khác với kế thừa nguyên mẫu (Prototypal Inheritance) ở chỗ kế thừa cổ điển bị giới hạn trong các lớp kế thừa từ các lớp còn lại, nhưng kế thừa nguyên mẫu cho phép bất kỳ đối tượng nào được sao chép thông qua phương pháp liên kết đối tượng. Mặc dù đi sâu vào quá nhiều chi tiết cụ thể, về cơ bản, một nguyên mẫu đóng vai trò như một khuôn mẫu cho các đối tượng khác, cho dù chúng có mở rộng đối tượng cha hay không.
Hàm gọi lại (callback function) là gì?
Callback (hàm gọi lại) là một hàm sẽ được thực thi sau khi một hàm khác được thực thi. Trong JavaScript, các hàm có thể được sử dụng làm đối số của một hàm khác, có thể được trả về bởi một hàm khác hoặc được sử dụng làm thuộc tính của một đối tượng.
function divideByHalf(sum){ console.log(Math.floor(sum / 2)); } function multiplyBy2(sum){ console.log(sum * 2); } function operationOnSum(num1,num2,operation){ var sum = num1 + num2; operation(sum); } operationOnSum(3, 3, divideByHalf); // Kết quả hiển thị: 3 operationOnSum(5, 5, multiplyBy2); // Kết quả hiển thị: 20
Trong đoạn mã trên đang thực hiện các phép toán trên tổng của hai số. Trong đó:
- Hàm operationOnSum lấy 3 đối số, số đầu tiên, số thứ hai và phép toán sẽ được thực hiện trên tổng của chúng (gọi lại).
- Cả hai hàm divideByHalf và multiplyBy2 đều được sử dụng làm hàm gọi lại trong đoạn mã trên.
- Các hàm gọi lại này sẽ chỉ được thực thi sau khi hàm operationOnSum được thực thi.
Do đó, hàm gọi lại là hàm sẽ được thực thi sau khi một hàm khác được thực thi.
Sự khác biệt giữa Async/Await và Generators được sử dụng để đạt được chức năng tương tự
- Các hàm Generator được chạy theo trình tạo yield by yield, nghĩa là từng đầu ra một, trong khi các hàm Async-await được thực thi tuần tự.
- Async/await cung cấp một trường hợp sử dụng nhất định để Generator dễ thực thi hơn.
- Kết quả đầu ra của hàm Generator luôn là giá trị: X, done: Boolean, nhưng giá trị trả về của hàm Async luôn là một sự đảm bảo hoặc đưa ra lỗi.
// Generator function* numberGenerator() { yield 1; yield 2; } // Async/Await async function getData() { const result = await fetch('/api/data'); return result.json(); }
Bạn hiểu gì về recursion trong ngôn ngữ lập trình?
Recursion là một kỹ thuật lặp lại một hoạt động bằng cách gọi chính hàm đó nhiều lần cho đến khi đạt được kết quả.
function add(number) { if (number <= 0) { return 0; } else { return number + add(number - 1); } } add(3) => 3 + add(2) 3 + 2 + add(1) 3 + 2 + 1 + add(0) 3 + 2 + 1 + 0 = 6
Chẳng hạn như ví dụ sau đây sẽ tính tổng của tất cả các phần tử trong một mảng bằng cách sử dụng recursion.
function computeSum(arr){ if(arr.length === 1){ return arr[0]; } else{ return arr.pop() + computeSum(arr); } } computeSum([7, 8, 9, 99]); // Trả về kết quả 123
Giải thích về WeakSet trong JavaScript
Trong JavaScript, Set là một tập hợp các phần tử duy nhất và được sắp xếp. Giống như Set, WeakSet cũng là một tập hợp các phần tử duy nhất và được sắp xếp với một số điểm khác biệt như:
- Weakset chỉ chứa các đối tượng (object) và không có loại nào khác.
- Một đối tượng bên trong WeakSet được tham chiếu yếu. Điều này có nghĩa là nếu đối tượng bên trong weakset không có tham chiếu, nó sẽ được thu gom rác.
- Không giống như Set, WeakSet chỉ có ba phương thức, add() , delete() và has().
const newSet = new Set([4, 5, 6, 7]); console.log(newSet);// Đầu ra: Set {4,5,6,7} const newSet2 = new WeakSet([3, 4, 5]); let obj1 = {message:"Hello world"}; const newSet3 = new WeakSet([obj1]); console.log(newSet3.has(obj1)); // true
Câu hỏi phỏng vấn JavaScript thực hành
Triển khai một hàm trả về một mảng được cập nhật với r phép quay phải trên một mảng số nguyên a.
Ví dụ cho mảng sau [2,3,4,5,7]. Hãy thực hiện 3 phép quay phải. Phép quay đầu tiên: [7,2,3,4,5], Phép quay thứ hai: [5,7,2,3,4] và Phép quay thứ ba: [4,5,7,2,3]
function rotateRight(arr,rotations){ if(rotations == 0) return arr; for(let i = 0; i < rotations;i++){ let element = arr.pop(); arr.unshift(element); } return arr; } rotateRight([2, 3, 4, 5, 7], 3); // Return [4,5,7,2,3] rotateRight([44, 1, 22, 111], 5); // Returns [111,44,1,22]
Viết hàm thực hiện tìm kiếm nhị phân trên một mảng đã được sắp xếp.
function binarySearch(arr,value,startPos,endPos){ if(startPos > endPos) return -1; let middleIndex = Math.floor((startPos + endPos) / 2); if(arr[middleIndex] === value) return middleIndex; else if(arr[middleIndex] > value){ return binarySearch(arr,value,startPos,middleIndex-1); } else{ return binarySearch(arr,value,middleIndex+1,endPos); } }
Cho đoạn mã sau, hãy dự đoán kết quả hiển thị của đoạn mã
var x = 23; (function(){ var x = 43; (function random(){ x++; console.log(x); var x = 21; })(); })();
Kết quả hiển thị sẽ là NaN, Hàm random() có phạm vi chức năng vì x được khai báo và được đưa lên trong phạm vi chức năng.
Bạn có thể viết lại hàm theo cách như sau:
function random(){ var x; x++; // x không phải là số vì nó chưa được khởi tạo console.log(x); // Outputs NaN x = 21; // Khởi tạo x }
Cho đoạn mã sau, hãy dự đoán kết quả hiển thị của đoạn mã
Mã số 1:
(function(a){ return (function(){ console.log(a); a = 23; })() })(45);
Mã số 2:
// Mỗi lần bigFunc được gọi, một mảng có kích thước 700 sẽ được tạo ra, // Sửa đổi mã để không tạo ra cùng một mảng nhiều lần function bigFunc(element){ let newArray = new Array(700).fill('♥'); return newArray[element]; } console.log(bigFunc(599)); // Mảng đã được tạo console.log(bigFunc(670)); // Mảng đã được tạo
Mã số 3:
// Đoạn mã sau đây xuất ra 2 và 2 sau khi đợi một giây // Sửa đổi đoạn mã để xuất ra 0 và 1 sau một giây. function randomFunc(){ for(var i = 0; i < 2; i++){ setTimeout(()=> console.log(i),1000); } } randomFunc();
Theo 3 đoạn trên, ta có đáp án như sau:
- Đoạn mã số 1 kết quả là 45. Mặc dù a được định nghĩa trong hàm bên ngoài nhưng do tính đóng nên các hàm bên trong vẫn có thể truy cập vào nó.
- Ở đoạn mã số 2, có thể được sửa đổi bằng cách sử dụng closures.
function bigFunc(){ let newArray = new Array(700).fill('♥'); return (element) => newArray[element]; } let getElement = bigFunc(); getElement(599); getElement(670);
Ở đoạn mã số 3, có thể được sửa đổi bằng cách sử dụng từ khóa let hoặc closures.
function randomFunc(){ for(let i = 0; i < 2; i++){ setTimeout(()=> console.log(i),1000); } } randomFunc(); function randomFunc(){ for(var i = 0; i < 2; i++){ (function(i){ setTimeout(()=>console.log(i),1000); })(i); } } randomFunc();
Viết một đoạn mã theo yêu cầu nếu hai chuỗi là chữ đảo ngược của nhau thì trả về true.
var firstWord = "ITviec"; var secondWord = "Blog"; isAnagram(firstWord, secondWord ); // true function isAnagram(firstWord, secondWord ) { //Đổi cả hai từ sang chữ thường để không phân biệt chữ hoa chữ thường. var a = one.toLowerCase(); var b = two.toLowerCase(); // Sắp xếp các chuỗi, sau đó kết hợp mảng thành một chuỗi. Kiểm tra kết quả. a = a.split("").sort().join(""); b = b.split("").sort().join(""); return a === b; }
Viết đoạn mã để tìm nguyên âm
const findVowels = str => { let count = 0 const vowels = ['a', 'e', 'i', 'o', 'u'] for(let char of str.toLowerCase()) { if(vowels.includes(char)) { count++ } } return count }
Tổng kết câu hỏi phỏng vấn JavaScript
Như vậy, ITviec đã tổng hợp chi tiết 25+ câu hỏi phỏng vấn JavaScript theo nhiều trình độ và kinh nghiệm khác nhau. Việc chuẩn bị câu hỏi kỹ càng sẽ giúp bạn dễ dàng ghi điểm trước nhà tuyển dụng. Hãy tiếp tục rèn luyện và thực hành để nâng cao kỹ năng JavaScript, sẵn sàng cho cơ hội nghề nghiệp sắp tới nhé!