سؤال

فقط من باب الفضول.

فإنه لا يبدو من المنطقي جدا أن typeof NaN هو عدد.تماما مثل NaN === NaN أو NaN == NaN تعود كاذبة بالمناسبة.هذا هو واحد من خصوصيات جافا سكريبت ، أو أن يكون هناك سبب لذلك ؟

تحرير:شكرا على إجاباتك.ليس من السهل الحصول على تلك الرأس على الرغم من حولها.قراءة الإجابات ويكي فهمت أكثر, ولكن لا يزال, الجملة مثل

مقارنة مع نان يعود دائما غير مرتبة نتيجة حتى عند المقارنة مع نفسها.المقارنة المسندات إما إشارات أو غير إشارات الإشارات الإصدارات إشارة غير صالح استثناء مثل هذه المقارنات.المساواة وعدم المساواة المسندات غير إشارة لذلك x = x العودة كاذبة يمكن استخدامها لاختبار ما إذا كان x هو هادئ نان.

فقط يبقى رأسي الغزل.إذا كان شخص ما يمكن أن يترجم هذا في الإنسان (بدلا من, أقول, رياضيات) قراءة لغة سأكون gratefull.

هل كانت مفيدة؟

المحلول

وهذا لا يعني رقم. إنها ليست خصوصية من JavaScript ولكن مبدأ علوم الكمبيوتر المشترك.

من عند http://en.wikipedia.org/wiki/nan:

هناك ثلاثة أنواع من العمليات التي تعيد نان:

العمليات مع NAN مثل معامل واحد على الأقل

أشكال غير محددة

  • الانقسامات 0/0 ، ∞/∞ ، ∞/−∞ ، −∞/∞ ، و −∞/−∞
  • الضربات 0 × ∞ و 0 × −∞
  • القوة 1^∞
  • الإضافات ∞ + (−∞) ، (−∞) + ∞ والطرح المكافئ.

العمليات الحقيقية مع نتائج معقدة:

  • الجذر التربيعي لعدد سالب
  • لوغاريتم الرقم السلبي
  • الظل من المضاعف الفردي 90 درجة (أو π/2 راديان)
  • الجيب العكسي أو جيب التمام لعدد أقل من −1 أو أكبر من +1.

قد لا تكون كل هذه القيم هي نفسها. اختبار بسيط ل NAN هو الاختبار value == value هو زائف.

نصائح أخرى

نحن سوف، NaN لا يزال رقمي يكتب, ، على الرغم من حقيقة أنها ليست في الواقع عدد لا توجد رقم :-)

NaN يعني فقط أنه لا يمكن تمثيل القيمة المحددة ضمن قيود النوع الرقمي (على الرغم من أنه يمكن قول ذلك لجميع الأرقام التي يجب تقريبها لتناسبها ، ولكن NaN هي حالة خاصة).

محدد NaN لا يعتبر مساويا لآخر NaN لأنها قد تكون قيم مختلفة. لكن، NaN لا يزال نوع الأرقام ، تماما مثل 2718 أو 31415.


فيما يتعلق بسؤالك المحدث لشرحه في شروط الرجل العادي:

تُرجع المقارنة مع النان دائمًا نتيجة غير مرتبة حتى عند المقارنة مع نفسها. تنبؤات المقارنة هي إما الإشارة أو غير التوقيع ، وتشير إصدارات الإشارة إلى استثناء غير صالح لمثل هذه المقارنات. إن المساواة وعدم المساواة غير متوقعة غير التوقيع ، لذا يمكن استخدام x = x إرجاع الخاطئة لاختبار ما إذا كان x هو نان هادئ.

كل هذا يعني (تقسم إلى أجزاء):

تُرجع المقارنة مع النان دائمًا نتيجة غير مرتبة حتى عند المقارنة مع نفسها.

أساسا ، أ NaN لا يساوي أي رقم آخر ، بما في ذلك آخر NaN, وحتى بما في ذلك بحد ذاتها.

تنبؤات المقارنة هي إما الإشارة أو غير التوقيع ، وتشير إصدارات الإشارة إلى استثناء غير صالح لمثل هذه المقارنات.

محاولة القيام بالمقارنة (أقل من ، أكبر من ، وما إلى ذلك) العمليات بين أ NaN ويمكن أن يؤدي رقم آخر إما إلى إلقاء استثناء (إشارات) أو مجرد الحصول على خطأ كنتيجة (غير التوقيع أو الهادئ).

إن المساواة وعدم المساواة غير متوقعة غير التوقيع ، لذا يمكن استخدام x = x إرجاع الخاطئة لاختبار ما إذا كان x هو نان هادئ.

