+16

Phỏng vấn Javascript - Điều kiện (a==1 && a==2 && a==3) có thể đúng hay không?

Series các bài viết ngắn chia sẻ Tips Javascript giúp code nhanh và kiến thức phỏng vấn Javascript.

Meta Crew

Câu hỏi

Nếu ta dùng if với điều kiện (a==1 && a==2 && a==3) thì có thể đúng hay không? Câu trả lời là có đối với Javascript. Đáp áp của câu hỏi như sau:

const a = {
  i: 1,
  valueOf: function () {
    return this.i++;
  }
}

if(a == 1 && a == 2 && a == 3) { // true
  console.log('Hello World!');
}

Chạy thử đoạn code trên Console và bạn sẽ nhận được kết quả 'Hello World!'.

Vậy làm thế nào?

Hai từ khóa để ta hiểu được tại sao biểu thức trên lại đúng là:

  • Loose Equality (==)
  • Object’s valueOf() function

Loose Equality

Trong JS khi ta thực hiện so sánh hai biến với == thì hai biến đó được chuyển về dạng common type trước khi so sánh. Đối với object thì công việc đó được thực hiện với hàm valueOf(). Ví dụ:

const a = { i: 1 }

a == 1 // => a.valueOf() == 1 => { i: 1 } == 1

Ta có thể viết lại hàm valueOf() để trả về giá trị ta muốn:

const a = {
  i: 1,
  valueOf: function () {
    return this.i;
  }
}

a == 1 // => a.valueOf() == 1 => 1 == 1 => true

Vậy để biểu thức đầu bài có thể đúng, ta chỉ việc viết lại hàm valueOf() thích hợp:

const a = {
  i: 1,
  valueOf: function () {
    return this.i++;
  }
}

Mỗi lần ta dùng == thì hàm valueOf() được gọi và giá trị i tăng từ 1 lên 2 và 3. Nên biểu thức a == 1 && a == 2 && a == 3 đúng trong JS.

Frontend VN

Theo dõi FB của Frontend VN để cập nhật kiến thức và tips về FE mỗi ngày 🥰.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí