Tại sao Math.min hoạt động với mảng một phần tử


17

Theo MDN Math.min chỉ chấp nhận các số và nếu một trong các đối số không phải là số, nó sẽ trả về NaN. Đúng là nếu chúng ta truyền một mảng có nhiều số chúng ta nhận được NaN, như thế này: Math.min([1,2])nhưng nếu chúng ta sử dụng một mảng chỉ có một số, Math.minsẽ trả về số đó trong mảng, như trong ví dụ này : Math.min([5]). Có ai có ý tưởng tại sao chúng ta thấy hành vi không có giấy tờ này không?


Câu trả lời:


47

Theo MDN Math.min chỉ chấp nhận các số và nếu một trong các đối số không phải là số, nó sẽ trả về NaN.

Đó không phải là những gì nó nói ( nhấn mạnh đậm của tôi):

Nếu ít nhất một đối số không thể được chuyển đổi thành một số, kết quả là NaN.

Chuyển đổi loại:

  • Math.minsử dụng ToNumberđể chuyển đổi các đối số của nó.
  • ToNumbersử dụng ToPrimitiveđể chuyển đổi Objects (và Arrays là Objects).
  • ToPrimitive sử dụng toString
  • [5].toString()'5', cái được trả về ToPrimitive, cái này trả về nó ToNumber, cái mà phân tích nó tới 5và trả nó về Math.min, cái mà nó là một đối số hợp lệ, bởi vì nó không phải là NaN.
  • [1, 2].toString(), OTOH, là '1, 2', được trả về ToPrimitive, trả về nó ToNumber, phân tích cú pháp cho nó NaN, bởi vì nó không phải là một đại diện số hợp lệ. ToNumbersau đó chuyển NaNsang Math.min, sau đó sẽ trả về NaN, bởi vì (như MDN nói) "một trong các đối số của nó không thể được chuyển đổi thành một số" hoặc (như thông số kỹ thuật nói) "Nếu bất kỳ giá trị nào là NaN, kết quả là NaN."

25
Thông số ECMAScript thực sự có thể đọc được một cách đáng ngạc nhiên, tôi mới phát hiện ra.
Jörg W Mittag

3
Đúng. Các Number([1,2]);kết quả NaN nhưng Number([1])kết quả 1.
Bhojendra Rauniyar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.