IsNaN() - JavaScript | MDN

  • Skip to main content
  • Skip to search

Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.

View in English Always switch to English

isNaN() Baseline Widely available

Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis ⁨juillet 2015⁩.

  • Learn more
  • See full compatibility
  • Report feedback

La fonction isNaN() permet de déterminer si une valeur est NaN. On notera que cette fonction utilise des règles de conversion différentes de Number.isNaN(), définie avec ECMAScript 2015 (ES6).

Dans cet article

  • Exemple interactif
  • Syntaxe
  • Description
  • Exemples
  • Spécifications
  • Compatibilité des navigateurs
  • Voir aussi

Exemple interactif

function milliseconds(x) { if (isNaN(x)) { return "Not a Number!"; } return x * 1000; } console.log(milliseconds("100F")); // Expected output: "Not a Number!" console.log(milliseconds("0.0314E+2")); // Expected output: 3140

Syntaxe

jsisNaN(valeurÀTester);

Paramètres

valeurÀTester

La valeur dont on souhaite déterminer si elle est NaN.

Valeur de retour

true si la valeur fournie vaut NaN, sinon, la méthode renverra false.

Description

La nécessité d'avoir isNaN()

À la différence des autres valeurs JavaScript, il est impossible d'utiliser les opérateurs d'égalité faible et stricte (== et ===) afin de déterminer si une valeur est ou n'est pas réellement NaN. En effet NaN == NaN et NaN === NaN renvoient false tous les deux. C'est pour cela qu'il est nécessaire d'avoir la fonction isNaN().

Les origines de NaN

La valeur NaN est générée lorsqu'une opération arithmétique résulte en une valeur indéfinie ou non représentable. De telles valeurs ne représentent pas nécessairement des dépassements de condition. NaN peut également être le résultat d'une conversion numérique pour les valeurs qui n'ont pas de valeurs numériques correspondantes (par exemple lorsqu'on souhaite convertir la chaîne "toto" en un nombre).

Par exemple, lorsqu'on divise zéro par zéro, on obtient NaN. En revanche, lorsqu'on divise d'autres nombres par zéro, on n'obtient pas ce résultat.

Comportement étrange de isNaN()

Depuis les premières spécifications pour isNaN(), son comportement sur les arguments non-numériques a toujours été source de confusion. Lorsque l'argument passé à la fonction n'est pas du type Number, la valeur est d'abord convertie en une valeur du type Number. La valeur résultante est ensuite utilisée lors du test afin de déterminer si c'est NaN. Ainsi pour valeurs non numériques qui sont converties en une valeur non-NaN numérique (notamment la chaîne vide, les valeurs booléennes qui donnent zéro ou un), la fonction renverra false, ce qui pourrait être inattendu (en effet, la chaîne vide n'est pas un nombre). Ici, la confusion provient du fait que « not a number » a un sens particulier pour les valeurs numériques représentées selon IEEE-754. Cette fonction doit plutôt être vue comme la réponse à la question « est-ce que cette valeur, lorsqu'elle est convertie en une valeur numérique, correspond à la valeur IEEE-754 "Not A Number" ? ».

La version ECMAScript ES2015 ajoute la méthode Number.isNaN(). Number.isNaN(x) permettra de tester de façon plus fiable si x vaut NaN ou non. Si on ne dispose pas de cette méthode, on peut également utiliser l'expression (x != x) afin de tester de façon plus certaine si x vaut NaN ou non (en effet le résultat de cette expression n'aura pas les faux positifs de isNaN). Sous cet angle, isNaN() peut être vu comme :

jsvar isNaN = function (valeur) { return Number.isNaN(Number(valeur)); };

Ou encore, en utilisant le fait que NaN est la seule valeur différente d'elle-même :

jsvar isNaN = function (valeur) { var n = Number(valeur); return n !== n; };

NaN est « empoisonné »

Cette fonction peut être utilisée afin de déterminer si la valeur courante peut faire partie d'une expression arithmétique. En effet, si un des composants d'une expression arithmétique vaut NaN, le résultat de l'expression sera NaN également (on dit alors que NaN « empoisonne » l'expression). La méthode isNaN() permet alors de vérifier, avant de construire une expression, que les valeurs utilisées n'empoisonneront pas l'expression.

