Tại sao typeof NaN trả về 'số'?


166

Chỉ tò mò thôi.

Nó không có vẻ rất logic đó typeof NaNlà số. Chỉ là thích NaN === NaNhoặc NaN == NaNtrả lại sai, nhân tiện. Đây có phải là một trong những đặc thù của javascript hay sẽ có lý do cho việc này?

Chỉnh sửa: cảm ơn câu trả lời của bạn. Nó không phải là một điều dễ dàng để có được những người xung quanh mặc dù. Đọc câu trả lời và wiki tôi hiểu nhiều hơn, nhưng vẫn, một câu như

So sánh với NaN luôn trả về kết quả không có thứ tự ngay cả khi so sánh với chính nó. Các vị từ so sánh là tín hiệu hoặc không báo hiệu, các phiên bản báo hiệu báo hiệu một ngoại lệ không hợp lệ cho các so sánh đó. Các vị từ đẳng thức và bất đẳng thức không có tín hiệu nên x = x trả về false có thể được sử dụng để kiểm tra nếu x là một NaN yên tĩnh.

chỉ cần giữ cho đầu của tôi quay. Nếu ai đó có thể dịch thứ này bằng ngôn ngữ có thể đọc được của con người (trái ngược với nhà toán học), tôi sẽ rất vui mừng.


17
+1: "NaN là một số nhưng không phải là số. Hum ... cái gì?!"
vào

11
Để có thêm niềm vui; (NaN! == NaN) == đúng
Alex K.

1
Thậm chí thú vị hơn (nhưng có thể hiểu được khi nghĩ về nó, isNaN trả về một boolean): isNaN (parseInt ('gật đầu')) === isNaN (parseInt ('someOtherNaN')) === true;
KooiInc

1
Nếu sử dụng jQuery, tôi thích isNumerickiểm tra kiểu: $.isNumeric(NaN); trả về false, trong đó as $.type(NaN);, trả về số. api.jquery.com/jQuery.isNumeric
Justin

3
Là nhà toán học chuyên nghiệp tôi phải nói rằng câu đó có ít điểm chung với ngôn ngữ chính xác của toán học.
Dmitri Zaitsev

Câu trả lời:


53

Nó có nghĩa là Không phải là một số. Nó không phải là đặc thù của javascript mà là nguyên tắc khoa học máy tính phổ biến.

Từ http://en.wikipedia.org/wiki/NaN :

Có ba loại hoạt động trả về NaN:

Hoạt động với NaN ít nhất một toán hạng

Các hình thức không xác định

  • Các phép chia 0/0, /, ∞ / −∞, −∞ / và /
  • Phép nhân 0 × ∞ và 0 ×
  • Sức mạnh 1 ^
  • Các phép cộng + (−∞), (−∞) + và phép trừ tương đương.

Hoạt động thực sự với kết quả phức tạp:

  • Căn bậc hai của một số âm
  • Lôgarit của một số âm
  • Tiếp tuyến của bội số lẻ 90 độ (hoặc π / 2 radian)
  • Sin hoặc cosin nghịch đảo của một số nhỏ hơn −1 hoặc lớn hơn +1.

Tất cả những giá trị này có thể không giống nhau. Một thử nghiệm đơn giản cho NaN là thử nghiệm value == valuelà sai.


46
Một thử nghiệm thậm chí đơn giản hơn làisNaN(value)
Alsciende

4
@Alsciende nó không tương đương. isNaN(undefined)trả lại true, nhưng undefined == undefinedcũng đúng Tương tự với tất cả các loại không số khác ngoại trừ null.
Andy

7
Nói cách khác, value !== valuecó lẽ là cách ngắn nhất để kiểm tra nếu valuethực sự NaN.
Andy

1
Có vẻ như bạn đúng, @Andy. Bây giờ đó là một đặc thù.
Alsciende

2
Cụm từ "những giá trị này có thể không giống nhau" không có nghĩa, bởi vì những giá trị đó không tồn tại.
Dmitri Zaitsev

103

Chà, NaNvẫn là một kiểu số , mặc dù thực tế nó thực sự là viết tắt của Not-A-Number :-)

NaNchỉ có nghĩa là giá trị cụ thể không thể được biểu thị trong các giới hạn của loại số (mặc dù điều đó có thể nói cho tất cả các số phải được làm tròn cho phù hợp, nhưng NaNlà trường hợp đặc biệt).

Một cụ thể NaNkhông được coi là bằng nhau NaNvì chúng có thể là các giá trị khác nhau. Tuy nhiên, NaNvẫn là một loại số, giống như 2718 hoặc 31415.


Đối với câu hỏi cập nhật của bạn để giải thích trong điều khoản của giáo dân:

So sánh với NaN luôn trả về kết quả không có thứ tự ngay cả khi so sánh với chính nó. Các vị từ so sánh là tín hiệu hoặc không báo hiệu, các phiên bản báo hiệu báo hiệu một ngoại lệ không hợp lệ cho các so sánh đó. Các vị từ đẳng thức và bất đẳng thức không có tín hiệu nên x = x trả về false có thể được sử dụng để kiểm tra nếu x là một NaN yên tĩnh.

Tất cả điều này có nghĩa là (được chia thành các phần):

So sánh với NaN luôn trả về kết quả không có thứ tự ngay cả khi so sánh với chính nó.

Về cơ bản, a NaNkhông bằng bất kỳ số nào khác, kể cả số khác NaN, và thậm chí bao gồm cả chính nó .

Các vị từ so sánh là tín hiệu hoặc không báo hiệu, các phiên bản báo hiệu báo hiệu một ngoại lệ không hợp lệ cho các so sánh đó.

Cố gắng thực hiện các phép so sánh (nhỏ hơn, lớn hơn, v.v.) giữa một NaNvà một số khác có thể dẫn đến một ngoại lệ bị ném (báo hiệu) hoặc chỉ bị sai do kết quả (không báo hiệu hoặc im lặng).

Các vị từ đẳng thức và bất đẳng thức không có tín hiệu nên x = x trả về false có thể được sử dụng để kiểm tra nếu x là một NaN yên tĩnh.

Các thử nghiệm cho sự bằng nhau (bằng, không bằng) không bao giờ báo hiệu vì vậy sử dụng chúng sẽ không gây ra ngoại lệ. Nếu bạn có một số thường xuyên x, thì x == xsẽ luôn luôn đúng. Nếu xlà một NaN, thì x == xsẽ luôn luôn là sai. Nó cho bạn một cách để phát hiện NaNdễ dàng (lặng lẽ).


1
giải thích tốt, mặc dù tôi không đồng ý trong hai câu cuối: cách tốt hơn để kiểm tra xem x có phải là NaN đang sử dụng hàm isNaN () không
Carlos Barcelona

@DominicRodger đây là cách tôi nghĩ về nó: typeof a === 'number'có nghĩa là "a được lưu trữ bên trong dưới dạng float của IEEE 754"
Andy

Tại sao Infinity === Infinitytrả về truenếu một Infinitycó thể được tạo bởi các giá trị khác nhau: 1.0 / 0.0 hoặc 2.0 / 0.0?
Hashem Qolami

1
@Hashem, hoàn toàn có khả năng vì chúng được coi là vô cùng giống nhau. Đối xử với phép chia như phép trừ lặp đi lặp lại, sẽ không có gì khác biệt dù bạn bắt đầu từ hai hay một, đó là cùng một số bước cần thiết để đạt được (hoặc chính xác hơn là không đạt) bằng không. Tôi hiểu các bậc thầy toán học các lớp vô cực khác nhau nhưng (1) Tôi nghi ngờ 1/02/0nằm trong cùng một lớp và (2) chỉ có một lớp vô cực trong IEEE754 (trừ +/-khóa học).
paxdiablo

1
Tôi không biết bất kỳ cách nào để định nghĩa những "con số thực tế" đặc biệt này theo bất kỳ cách có ý nghĩa nào. Trong toán học, nhật ký và gốc của phủ định chỉ có thể thu được bằng cách mở rộng số thực thành số phức, trong đó chúng đánh giá thành nhiều giá trị và 0/0không được định nghĩa theo bất kỳ cách có ý nghĩa nào, ngoài việc nói "giá trị" của nó là toàn bộ của các số. Và ngay cả khi chúng được xác định, Math.log(-1) == Math.log(-1)vẫn đánh giá false. Vì vậy, không chỉ không có "số thực tế" nào khác ngoài NaNngay cả khi có, chúng không được sử dụng để so sánh.
Dmitri Zaitsev

20

Tiêu chuẩn ECMAScript (JavaScript) chỉ định đó Numberslà các phao nổi IEEE 754 , bao gồm NaNnhư một giá trị có thể.

ECMA 262 5e Mục 4.3.19 : Giá trị số

giá trị nguyên thủy tương ứng với giá trị nhị phân 64 bit có độ chính xác kép 64 bit.

ECMA 262 5e Mục 4.3,23 : NaN

Giá trị số là giá trị "Không phải là số" của IEEE 754.

IEEE 754 trên Wikipedia

Tiêu chuẩn IEEE cho Số học dấu phẩy động là một tiêu chuẩn kỹ thuật được thiết lập bởi Viện Kỹ sư Điện và Điện tử và là tiêu chuẩn được sử dụng rộng rãi nhất cho tính toán dấu phẩy động [...]

Tiêu chuẩn xác định

  • các định dạng số học : tập hợp dữ liệu dấu phẩy động nhị phân và thập phân, bao gồm các số hữu hạn (bao gồm các số 0 được ký và số không bình thường), vô số và các giá trị "không phải là số" đặc biệt (NaNs)

[...]


8

typeof NaNtrả về 'number'vì:

  • Thông số ECMAScript cho biết loại Số bao gồm NaN:

    4.3.20 Kiểu số

    tập hợp tất cả các giá trị Số có thể bao gồm các giá trị đặc biệt không phải là Số (NaN), vô cực dương và vô cực âm

  • Vì vậy, typeoftrả lại cho phù hợp:

    11.4.3 Toán tử typeof

    Sản phẩm UnaryExpression : typeof UnaryExpression được đánh giá như sau:

    1. Đặt val là kết quả của việc đánh giá UnaryExpression .
    2. Nếu Loại ( val ) là Tham chiếu , thì
      1. Nếu IsUnresolvableReference ( val ) là đúng , trả về "undefined".
      2. Đặt valGetValue ( val ).
    3. Trả về một String xác định bởi loại ( val ) theo Bảng 20.

                    Table 20 — typeof Operator Results
    ==================================================================
    |        Type of val         |              Result               |
    ==================================================================
    | Undefined                  | "undefined"                       |
    |----------------------------------------------------------------|
    | Null                       | "object"                          |
    |----------------------------------------------------------------|
    | Boolean                    | "boolean"                         |
    |----------------------------------------------------------------|
    | Number                     | "number"                          |
    |----------------------------------------------------------------|
    | String                     | "string"                          |
    |----------------------------------------------------------------|
    | Object (native and does    | "object"                          |
    | not implement [[Call]])    |                                   |
    |----------------------------------------------------------------|
    | Object (native or host and | "function"                        |
    | does implement [[Call]])   |                                   |
    |----------------------------------------------------------------|
    | Object (host and does not  | Implementation-defined except may |
    | implement [[Call]])        | not be "undefined", "boolean",    |
    |                            | "number", or "string".            |
    ------------------------------------------------------------------

Hành vi này tuân theo Tiêu chuẩn IEEE về Số học dấu phẩy động (IEEE 754) :

