Xoắn não với phỏng vấn JavaScript 1

Đáp án: -1

Giải thích:

Theo mình đánh giá thì đây là một câu hỏi khá hay. Vì bạn sẽ học được 3 thứ sau:

  • Sử dụng const (hằng số)
  • Sử dụng chỉ số âm trong mảng
  • Phương thức Array.prototype.indexOf()

1. Sử dụng const (hằng số)

Theo quan niệm thông thường, khi bạn khai báo một biến là hằng số thì giá trị của nó sẽ không bao giờ thay đổi. Tuy nhiên, const trong JavaScript sẽ hơi khác một chút, cụ thể như này:

The const declaration creates a read-only reference to a value. It does not mean the value it holds is immutable, just that the variable identifier cannot be reassigned. For instance, in the case where the content is an object, this means the object’s contents (e.g., its parameters) can be altered._

Nghĩa là sao?

Nghĩa là chỉ có địa chỉ của biến số là không thay đổi. Còn giá trị của biến số vẫn có thể thay đổi. Bây giờ, mình sẽ xét 3 kiểu dữ liệu chính của biến số là: Number, Object và Array (chú ý: String và Boolean sẽ giống với trường hợp của Number).

Number

const

x

=

1

;

x

=

2

;

Trường hợp này, x là kiểu Number, mà bạn lại gán x cho một số khác. Thì thực chất bạn đã thay đổi địa chỉ của biến x rồi. Nên lỗi trên xảy ra là đương nhiên.

Object

Trường hợp 1:

const

a

=

{

x

:

1

,

y

:

2

}

;

a

.

x

=

10

;

a

.

y

=

20

;

a

.

z

=

30

;

console

.

log

(

a

)

;

Trường hợp 1 đúng vì bạn chỉ thay đổi giá trị các thành phần bên trong object a. Bản thân object a vẫn giữ nguyên địa chỉ ban đầu.

Trường hợp 2:

const

a

=

{

x

:

1

,

y

:

2

}

;

a

=

{

x

:

10

,

y

:

20

}

;

Trường hợp 2 bị lỗi trên vì bạn đã gán biến a cho một object hoàn toàn mới – địa chỉ khác với object ban đầu.

Array

Trường hợp 1:

const

a

=

[

1

,

2

]

;

a

[

0

]

=

10

;

a

[

1

]

=

20

;

a

[

2

]

=

30

;

console

.

log

(

a

)

;

Cũng tương tự như object, bạn chỉ thay đổi giá trị các thành phần bên trong array a. Bản thân địa chỉ array a vẫn không thay đổi.

Trường hợp 2:

const

a

=

[

1

,

2

]

;

a

=

[

10

,

20

,

30

]

;

Lại tương tự như object, bạn đã gán biến a cho một array hoàn toàn mới nên kết quả là bị lỗi như trên.

Quay lại với câu hỏi trên, việc khai báo x là const kiểu mảng rồi thay đổi giá trị x[-1] = -1 là hoàn toàn đúng so với định nghĩa về const.

Tuy nhiên, sử dụng chỉ số âm thì lạ quá nhỉ? Liệu có đúng không?

2. Sử dụng chỉ số âm trong mảng

Có lẽ bạn chỉ quen với việc là: chỉ số của mảng sẽ từ 0, 1, 2, 3,…

Điều trên đúng, nhưng chưa đủ với JavaScript. Thực chất, chỉ số của mảng có thể là bất kỳ thứ gì. Nếu hiểu rộng ra một chút thì array sẽ gần giống object với key chính là chỉ số của mảng.

Ví dụ: một array là a = [1, 2, 3] thì sẽ gần tương đương với object a = {0: 1, 1: 2, 2: 3}. Dĩ nhiên, mình chỉ nói là gần tương đương thôi nhé, vì đây là 2 kiểu dữ liệu khác nhau, prototype cũng khác nhau,…

Nếu áp dụng điều này thì bạn có thể thấy chỉ số mảng có thể là số âm (-1) hay cũng có thể là string:

const

a

=

[

1

,

2

,

3

]

;

a

[

-

1

]

=

-

1

;

console

.

log

(

a

)

;

a

[

"x"

]

=

100

;

console

.

log

(

a

)

;

Như vậy, sau 2 câu lệnh đầu tiên trong câu hỏi, ta thu được:

const

x

=

[

1

,

2

,

3

]

;

x

[

-

1

]

=

-

1

;

console

.

log

(

x

)

;

3. Phương thức Array.prototype.indexOf()

Phương thức này đơn giản là tìm ra chỉ số của một giá trị cho trước trong mảng. Nếu không tìm thấy thì kết quả trả về là -1.

Với mảng x như trên thì x.indexOf(10000) sẽ trả về -1, vì mảng x không có phần tử nào có giá trị là 10000. Do đó, kết quả hiển thị trên console sẽ là kết quả của x[-1]. Và đó chính là -1.

Các bạn thấy câu hỏi này thế nào? Rất hay phải không?