On peut par exemple construire une fonction dont on souhaite qu'elle incrémente l'argument et que la valeur qu'elle renvoie ne puisse pas être NaN. Le code de cette fonction pourrait être :

jsfunction incrément(x) { if (isNaN(x)) { x = 0; } return x + 1; } // En utilisant des notations raccourcies, // on pourrait écrire une fonction équivalente function incrémentCourt(x) { isNaN(x) ? 1 : x + 1; } incrément("blabla"); // 1 incrément(1); // 2 incrément(NaN); // 1

Exemples

jsisNaN(NaN); // true isNaN(undefined); // true isNaN({}); // true isNaN(true); // false isNaN(null); // false isNaN(37); // false // strings isNaN("37"); // false : "37" est converti vers le nombre 37 qui n'est pas NaN isNaN("37.37"); // false : "37.37" est converti vers le nombre 37.37 qui n'est pas NaN isNaN("37,25"); // true : la virgule n'est pas considérée comme un séparateur décimal isNaN("123ABC"); // true : "123ABC" converti en 123 par parseInt mais en NaN par Number isNaN(""); // false : la chaîne vide est convertie en 0 qui n'est pas NaN isNaN(" "); // false : une chaîne de blancs est convertie en 0 qui n'est pas NaN // dates isNaN(new Date()); // false isNaN(new Date().toString()); // true // Voici le résultat « faux-positif » qui fait que isNaN n'est pas entièrement fiable isNaN("blabla"); // true : "blabla" est converti en un nombre // Si on souhaite convertir cette valeur en nombre, cela échoue // et on obtient NaN

Spécifications

Specification
ECMAScript® 2026 Language Specification# sec-isnan-number

Compatibilité des navigateurs

Voir aussi

  • NaN
  • Number.isNaN()

Help improve MDN

Was this page helpful to you? Yes No Learn how to contribute

Cette page a été modifiée le ⁨2 déc. 2025⁩ par les contributeurs du MDN.