4.3.19 Giá trị số

giá trị nguyên thủy tương ứng với định dạng nhị phân 64 bit có độ chính xác kép 64-bit

4.3,23 NaN

giá trị số đó là giá trị không phải là số của IEEE 754

8,5 Loại số

Loại Số có chính xác 18437736874454810627 (nghĩa là 2 53 2 64 +3), đại diện cho các giá trị IEEE 754 định dạng chính xác 64 bit như được chỉ định trong Tiêu chuẩn IEEE cho Số học dấu phẩy động nhị phân, ngoại trừ 9007199254740990 (ngoại trừ 9007199254740990 ( nghĩa là, 2 53 2) các giá trị khác nhau của Không phải là Số của Tiêu chuẩn IEEE được biểu thị trong ECMAScript dưới dạng một giá trị NaN đặc biệt . (Lưu ý rằng giá trị NaN được tạo bởi biểu thức chương trình NaN.)


5

NaN là một giá trị dấu phẩy động hợp lệ ( http://en.wikipedia.org/wiki/NaN )

và NaN === NaN là sai vì chúng không nhất thiết là cùng một số không


1
Xin lỗi nhưng tôi phải nói rằng đó không phải là một cách tốt để suy nghĩ về nó. "Không nhất thiết là cùng một số không" không có nghĩa là chúng luôn khác nhau và so sánh chúng sẽ mang lại sai. Tốt nhất không nên định lượng NaN và chỉ nghĩ về nó như một sự kỳ quặc trong nền tảng kiến ​​thức của chúng ta.
Dave

1
Vậy tại sao tất cả Infinitys bằng cách nào đó giống hệt nhau? Có suy nghĩ gì không?
Hashem Qolami

5

NaN != NaNbởi vì chúng không cần thiết cho số không CÙNG. Do đó, nó rất có ý nghĩa ... Ngoài ra, tại sao phao có cả +0,00 và -0,00 không giống nhau. Làm tròn có thể làm rằng họ thực sự không phải là không.

Đối với typeof, điều đó phụ thuộc vào ngôn ngữ. Và hầu hết các ngôn ngữ sẽ nói rằng NaN là số float, double hoặc number tùy thuộc vào cách họ phân loại nó ... Tôi biết không có ngôn ngữ nào sẽ nói đây là loại không xác định hoặc null.


1
ehr, xem xét: var x = parseInt ('no dice'), y = x; Bây giờ tôi sẽ nói rằng cả hai NaN giống hệt nhau? Nhưng không, x === y cũng trả về false.
KooiInc

vâng, nhưng bạn không thể BỀN, và do đó chúng không giống nhau. Nó là logic giống như logic NULLable trong cơ sở dữ liệu. Mặc dù nhiều người nghĩ về chúng giống như con trỏ null từ các ngôn ngữ lập trình khác, nhưng chúng thực sự có một ngữ nghĩa hoàn toàn khác. Chúng là "UNKNOWN" và do đó, một giá trị NULL so với giá trị khác luôn luôn là sai. Thực hiện tính toán trên giá trị NULL kết thúc với kết quả NULL. Thay vào đó, hãy thử xem nó từ góc độ của giá trị được gọi là UNKNOWN
Cine

Là loại number, NaNlà nguyên thủy, và do đó được xác định duy nhất bởi giá trị của nó.
Dmitri Zaitsev

4

NaNlà viết tắt của Not a Number . Đó là một giá trị của các loại dữ liệu số (thường là các loại dấu phẩy động, nhưng không phải luôn luôn) đại diện cho kết quả của một hoạt động không hợp lệ, chẳng hạn như chia cho 0.

Mặc dù tên của nó nói rằng đó không phải là một số, nhưng kiểu dữ liệu được sử dụng để giữ nó là một kiểu số. Vì vậy, trong JavaScript, yêu cầu kiểu dữ liệu NaNsẽ trả về number(như alert(typeof(NaN))thể hiện rõ ràng).


Trên thực tế, chia cho số 0 được đánh giá là InfinitykhôngNaN
Dmitri Zaitsev

2

Javascript sử dụng NaN để thể hiện bất cứ điều gì nó gặp phải mà không thể được thể hiện bằng bất kỳ cách nào khác bằng thông số kỹ thuật của nó. Nó không có nghĩa là nó không phải là một số. Đó chỉ là cách dễ nhất để mô tả cuộc gặp gỡ. NaN có nghĩa là nó hoặc một đối tượng đề cập đến nó không thể được thể hiện bằng bất kỳ cách nào khác bằng javascript. Đối với tất cả các mục đích thực tế, nó là 'không xác định'. Là "không xác định", nó không thể cho bạn biết nó là gì và thậm chí nếu nó là chính nó. Nó thậm chí không phải là đối tượng mà nó được gán cho. Nó chỉ có thể cho bạn biết nó không phải là gì, và không có gì hoặc không có gì chỉ có thể được mô tả bằng toán học trong một ngôn ngữ lập trình. Vì toán học là về những con số, javascript đại diện cho hư vô là NaN. Điều đó không có nghĩa là nó không phải là một con số. Nó có nghĩa là chúng ta không thể đọc nó theo bất kỳ cách nào khác có ý nghĩa. Đó là lý do tại sao nó có thể ' t thậm chí bằng chính nó. Bởi vì nó không.


2

Một cái tên tốt hơn để NaNmô tả ý nghĩa của nó chính xác hơn và ít gây nhầm lẫn hơn, sẽ là một ngoại lệ số . Nó thực sự là một loại đối tượng ngoại lệ khác được ngụy trang là có kiểu nguyên thủy (theo thiết kế ngôn ngữ), trong đó đồng thời nó không được coi là nguyên thủy trong việc tự so sánh sai. Sự nhầm lẫn từ đâu. Và miễn là ngôn ngữ "sẽ không làm cho nó" để lựa chọn giữa đối tượng ngoại lệ thích hợpchữ số nguyên thủy , sự nhầm lẫn sẽ ở lại.

Sự không bình đẳng khét tiếng của NaNchính nó, cả hai =====là một biểu hiện của thiết kế khó hiểu buộc đối tượng ngoại lệ này trở thành một kiểu nguyên thủy. Điều này phá vỡ nguyên tắc cơ bản rằng một nguyên thủy được xác định duy nhất bởi giá trị của nó . Nếu NaNđược ưu tiên xem là ngoại lệ (trong đó có thể có các loại khác nhau), thì nó không nên được "bán" như nguyên thủy. Và nếu nó muốn được nguyên thủy, nguyên tắc đó phải được giữ vững. Chừng nào nó bị hỏng, như chúng ta có trong JavaScript và chúng ta thực sự không thể quyết định giữa hai thứ, sự nhầm lẫn dẫn đến tải nhận thức không cần thiết cho mọi người liên quan sẽ vẫn còn. Tuy nhiên, điều này thực sự dễ dàng để khắc phục bằng cách đơn giản là lựa chọn giữa hai:

  • hoặc làm NaN một đối tượng ngoại lệ đặc biệt có chứa thông tin hữu ích về cách phát sinh ngoại lệ, trái ngược với việc ném thông tin đó đi như những gì hiện đang được triển khai, dẫn đến mã khó gỡ lỗi hơn;
  • hoặc tạo NaNmột thực thể của kiểu nguyên thủy number(có thể ít gây nhầm lẫn hơn là "số"), trong trường hợp đó nó phải bằng chính nó và không thể chứa bất kỳ thông tin nào khác; sau này rõ ràng là một sự lựa chọn thấp kém.

Ưu điểm có thể hiểu được duy nhất của việc ép buộc NaNthành numberkiểu là có thể ném nó trở lại vào bất kỳ biểu thức số nào. Tuy nhiên, điều đó làm cho nó trở thành lựa chọn dễ vỡ, bởi vì kết quả của bất kỳ biểu thức số nào có chứa NaNhoặc sẽ NaNdẫn đến kết quả không thể đoán trước như NaN < 0đánh giá false, tức là trả vềboolean thay vì giữ ngoại lệ.

Và ngay cả khi "mọi thứ là như vậy", không có gì ngăn cản chúng ta tạo ra sự khác biệt rõ ràng cho chính mình, để giúp làm cho mã của chúng ta dễ dự đoán hơn và dễ dàng gỡ lỗi hơn. Trong thực tế, điều đó có nghĩa là xác định những ngoại lệ đó và xử lý chúng như những ngoại lệ. Thật không may, điều đó có nghĩa là nhiều mã hơn nhưng hy vọng sẽ được giảm thiểu bằng các công cụ như TypeScript of Flowtype.

Và sau đó chúng ta có sự im lặng lộn xộn vs sự ồn ào aka tín hiệu NaNphân biệt . Mà thực sự là về cách xử lý các ngoại lệ, không phải là ngoại lệ và không có gì khác với các ngoại lệ khác.

Tương tự, Infinity+Infinitylà các phần tử của kiểu số phát sinh trong phần mở rộng của dòng thực nhưng chúng không phải là số thực. Về mặt toán học, chúng có thể được biểu diễn bằng các chuỗi số thực hội tụ thành một +hoặc -Infinity.


1

Điều này đơn giản là vì NaNlà một thuộc tính của đối tượng Number trong JS, Nó không liên quan gì đến việc nó là một số.


Giống như mọi đối tượng khác, Number có thể có bất kỳ loại tài sản nào. Number.fu = "bar"; alert(typeof Number.fu);
Alsciende

NaNkhông phải là giá trị được lưu trữ Number.NaN, bất kể nó có thể là gì. NaNlà một giá trị nguyên thủy của loại Số. Ngoài ra, giá trị của Number.NaNNaN, nhưng điều đó không liên quan.
Oriol

1

Cách tốt nhất để nghĩ về NAN là nó không được biết đến con số . Đó là lý do tại sao NAN! = NAN vì mỗi giá trị NAN đại diện cho một số số chưa biết duy nhất. NAN là cần thiết vì số dấu phẩy động có phạm vi giá trị giới hạn. Trong một số trường hợp, làm tròn xảy ra trong đó các bit thấp hơn bị mất dẫn đến những gì dường như vô nghĩa như 1.0 / 11 * 11! = 1.0. Giá trị thực sự lớn hơn là NAN với vô cùng là một ví dụ hoàn hảo.

Vì chúng tôi chỉ có mười ngón tay nên bất kỳ nỗ lực nào để hiển thị các giá trị lớn hơn 10 là không thể, điều đó có nghĩa là các giá trị đó phải là NAN vì chúng tôi đã mất giá trị thực của giá trị lớn hơn 10 này. Điều tương tự cũng đúng với các giá trị dấu phẩy động, trong đó giá trị vượt quá giới hạn của những gì có thể được giữ trong một dấu phẩy.


Vô cực không được đại diện bởi một NaN. Cố gắng thể hiện một số bên ngoài phạm vi sẽ được làm tròn xuống (tối đa / -inf) hoặc lên (đến min / + inf).
OrangeDog


1

NaNlà một số theo quan điểm loại, nhưng không phải là số bình thường như 1, 2 hoặc 329131. Tên "Không phải là số" đề cập đến thực tế là giá trị được biểu thị là đặc biệt và là về miền đặc tả định dạng của IEEE, không phải tên miền ngôn ngữ javascript.


1

Nếu sử dụng jQuery, tôi thích isNumerickiểm tra loại:

console.log($.isNumeric(NaN));  // returns false
console.log($.type(NaN));       // returns number

http://api.jquery.com/jQuery.isNumeric/


Cảm ơn người đàn ông. Tôi đã có vấn đề với isNumbertừ utilgói Bản in. jQueryThật tốt khi chúng tôi vẫn sử dụng trong dự án của chúng tôi để sử dụng đề xuất của bạn thay thế.
Ashok MA

Đối với rec, isNumbertừ utilcác nguyên cảo cũng trở về truecho NaN.
Ashok MA

0

Javascript chỉ có một loại dữ liệu số, đó là số float chính xác 64 bit tiêu chuẩn. Tất cả mọi thứ là một đôi. NaN là một giá trị đặc biệt của gấp đôi, nhưng dù sao nó cũng là gấp đôi.

Tất cả những gì parseIntlàm là "đúc" chuỗi của bạn thành một kiểu dữ liệu số, do đó kết quả luôn là "số"; chỉ khi chuỗi gốc không thể phân tích cú pháp, giá trị của nó sẽ là NaN.


0

NaN vẫn là một loại số, nhưng nó đại diện cho giá trị không thể đại diện cho một số hợp lệ.


0

Chúng ta có thể lập luận rằng NaN là một đối tượng trường hợp đặc biệt. Trong trường hợp này, đối tượng của NaN đại diện cho một số không có ý nghĩa toán học. Có một số đối tượng trường hợp đặc biệt khác trong toán học như INFINITE, v.v.

Bạn vẫn có thể thực hiện một số tính toán với nó, nhưng điều đó sẽ mang lại những hành vi kỳ lạ.

Thêm thông tin ở đây: http://www.concentric.net/~ttwang/tech/javafloat.htm (dựa trên java, không phải javascript)


0

Bạn đã yêu thích Javascript. Nó có một số quirks nhỏ thú vị.

http://wtfjs.com/page/13

Hầu hết những điều kỳ quặc đó có thể được giải thích nếu bạn dừng lại để giải quyết chúng một cách logic hoặc nếu bạn biết một chút về lý thuyết số, tuy nhiên chúng vẫn có thể đuổi bạn ra nếu bạn không biết về chúng.

Nhân tiện, tôi khuyên bạn nên đọc phần còn lại của http://wtfjs.com/ - có rất nhiều điều thú vị hơn cái này được tìm thấy!


0

Giá trị NaN thực sự là Số.NaN do đó khi bạn hỏi nếu đó là số thì nó sẽ trả lời là có. Bạn đã làm điều đúng bằng cách sử dụng lệnh gọi isNaN ().

Để biết thông tin, NaN cũng có thể được trả về bằng các thao tác trên các Số không được xác định như chia cho số 0 hoặc căn bậc hai của số âm.


Theo nghĩa nào thì đó là "giá trị"? NaN == Number.NaNđánh giá false!
Dmitri Zaitsev

@DmitriZaitsev Bạn đã đọc bài viết chưa? Và bạn đã thử nếu (parseInt ("nan") == Number.NaN) chưa? Cũng thử! = Và xem những gì nó nói với bạn.
Cướp

Xin lỗi, quên ngu ngốc NaN==NaNphúc false, nó phải có được một sadist người phát minh ra rằng để làm cho tất cả mọi người bị ảnh hưởng.
Dmitri Zaitsev

0

Một ví dụ

Hãy tưởng tượng Chúng tôi đang chuyển đổi một chuỗi thành một số:

Number("string"); // returns NaN

Chúng tôi đã thay đổi kiểu dữ liệu thành số nhưng giá trị của nó không phải là số!


Bạn dường như đã bỏ lỡ điểm của câu hỏi. NaNlà loại số . Câu hỏi là hỏi tại sao.
Quentin

@Quentin Tôi đã giải thích ở dòng cuối cùng.
Amir cho

-1

Đó là giá trị đặc biệt của loại Số là POSITIVE_INFINITY

Tại sao? Thiết kế bởi

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.