اختبارات المساواة (تساوي ، لا تساوي) لا تشير أبدًا إلى أن استخدامها لن يتسبب في استثناء. إذا كان لديك رقم عادي x, ، من ثم x == x سيكون دائما صحيح. لو x هو NaN, ، من ثم x == x سيكون دائما كاذب. إنه يعطيك وسيلة للكشف NaN بسهولة (بهدوء).

يحدد معيار ecmascript (JavaScript) ذلك Numbers نكون IEEE 754 العوامات التي تشمل NaN كقيمة محتملة.

ECMA 262 5E القسم 4.3.19: قيمة الرقم

القيمة البدائية المقابلة لتنسيق ثنائي 64 بت من القيمة الثنائية IEEE 754.

ECMA 262 5E القسم 4.3.23: نان

قيمة الأرقام التي هي قيمة IEEE 754 "NOT-A-NUBER".

IEEE 754 على ويكيبيديا

يعد معيار IEEE لحساب النقطة العائمة معيارًا تقنيًا أنشأه معهد مهندسي الكهرباء والإلكترونيات والمعيار الأكثر استخدامًا على نطاق واسع لحساب النقطة العائمة [...

المعيار يحدد

  • التنسيقات الحسابية: مجموعات من بيانات النقطة العائمة الثنائية والعشرية ، والتي تتكون من أعداد محدودة (بما في ذلك الأصفار الموقعة والأرقام دون الطبيعية) ، واللونفيس ، و قيم "ليس رقمًا" خاصًا (NANS)

[...]

typeof NaN يعود 'number' لأن:

  • مواصفات ECMAScript يقول الرقم يتضمن نوع نان:

    4.3.20 نوع الرقم

    مجموعة من كل عدد ممكن من القيم بما في ذلك خاصة "Not-a-عدد" (نان) القيم الإيجابية ما لا نهاية ، والسلبية اللانهاية

  • لذلك typeof يعود بالتالي:

    11.4.3 تشير typeof المشغل

    إنتاج UnaryExpression : typeof UnaryExpression هو تقييمها على النحو التالي:

    1. السماح فال تكون نتيجة تقييم UnaryExpression.
    2. إذا نوع(فال) هو المرجعية, ثم
      1. إذا IsUnresolvableReference(فال) هو صحيح, العودة "undefined".
      2. السماح فال يكون GetValue(فال).
    3. عودة سلسلة تحددها نوع(فال) حسب الجدول 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".            |
    ------------------------------------------------------------------
    

هذا السلوك وفقا IEEE معيار حساب الفاصلة العائمة (IEEE 754):

4.3.19 عدد القيمة

بدائية القيمة المقابلة الدقة المزدوجة 64 بت ثنائي تنسيق IEEE 754 القيمة

4.3.23 نان

قيمة الرقم الذي هو IEEE 754 "Not-a-عدد" قيمة

8.5 عدد نوع

عدد نوع بالضبط 18437736874454810627 (وهذا هو ، 253−264+3) القيم تمثل الدقة المزدوجة 64 بت تنسيق IEEE 754 القيم كما هو محدد في معيار IEEE على الفاصلة العائمة الثنائية الحساب, إلا أن 9007199254740990 (وهذا هو ، 253-2) متميزة "Not-a-عدد" القيم IEEE القياسية ممثلة في ECMAScript واحد خاص نان القيمة.(لاحظ أن نان القيمة تنتج برنامج التعبير NaN.)

NAN هي قيمة نقطة عائمة صالحة (http://en.wikipedia.org/wiki/nan)

و NAN === NAN خاطئة لأنها ليست بالضرورة نفس غير العدد

NaN != NaN لأنها ليست ضرورية نفس العدد. وبالتالي ، فمن المنطقي ... أيضًا لماذا لدى العوامات +0.00 و -0.00 ليست هي نفسها. قد تفعل التقريب أنها في الواقع ليست صفر.

أما بالنسبة للنوع ، فإن هذا يعتمد على اللغة. وسوف تقول معظم اللغات أن NAN هي تعويم أو مزدوج أو رقم اعتمادًا على كيفية تصنيفها ... لا أعرف أي لغات ستقول أن هذا نوع غير معروف أو فارغ.

NaN تمثل ليس رقمًا. إنها قيمة لأنواع البيانات الرقمية (عادة ما تكون أنواع النقاط العائمة ، ولكن ليس دائمًا) والتي تمثل نتيجة عملية غير صالحة مثل تقسيمها على الصفر.

على الرغم من أن أسماءها تقول إنها ليست رقمًا ، إلا أن نوع البيانات المستخدم للاحتفاظ به هو نوع رقمي. لذلك في JavaScript ، طلب نوع البيانات من NaN سيعود number (مثل alert(typeof(NaN)) يوضح بوضوح).

يستخدم JavaScript NAN لتمثيل أي شيء يواجهه لا يمكن تمثيله بأي طريقة أخرى من خلال مواصفاته. هذا لا يعني أنه ليس رقمًا. إنها مجرد أسهل طريقة لوصف اللقاء. نان يعني أنه أو كائن يشير إليه لا يمكن تمثيله بأي طريقة أخرى بواسطة JavaScript. لجميع الأغراض العملية ، إنها "غير معروفة". كونه "غير معروف" لا يمكن أن يخبرك بما هو عليه ولا حتى لو كان في حد ذاته. إنه ليس حتى الكائن الذي تم تعيينه إليه. يمكن أن يخبرك فقط بما هو ليس كذلك ، ولا يمكن وصف عدم الراحة أو العدم إلا رياضيا بلغة البرمجة. نظرًا لأن الرياضيات تدور حول الأرقام ، فإن JavaScript تمثل العدم مثل NAN. هذا لا يعني أنه ليس رقمًا. هذا يعني أننا لا نستطيع قراءتها بأي طريقة أخرى منطقية. لهذا السبب لا يمكن أن يساوي نفسه. لأنه لا.

اسم أفضل ل NaN, ، وصف معناها أكثر دقة وأقل إرباكًا ، سيكون أ استثناء رقمي. إنه حقًا نوع آخر من الاستثناءات المتنوعة على أنه نوع بدائي (من خلال تصميم اللغة) ، حيث لا يعامل في نفس الوقت على أنه بدائي في شفاه نفسه الخاطئ. من أين الارتباك. وطالما أن اللغة "لن تفكر" في الاختيار بين كائن استثناء مناسب و العدد البدائي, ، سيبقى الارتباك.

عدم المساواة سيئة السمعة من NaN لنفسهما == و === هو مظهر من مظاهر التصميم المربك الذي يجبر هذا الكائن الاستثناء إلى كونه نوعًا بدائيًا. هذا يكسر المبدأ الأساسي الذي أ يتم تحديد البدائية بشكل فريد من خلال قيمتها. لو NaN من المفضل أن ينظر إليه على أنه استثناء (يمكن أن يكون هناك أنواع مختلفة) ، ثم لا ينبغي "بيعها" على أنها بدائية. وإذا كان مطلوبًا أن يكون بدائيًا ، فيجب أن يحمل هذا المبدأ. طالما أنه تم كسره ، كما لدينا في JavaScript ، ولا يمكننا أن نقرر حقًا بين الاثنين ، سيبقى الارتباك الذي يؤدي إلى الحمل المعرفي غير الضروري لجميع المعنيين. ومع ذلك ، من السهل حقًا إصلاحه عن طريق الاختيار بين الاثنين:

  • إما جعل NaN كائن استثناء خاص يحتوي على المعلومات المفيدة حول كيفية ظهور الاستثناء ، بدلاً من رمي هذه المعلومات بعيدًا عن ما يتم تنفيذه حاليًا ، مما يؤدي إلى رمز أكثر صعوبة ؛
  • أو جعل NaN كيان من النوع البدائي number (يمكن أن يسمى ذلك بشكل مربك "رقمي") ، وفي هذه الحالة يجب أن يكون مساوياً لنفسه ولا يمكن أن يحتوي على أي معلومات أخرى ؛ من الواضح أن الأخير هو خيار أدنى.

الميزة الوحيدة التي يمكن تصورها في التأثير NaN داخل number النوع هو قادر على رميه مرة أخرى في أي تعبير رقمي. ومع ذلك ، يجعلها خيارًا هشًا ، لأن نتيجة أي تعبير رقمي يحتوي NaN سيكون إما NaN, ، أو يؤدي إلى نتائج لا يمكن التنبؤ بها مثل NaN < 0 التقييم ل false, ، أي العودة boolean بدلا من الحفاظ على الاستثناء.

وحتى إذا كانت "الأشياء هي الطريقة التي هي" ، فلا شيء يمنعنا من التمييز الواضح لأنفسنا ، للمساعدة في جعل كودنا أكثر قابلية للتنبؤ به وقابل للتصحيح بشكل أسهل. في الممارسة العملية ، هذا يعني تحديد تلك الاستثناءات والتعامل معها كاستثناءات. وهذا ، لسوء الحظ ، يعني المزيد من التعليمات البرمجية ولكن نأمل أن يتم تخفيفها عن طريق أدوات مثل TypeScript of FlowType.

ثم لدينا الفوضى هادئة مقابل صاخبة معروفة أيضًا NaN امتياز. وهو أمر يتعلق حقًا بكيفية معالجة الاستثناءات ، وليس الاستثناءات نفسها ، ولا شيء مختلف عن الاستثناءات الأخرى.

بصورة مماثلة، Infinity و +Infinity هي عناصر نوع رقمي الناشئة في تمديد الخط الحقيقي لكنها ليست أرقام حقيقية. من الناحية الرياضية ، يمكن تمثيلها بتسلسلات من الأرقام الحقيقية التي تتقارب إلى أي منهما + أو -Infinity.

هذا ببساطة بسبب NaN هي خاصية لكائن الأرقام في JS ، لا علاقة لها بأنها رقم.

أفضل طريقة للتفكير في NAN هي أنها ليست معروف رقم. لهذا السبب نان! = نان لأن كل قيمة نان تمثل رقمًا غير معروف فريد. NANS ضرورية لأن أرقام النقاط العائمة لها مجموعة محدودة من القيم. في بعض الحالات ، يحدث التقريب حيث يتم فقد البتات السفلية مما يؤدي إلى ما يبدو أنه هراء مثل 1.0/11*11! = 1.0. القيم الكبيرة حقًا التي تكون أكبر هي أن اللانهاية هي مثال مثالي.

بالنظر إلى أننا لا نواجه سوى عشرة أصابع أي محاولة لإظهار قيم أكبر من 10 مستحيلة ، مما يعني أن هذه القيم يجب أن تكون nans لأننا فقدنا القيمة الحقيقية لهذه القيمة أكبر من 10. وينطبق الشيء نفسه على قيم النقطة العائمة ، حيث تتجاوز القيمة حدود ما يمكن الاحتفاظ به في تعويم.

لأن NAN هو نوع بيانات رقمي.

NaN هو رقم من وجهة نظر نوع ، ولكن ليس رقمًا عاديًا مثل 1 أو 2 أو 329131. الاسم "ليس رقمًا" يشير إلى حقيقة أن القيمة الممثلة هي الخاصة وهي حول مجال Spec Format Format ، وليس مجال لغة JavaScript.

إذا كنت تستخدم jQuery ، فأنا أفضل isNumeric فوق التحقق من النوع:

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

http://api.jquery.com/jquery.isnumeric/

يحتوي JavaScript على نوع بيانات رقمي واحد فقط ، وهو التعويم المزدوج 64 بت القياسي. كل شيء مزدوج. NAN هي قيمة خاصة للمزدوجة ، لكنها مع ذلك مزدوجة.

كل ذلك parseInt هل هو "إلقاء" سلسلةك في نوع بيانات رقمي ، وبالتالي فإن النتيجة هي دائماً "رقم"؛ فقط إذا لم تكن السلسلة الأصلية قابلة للتوصيل ، فستكون قيمتها نان.

لا يزال NAN نوعًا رقميًا ، لكنه يمثل قيمة لا يمكن أن تمثل رقمًا صالحًا.

يمكن أن نقول أن نان هو كائن حالة خاص. في هذه الحالة ، يمثل كائن NAN رقمًا لا معنى له. هناك بعض كائنات الحالات الخاصة الأخرى في الرياضيات مثل Infinite وما إلى ذلك.

لا يزال بإمكانك إجراء بعض الحسابات معها ، لكن ذلك سيؤدي إلى سلوكيات غريبة.

مزيد من المعلومات هنا: http://www.concentric.net/~ttwang/tech/javafloat.htm (مقر جافا ، وليس جافا سكريبت)

عليك أن تحب JavaScript. لديها بعض المراوغات الصغيرة المثيرة للاهتمام.

http://wtfjs.com/page/13

يمكن تفسير معظم هذه المراوغات إذا توقفت عن العمل بشكل منطقي ، أو إذا كنت تعرف قليلاً عن نظرية الأرقام ، لكن مع ذلك لا يزال بإمكانهم إخراجك إذا كنت لا تعرف عنها.

بالمناسبة ، أوصي بقراءة بقية http://wtfjs.com/ - هناك الكثير من المراوغات إثارة للاهتمام من هذا واحد يمكن العثور عليه!

القيمة NAN هي حقًا الرقم. وبالتالي عندما تسأل عما إذا كان رقمًا سيقول نعم. لقد فعلت الشيء الصحيح باستخدام مكالمة ISNAN ().

للحصول على معلومات ، يمكن أيضًا إرجاع NAN من خلال العمليات على الأرقام التي لم يتم تعريفها مثل الأقسام عن طريق الصفر أو الجذر التربيعي لعدد سالب.

مثال

تخيل أننا نقوم بتحويل سلسلة إلى رقم:

Number("string"); // returns NaN

قمنا بتغيير نوع البيانات إلى الرقم ولكن قيمته ليست رقمًا!

إنها قيمة خاصة لنوع الرقم على أنه موجب

لماذا ا؟ من تصمبم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top