View this page on GitHub • Report a problem with this content Filter sidebar
  1. JavaScript
  2. Tutoriels
  3. Guide JavaScript
    1. Introduction
    2. Types et grammaire
    3. Contrôle du flux et gestion des erreurs
    4. Boucles et itération
    5. Fonctions
    6. Expressions et opérateurs
    7. Numbers and strings
    8. Representing dates & times
    9. Expressions rationnelles
    10. Collections indexées
    11. Collections avec clés
    12. Manipuler les objets
    13. Using classes
    14. Utiliser les promesses
    15. Tableaux typés en JavaScript
    16. Itérateurs et générateurs
    17. Resource management
    18. Internationalization
    19. Modules JavaScript
  4. Intermédiaire
    1. Language overview
    2. Structures de données en JavaScript
    3. Différents tests d'égalité
    4. Rattachement des propriétés
    5. Fermetures (closures)
  5. Avancé
    1. L'héritage et la chaîne de prototypes
    2. Métaprogrammation
    3. Gestion de la mémoire
  6. Références
  7. Objets natifs
    1. AggregateError
    2. Array
    3. ArrayBuffer
    4. AsyncDisposableStack
    5. AsyncFunction
    6. AsyncGenerator
    7. AsyncGeneratorFunction
    8. AsyncIterator
    9. Atomics
    10. BigInt
    11. BigInt64Array
    12. BigUint64Array
    13. Boolean
    14. DataView
    15. Date
    16. decodeURI()
    17. decodeURIComponent()
    18. DisposableStack
    19. encodeURI()
    20. encodeURIComponent()
    21. Error
    22. escape() Obsolète
    23. eval()
    24. EvalError
    25. FinalizationRegistry
    26. Float16Array
    27. Float32Array
    28. Float64Array
    29. Function
    30. Generator
    31. GeneratorFunction
    32. globalThis
    33. Infinity
    34. Int8Array
    35. Int16Array
    36. Int32Array
    37. InternalError Non standard
    38. Intl
    39. isFinite()
    40. isNaN()
    41. Iterator
    42. JSON
    43. Map
    44. Math
    45. NaN
    46. Number
    47. Object
    48. parseFloat()
    49. parseInt()
    50. Promise
    51. Proxy
    52. RangeError
    53. ReferenceError
    54. Reflect
    55. RegExp
    56. Set
    57. SharedArrayBuffer
    58. String
    59. SuppressedError
    60. Symbol
    61. SyntaxError
    62. Temporal
    63. TypedArray
    64. TypeError
    65. Uint8Array
    66. Uint8ClampedArray
    67. Uint16Array
    68. Uint32Array
    69. undefined
    70. unescape() Obsolète
    71. URIError
    72. WeakMap
    73. WeakRef
    74. WeakSet
  8. Expressions et opérateurs
    1. Addition (+)
    2. Affectation après addition (+=)
    3. Assignement (=)
    4. Expression async function
    5. Expression async function*
    6. await
    7. ET binaire (&)
    8. Affectation après ET binaire (&=)
    9. NON binaire (~)
    10. OU binaire (|)
    11. Affectation après OU binaire (|=)
    12. OU exclusif binaire (^)
    13. Affectation après OU exclusif binaire (^=)
    14. class
    15. L'opérateur virgule
    16. L'opérateur conditionnel
    17. Décrémentation (--)
    18. L'opérateur delete
    19. Affecter par décomposition
    20. Division (/)
    21. Affectation après division (/=)
    22. Égalité (==)
    23. Exponentiation (**)
    24. Affectation après exponentiation (**=)
    25. L'opérateur function
    26. Expression function*
    27. Supérieur strict (>)
    28. Supérieur ou égal (>=)
    29. Opérateur de groupement
    30. import.meta
      1. import.meta.resolve()
    31. import
    32. L'opérateur in
    33. Incrémentation (++)
    34. Inégalité (!=)
    35. instanceof
    36. Décalage binaire à gauche (<<)
    37. Affectation après décalage à gauche (<<=)
    38. Inférieur strict (<)
    39. Inférieur ou égal (<=)
    40. ET logique (&&)
    41. Affectation après ET logique (&&=)
    42. NON logique (!)
    43. OU logique (||)
    44. Affectation après OU logique (||=)
    45. Multiplication (*)
    46. Affectation après multiplication (*=)
    47. L'opérateur new
    48. new.target
    49. null
    50. Affectation après coalescence des nuls (??=)
    51. Opérateur de coalescence des nuls (Nullish coalescing operator)
    52. Initialisateur d'objet
    53. Précédence des opérateurs
    54. Chaînage optionnel (optional chaining)
    55. Accesseurs de propriétés
    56. Reste (%)
    57. Affectation après reste (%=)
    58. Décalage binaire à droite (>>)
    59. Affectation après décalage à droite (>>=)
    60. Syntaxe de décomposition
    61. Égalité stricte (===)
    62. Inégalité stricte (!==)
    63. Soustraction (-)
    64. Affectation après soustraction (-=)
    65. super
    66. L'opérateur this
    67. L'opérateur typeof
    68. Négation unaire (-)
    69. Plus unaire (+)
    70. Décalage binaire à droite non-signé (>>>)
    71. Affectation après décalage à droite non signé (>>>=)
    72. L'opérateur void
    73. yield
    74. yield*
  9. Instructions et déclarations
    1. async function
    2. async function*
    3. await using
    4. bloc
    5. break
    6. class
    7. const
    8. continue
    9. debugger
    10. do...while
    11. vide
    12. export
    13. Expression statement
    14. for
    15. for await...of
    16. for...in
    17. for...of
    18. function
    19. function*
    20. if…else
    21. import
      1. Import attributes
    22. label
    23. let
    24. return
    25. switch
    26. throw
    27. try...catch
    28. using
    29. var
    30. while
    31. with Obsolète
  10. Fonctions
    1. Fonctions fléchées
    2. Valeurs par défaut des arguments
    3. L'opérateur get
    4. Définir une méthode
    5. Paramètres du reste (Rest parameters)
    6. L'opérateur set
    7. arguments
      1. arguments[@@iterator]()
      2. callee Obsolète
      3. length
  11. Classes
    1. constructor
    2. extends
    3. Propriétés privées
    4. Champs de classe publics
    5. static
    6. Static initialization blocks
  12. Expressions rationnelles
    1. Backreference: \1, \2
    2. Capturing group: (...)
    3. Character class escape: \d, \D, \w, \W, \s, \S
    4. Character class: [...], [^...]
    5. Character escape: \n, \u{...}
    6. Disjunction: |
    7. Input boundary assertion: ^, $
    8. Literal character: a, b
    9. Lookahead assertion: (?=...), (?!...)
    10. Lookbehind assertion: (?<=...), (?<!...)
    11. Modifier: (?ims-ims:...)
    12. Named backreference: \k<name>
    13. Named capturing group: (?<name>...)
    14. Non-capturing group: (?:...)
    15. Quantifier: *, +, ?, {n}, {n,}, {n,m}
    16. Échappement des propriétés Unicode
    17. Wildcard: .
    18. Word boundary assertion: \b, \B
  13. Erreurs
    1. AggregateError: No Promise in Promise.any was resolved
    2. Error: Permission denied to access property "x"
    3. InternalError: too much recursion
    4. RangeError: argument is not a valid code point
    5. RangeError: BigInt division by zero
    6. RangeError: BigInt negative exponent
    7. RangeError: form must be one of 'NFC', 'NFD', 'NFKC', or 'NFKD'
    8. RangeError: invalid array length
    9. RangeError: invalid date
    10. RangeError: precision is out of range
    11. RangeError: radix must be an integer
    12. RangeError: repeat count must be less than infinity
    13. RangeError: repeat count must be non-negative
    14. RangeError: x can't be converted to BigInt because it isn't an integer
    15. ReferenceError: "x" is not defined
    16. ReferenceError: assignment to undeclared variable "x"
    17. ReferenceError: can't access lexical declaration 'X' before initialization
    18. ReferenceError: must call super constructor before using 'this' in derived class constructor
    19. ReferenceError: super() called twice in derived class constructor
    20. SyntaxError: 'arguments'/'eval' can't be defined or assigned to in strict mode code
    21. SyntaxError: "0"-prefixed octal literals and octal escape seq. are deprecated
    22. SyntaxError: "use strict" not allowed in function with "x" parameter
    23. SyntaxError: "x" is a reserved identifier
    24. SyntaxError: \ at end of pattern
    25. SyntaxError: a declaration in the head of a for-of loop can't have an initializer
    26. SyntaxError: applying the 'delete' operator to an unqualified name is deprecated
    27. SyntaxError: arguments is not valid in fields
    28. SyntaxError: await is only valid in async functions, async generators and modules
    29. SyntaxError: await/yield expression can't be used in parameter
    30. SyntaxError: cannot use `??` unparenthesized within `||` and `&&` expressions
    31. SyntaxError: character class escape cannot be used in class range in regular expression
    32. SyntaxError: continue must be inside loop
    33. SyntaxError: duplicate capture group name in regular expression
    34. SyntaxError: duplicate formal argument x
    35. SyntaxError: for-in loop head declarations may not have initializers
    36. SyntaxError: function statement requires a name
    37. SyntaxError: functions cannot be labelled
    38. SyntaxError: getter and setter for private name #x should either be both static or non-static
    39. SyntaxError: getter functions must have no arguments
    40. SyntaxError: identifier starts immediately after numeric literal
    41. SyntaxError: illegal character
    42. SyntaxError: import declarations may only appear at top level of a module
    43. SyntaxError: incomplete quantifier in regular expression
    44. ReferenceError: invalid assignment left-hand side
    45. SyntaxError: invalid BigInt syntax
    46. SyntaxError: invalid capture group name in regular expression
    47. SyntaxError: invalid character in class in regular expression
    48. SyntaxError: invalid class set operation in regular expression
    49. SyntaxError: invalid decimal escape in regular expression
    50. SyntaxError: invalid identity escape in regular expression
    51. SyntaxError: invalid named capture reference in regular expression
    52. SyntaxError: invalid property name in regular expression
    53. SyntaxError: invalid range in character class
    54. SyntaxError: invalid regexp group
    55. SyntaxError: invalid regular expression flag "x"
    56. SyntaxError: invalid unicode escape in regular expression
    57. SyntaxError: JSON.parse: bad parsing
    58. SyntaxError: label not found
    59. SyntaxError: missing : after property id
    60. SyntaxError: missing ) after argument list
    61. SyntaxError: missing ) after condition
    62. SyntaxError: missing ] after element list
    63. SyntaxError: missing } after function body
    64. SyntaxError: missing } after property list
    65. SyntaxError: missing = in const declaration
    66. SyntaxError: missing formal parameter
    67. SyntaxError: missing name after . operator
    68. SyntaxError: missing variable name
    69. SyntaxError: negated character class with strings in regular expression
    70. SyntaxError: new keyword cannot be used with an optional chain
    71. SyntaxError: nothing to repeat
    72. SyntaxError: numbers out of order in {} quantifier.
    73. SyntaxError: octal escape sequences can't be used in untagged template literals or in strict mode code
    74. SyntaxError: parameter after rest parameter
    75. SyntaxError: private fields can't be deleted
    76. SyntaxError: property name __proto__ appears more than once in object literal
    77. SyntaxError: raw bracket is not allowed in regular expression with unicode flag
    78. SyntaxError: redeclaration of formal parameter "x"
    79. SyntaxError: reference to undeclared private field or method #x
    80. SyntaxError: rest parameter may not have a default
    81. SyntaxError: return not in function
    82. SyntaxError: setter functions must have one argument
    83. SyntaxError: unterminated string literal
    84. SyntaxError: super() is only valid in derived class constructors
    85. SyntaxError: tagged template cannot be used with optional chain
    86. SyntaxError: Unexpected '#' used outside of class body
    87. SyntaxError: Unexpected token
    88. SyntaxError: unlabeled break must be inside loop or switch
    89. SyntaxError: unparenthesized unary expression can't appear on the left-hand side of '**'
    90. SyntaxError: use of super property/member accesses only valid within methods or eval code within methods
    91. SyntaxError: Using //@ to indicate sourceURL pragmas is deprecated. Use //# instead
    92. ReferenceError: deprecated caller or arguments usage
    93. TypeError: 'x' is not iterable
    94. TypeError: "x" is (not) "y"
    95. TypeError: "x" is not a constructor
    96. TypeError: "x" is not a function
    97. TypeError: "x" is not a non-null object
    98. TypeError: "x" is read-only
    99. TypeError: already executing generator
    100. TypeError: BigInt value can't be serialized in JSON
    101. TypeError: calling a builtin X constructor without new is forbidden
    102. TypeError: can't access/set private field or method: object is not the right class
    103. TypeError: can't assign to property "x" on "y": not an object
    104. TypeError: can't convert BigInt to number
    105. TypeError: can't convert x to BigInt
    106. TypeError: can't define property "x": "obj" is not extensible
    107. TypeError: can't delete non-configurable array element
    108. TypeError: can't redefine non-configurable property "x"
    109. TypeError: can't set prototype of this object
    110. TypeError: can't set prototype: it would cause a prototype chain cycle
    111. TypeError: invalid 'in' operand "x"
    112. TypeError: class constructors must be invoked with 'new'
    113. TypeError: cyclic object value
    114. TypeError: derived class constructor returned invalid value x
    115. TypeError: getting private setter-only property
    116. TypeError: Initializing an object twice is an error with private fields/methods
    117. TypeError: invalid 'instanceof' operand 'x'
    118. TypeError: invalid Array.prototype.sort argument
    119. TypeError: invalid assignment to const "x"
    120. TypeError: Iterator/AsyncIterator constructor can't be used directly
    121. TypeError: matchAll/replaceAll must be called with a global RegExp
    122. TypeError: More arguments needed
    123. TypeError: "x" has no properties
    124. TypeError: property "x" is non-configurable and can't be deleted
    125. TypeError: Reduce of empty array with no initial value
    126. TypeError: setting a property that has only a getter
    127. TypeError: WeakSet key/WeakMap value 'x' must be an object or an unregistered symbol
    128. TypeError: X.prototype.y called on incompatible type
    129. URIError: malformed URI sequence
    130. Warning: -file- is being assigned a //# sourceMappingURL, but already has one
    131. Warning: unreachable code after return statement
  14. Divers
    1. Aperçu des technologies JavaScript
    2. Execution model
    3. Grammaire lexicale
    4. Protocoles d'itération
    5. Mode strict
    6. Gabarits de chaînes de caractères
    7. Virgules finales
    8. Fonctionnalités dépréciées

Tag » Arduino Isnan Function