Các câu hỏi nâng cao JavaScript (Phần 1)

23/06/2019

Kiểm tra xem bạn hiểu JavaScript đến đâu, học lại các kiến thức cũ hoặc chuẩn bị cho phỏng vấn! Dưới đây là các câu hỏi về Javascript từ cơ bản đến nâng cao

1. Ouput của hàm này là gì?

function sayHi () {

console.log(name);

console.log(age);

var name = "Lydia";

var age = 21;

}

 

sayHi();

A. Lydiaundefined

B. LydiaReferenceError

C. ReferenceError21

D. undefinedReferenceError

2. Ouput của các dòng lệnh này là gì?

for (var i = 3; i < 3 ; i++) {

setTimeout(() => console.log(i), 1);

}

 

for (let i = 3; i < 3 ; i++) {

setTimeout(() => console.log(i), 1);

}

A. 0 1 20 1 2

B. 0 1 23 3 3

C. 3 3 30 1 2

Đáp án: C

Vì chỗi sự kiên trong JavaScript, hàm setTimeout được gọi sau khi vòng lặp chạy. Vì biến i trong vòng lặp đầu tiên được khia báo sử dụng từ khóa var, giá trị này là global. Trong vòng lặp, ta tăng giá trị i lên 1 với toán tử ++. Khi hàm setTimeout chạy, i đã là 3. Trong vòng lặp thứ 2, biến i được khai báo với từ khóa let: giá trị được khai báo với let (và const) chặn mọi thứ ở giữa { }. Trong từng lần lặp, i sẽ có giá trị mới.

3. Ouput của các dòng lệnh này là gì?

const shape = {

radius: 10,

diameter () {

return this.radius * 2;

},

perimeter: () => 2 * Math.PI * this.radius

};

shape.diameter();

shape.perimeter();

A. 2062.83185307179586

B. 20NaN

C. 2063

D. NaN63

Đáp án: B

Để ý là giá trị của diameter là một hàm thông thường, trong đó, dữ liệu của perimeter là một hàm mũi tên (arrow function).

Với các hàm mũi tên, từ khóa this chỉ đến phạm vi hiện tại, không như hàm thông thường! Nghĩa là khi ta gọi perimeter, nó không chỉ đến shape object mà chỉ đến phạm vi xung quanh của nó (ví dụ như window).

Radius không có dữ liệu trong object đó nên nó sẽ trả về undefined.

4. Ouput của các dòng lệnh này là gì?

+true;

!"Lydia";

A. 1false

B. falseNaN

C. falsefalse

Đáp án: A

Dấu + cố chuyển một toàn tử thành một số. true1false0. Chuỗi 'Lydia' có dữ liệu thật. Cái chúng ta đang thật sự tìm là “dữ liệu thật này có giả?”. Cái này trả về false.

5. Câu trả lời nào sai?

const bird = {

size: "small"

};

 

const mouse = {

name: "Mickey",

small: true

};

A. mouse.bird.size

B. mouse[bird.size]

C. mouse[bird["size"]]

D. Tất cả đều đúng

Đáp án: A

Trong JavaScript, mọi khóa object đều là chuỗi (trừ khi nó là Symbol). Mặc dù ta không khai báo chúng là chuỗi, chúng luôn bị chuyển thành chuỗi mà ta không biết.

JavaScript hiểu các câu lệnh. Khi ta dùng ngoặc, nó thấy ngoặc [ mở dầu tiên và tiếp tục cho tới khi ngoặc ] đóng. Chỉ khi đó, nó mới đánh giá câu lệnh.

mouse[bird.size]: Đầu tiên, nó đánh giá bird.size, là "small". mouse["small"] trả về true

Nhưng mà nó lại không xảy ra. mouse không có khóa gọi là bird, nghĩa là mouse.birdundefined, ta đang thật ra gọi undefined.size. Cái đó không hợp lệ và nó sẽ bị lỗi tương tự như Cannot read property "size" of undefined.

6. Ouput của các dòng lệnh này là gì?

let c = { greeting: "Hey!" };

let d;

 

d = c;

c.greeting = "Hello";

console.log(d.greeting);

A. Hello

B. Hey!

C. undefined

D. ReferenceError

E. TypeError

Đáp án: A

Trong JavaScript, mọi object tương tác bởi reference khi đặt chúng bằng nhau.

Đầu tiên, biến c giữ giá trị cho một object. Sau đó, ta cho d gọi đến object đó luôn.

Khi thay đổi một object, giá trị của cả hai biến đều bị thay đổi.

7. Ouput của các dòng lệnh này là gì?

let a = 3

let b = new Number(3)

let c = 3

 

console.log(a == b);

console.log(a === b);

console.log(b === c);

A. true false true

B. false false true

C. true false false

D. false true true

Đáp án: C

new Number() là hàm có sẵn. Mặc dù nó trong như một con số, nó không phải là số: nó có nhiều tính năng thêm và là một object.

Khi ta dùng toán tử ==, nó chỉ kiểm tra xem nếu nó có cùng giá trị hay không. Nếu chúng cùng giá trị là 3, nó sẽ trả về true.

Nhưng mà khi ta dùng toán tử ===, giá trị lẫn kiểu dữ liệu phải như nhau. new Number() không phải là số mà là một object. Cả hai đều trả về false.

8. Ouput của các dòng lệnh này là gì?

class Chameleon {

static colorChange(newColor) {

this.newColor = newColor;

return this.newColor;

}

 

construcor ({ newColor = "green" } = {}) {

this.newColor = newColor;

}

}

 

const freddie = new Chameleon ({ newColor: "purple" });

freddie.colorChange("orange");

A. orange

B. purple

C. green

D. TypeError

Đáp án: D

Hàm colorChange là static. Các hàm static được thiết kế sao cho chúng chỉ được sử dụng trong constructor mà chúng được khia báo và không thể được thừa kế bởi các constructor con. Vì freddie là con, hàm không tồn tại trong freddie và bị lỗi TypeError.

9. Ouput của các dòng lệnh này là gì?

let greeting {

greetign = {};

console.log(greetign);

A. {}

B. ReferenceError: greetign is not defined

C. undefined

Đáp án: A

Nó sẽ log ra object greetign, bởi vì chúng ta vừa khởi tạo một global object! Khi chúng ta đánh máy nhầm greeting thành greetign, trình thông dịch của JS sẽ coi nó như là global.greetign = {} (hay window.greetign = {} nếu chạy trên browser).

Để tránh điều này chúng ta có thể sử dụng "use strict". Nó sẽ đảm bảo rẳng các biến đều phải được khai báo trước khi sử dụng.

10. Điều gì sẽ xảy ra khi chúng ta làm thế này?

function bark() {

console.log("Woof!");

}

 

bark.animal = "dog";

A. Hoàn toàn không có vấn đề gì!

B. SyntaxError .Bạn không thể thêm thuộc tính theo cách này.

C. undefined

D. ReferenceError

Đáp án: A

Điều này là có thể với Javascript, bởi vì function cũng chỉ là object mà thôi! (Mọi primitive types đều là object)

Function là một object đặc biệt. Phần code mà bạn viết không phải là function thực tế đâu. Function ở đây chính là một object với các thuộc tính. Và các thuộc tính này có thể gọi được.

Nguồn: https://github.com/lydiahallie/javascript-questions

Bài viết liên quan

1
Bạn cần hỗ trợ?