Cas possibles d'erreur Javascript: "Identificateur, chaîne ou numéro attendu"

84

Certains utilisateurs signalent des erreurs JS occasionnelles sur mon site. Le message d'erreur indique «Identificateur, chaîne ou numéro attendu» et le numéro de ligne est 423725915, qui est simplement un nombre arbitraire et change pour chaque rapport lorsque cela se produit. Cela se produit principalement avec les navigateurs IE7 / Mozilla 4.0.

J'ai scanné mon code plusieurs fois et exécuté jslint mais il n'a rien détecté - quelqu'un connaît le type général de problèmes JS qui conduisent à ce message d'erreur?

psychotik
la source
La première chose qui me vient à l'esprit est l'évidence.
Anthony Forloney
Serait-ce un littéral de tableau qui a une virgule pendante à la fin? (Aussi, qu'est-ce que "Mozilla 4.0"?)
Pointy
Mozilla 4.0 compatible dans la chaîne userAgent
psychotik

Réponses:

147

La cause de ce type d'erreur peut souvent être une virgule mal placée dans une définition d'objet ou de tableau:

var obj = {
   id: 23,
   name: "test",  <--
}

S'il apparaît sur une ligne aléatoire, cela fait peut-être partie d'une définition d'objet que vous créez dynamiquement.

amercader
la source
c'était un manquant; dans une affectation d'événement. L'indice de regarder des objets créés dynamiquement a aidé à comprendre cela. jslint n'a pas trouvé cela initialement car il a été généré en tant que js en ligne dans le cadre d'une page html. Merci!
psychotik
2
Non, ce ne serait pas le cas. La plupart des navigateurs modernes résolvent ce problème pour vous. IE6 / 7 ne le fait pas. Et le débogage d'IE8 en mode d'émulation IE7 n'attrape pas cela. (Je suppose que vous savez que IE7 n'a pas de débogueur - l'utilisation de VS avec IE7 n'attrape pas cela non plus). Essayez-le et dites-moi;)
psychotik
1
Merci! Apparemment, ce n'est pas un problème dans d'autres navigateurs, comme Chrome.
B Seven du
5
Vous pouvez rechercher de telles occurrences en utilisant les expressions rationnelles ", \ s *]" et ", \ s * \}" (sans guillemets). Cela m'a fait gagner beaucoup de temps.
Gökhan Kurt
2
Regex pour javascript avec des sauts de ligne comme ceci: ,\s*?\n?\s*?]et,\s*?\n?\s*?\}
hayatbiralem
84

L'utilisation du mot classe comme clé dans un dictionnaire Javascript peut également déclencher l'erreur redoutée «Identifiant, chaîne ou numéro attendu» car la classe est un mot-clé réservé dans Internet Explorer.

MAL

{ class : 'overlay'} // ERROR: Expected identifier, string or number

BIEN

{'class': 'overlay'}

Lorsque vous utilisez un mot-clé réservé comme clé dans un dictionnaire Javascript, mettez la clé entre guillemets.

J'espère que cet indice vous fera gagner une journée d'enfer de débogage.

Roy Hyunjin Han
la source
Gentil, je lutte avec ce problème pendant des heures. Résolu maintenant.
John Prado
Merci bien monsieur de m'avoir évité de regarder cette bibliothèque javascript plus longtemps que nécessaire.
Khepri
1
J'ai présenté un bug à JSHint, nous espérons qu'ils seront en mesure de détecter ce type d'erreurs à l'avenir: github.com/jshint/jshint/issues/1000
TRAVIS
1
@travis Ils l'ont en fait permis à la suite de # 674 :-)
cmbuckley
3
J'ai eu exactement la même erreur, mais sur la propriété "import". Voici une liste complète des "Mots réservés" developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Edgar Zagórski
11

En fait, j'ai eu quelque chose comme ça sur IE récemment et c'était lié à des "erreurs" de syntaxe JavaScript. Je dis erreur entre guillemets parce que c'était bien partout mais sur IE. C'était sous IE6. Le problème était lié à la création d'objets JSON et à une virgule supplémentaire, telle que

{ one:1, two:2, three:3, }

IE6 n'aime vraiment pas cette virgule après 3. Vous pourriez chercher quelque chose comme ça, des petits problèmes de formalité de syntaxe délicats.

Oui, je pensais que le numéro de plusieurs millions de lignes dans mon JavaScript de 25 lignes était également intéressant.

Bonne chance.

cjstehno
la source
+1 Cela m'a beaucoup aidé. Le point d'interrogation supplémentaire n'a pas cassé ie8 pour moi, mais a cassé ie7.
Ivan Durst
9

Il s'agit d'une non-réponse définitive: éliminer une réponse tentante mais fausse pour aider les autres à trouver les bonnes réponses.

Il peut sembler que le débogage mettrait en évidence le problème. Cependant, le seul navigateur dans lequel le problème se produit est IE, et dans IE, vous ne pouvez déboguer que le code qui faisait partie du document d'origine. Pour le code ajouté dynamiquement, le débogueur affiche simplement l'élément body comme l'instruction actuelle, et IE affirme que l'erreur s'est produite sur un numéro de ligne énorme.

Voici un exemple de page Web qui illustrera ce problème dans IE:

<html>
<head>
<title>javascript debug test</title>
</head>
<body onload="attachScript();">
<script type="text/javascript">
function attachScript() {
   var s = document.createElement("script");
   s.setAttribute("type", "text/javascript");
   document.body.appendChild(s);
   s.text = "var a = document.getElementById('nonexistent'); alert(a.tagName);"
}
</script>
</body>

Cela a donné pour moi l'erreur suivante:

Line: 54654408
Error: Object required
ErikE
la source
@Protectorone Mettre temporairement le javascript dans le document lui-même via une <script>balise, locale ou en tant que ressource chargée. Déboguer. Revenez à votre script de travail.
ErikE
5

Je viens de voir le bogue dans l'une de mes applications, comme un fourre-tout, n'oubliez pas de joindre le nom de toutes les propriétés javascript qui sont les mêmes que le mot-clé.

J'ai trouvé ce bogue après avoir assisté à un bogue où un objet tel que:

var x = { class: 'myClass', function: 'myFunction'};

généré l'erreur (la classe et la fonction sont des mots-clés) cela a été corrigé en ajoutant des guillemets

var x = { 'class': 'myClass', 'function': 'myFunction'};

J'espère te faire gagner du temps

Josue Alexander Ibarra
la source
J'ai rencontré le même problème. Mon code utilisait quelque chose comme if(_features.delete){...}ce qui causait une erreur car delete est un mot-clé. stackoverflow.com/questions/26255/…
Snekse
2

Comme indiqué précédemment, le fait d'avoir une virgule supplémentaire a généré une erreur.

Également dans IE 7.0, l'absence de point-virgule à la fin d'une ligne provoquait une erreur. Cela fonctionne bien dans Safari et Chrome (sans erreur dans la console).

B Sept
la source
2

IE7 est beaucoup moins indulgent que les navigateurs plus récents, en particulier Chrome. J'aime utiliser JSLint pour trouver ces bogues. Il trouvera ces virgules mal placées, entre autres. Vous voudrez probablement activer l'option pour ignorer les espaces blancs inappropriés.

En plus des virgules mal placées, sur ce blog, dans les commentaires, quelqu'un a signalé:

J'ai recherché une erreur qui ne disait "Identifiant attendu" que dans IE (7). Mes recherches m'ont conduit à cette page. Après quelques frustrations, il s'est avéré que le problème était que j'utilisais un mot réservé comme nom de fonction ("switch"). L'erreur n'était pas claire et elle indiquait le mauvais numéro de ligne.

Muhd
la source
1

Cette erreur se produit lorsque nous ajoutons ou manquons de supprimer une virgule à la fin du tableau ou dans le code de fonction. Il est nécessaire d'observer l'intégralité du code d'une page Web pour une telle erreur.

Je l'ai eu dans un code d'application Facebook pendant que je codais pour une API Facebook.

<div id='fb-root'>
    <script type='text/javascript' src='http://connect.facebook.net/en_US/all.js'</script>
    <script type='text/javascript'>
          window.fbAsyncInit = function() {
             FB.init({appId:'".$appid."', status: true, cookie: true, xfbml: true});            
             FB.Canvas.setSize({ width: 800 , height: 860 , }); 
                                                       // ^ extra comma here
          };
    </script>
Tousif Jamadar
la source
0

Cela me semble être un script qui a été extrait avec src, et chargé juste à mi-chemin, provoquant une erreur de syntaxe sine que le reste n'est pas chargé.

Roland Bouman
la source
0

IE7 a des problèmes avec les tableaux d'objets

columns: [
{
  field: "id",
  header: "ID"
},
{
  field: "name",
  header: "Name" , /* this comma was the problem*/ 
},
...
Stefan Michev
la source
0

Une autre variante de ce bogue: j'avais une fonction nommée «continuer» et comme c'est un mot réservé, il a jeté cette erreur. J'ai dû renommer ma fonction 'continueClick'

Kevin Audleman
la source
0

Peut-être que vous avez un objet ayant une méthode «constructeur» et essayez de l'invoquer.

Niels Steenbeek
la source
0

Vous pouvez rencontrer ce problème lors de l'utilisation de Knockout JS. Si vous essayez de définir un attribut de classe comme dans l'exemple ci-dessous, cela échouera:

<span data-bind="attr: { class: something() }"></span>

Échappez la chaîne de classe comme ceci:

<span data-bind="attr: { 'class': something() }"></span>

Mes 2 cents.

iDevGeek
la source
0

J'avais moi aussi rencontré ce problème. J'ai trouvé ci-dessous deux solutions. 1). Comme mentionné par d'autres ci-dessus, supprimez la virgule supplémentaire de l'objet JSON. 2). En outre, mon JSP / HTML avait. Pour cette raison, il déclenchait l'ancien mode du navigateur qui donnait une erreur JS pour une virgule supplémentaire. Lorsqu'il est utilisé, il déclenche le mode HTML5 du navigateur (s'il est pris en charge) et il fonctionne bien même avec Extra Virgule, comme tous les autres navigateurs FF, Chrome, etc.


la source
1
Bienvenue dans Stack Overflow! Pouvez-vous donner un exemple de ce que cela signifie: "Mon JSP / HTML avait."
billrichards
0

Voici une technique simple pour déboguer le problème: envoyer le script / code à la console. Copiez le code de la console dans votre IDE. La plupart des IDE vérifient les erreurs sur le code et mettent en évidence les erreurs. Vous devriez pouvoir voir l'erreur presque immédiatement dans votre éditeur JavaScript / HTML.

Hisenberg
la source
0

Eu le même problème avec une configuration différente. C'était dans une définition d'usine angulaire, mais je suppose que cela pourrait également arriver ailleurs:

angular.module("myModule").factory("myFactory", function(){
    return
    {
        myMethod : function() // <--- error showing up here
        {
            // method definition
        } 
    }
});

Le correctif est très exotique:

angular.module("myModule").factory("myFactory", function(){
    return { // <--- notice the absence of the return line
        myMethod : function()
        {
            // method definition
        } 
    }
});
wiwi
la source
0

Cela peut également se produire dans Typescript si vous appelez une fonction au milieu de nulle part dans une classe. Par exemple

class Dojo implements Sensei {
     console.log('Hi'); // ERROR Identifier expected.
     constructor(){}
}

Les appels de fonction, comme console.log()doivent l'être à l'intérieur des fonctions. Pas dans la zone où vous devez déclarer les champs de classe.

rayon rayon
la source
0

Problème de typographie pour Windows

Cela fonctionne dans IE, chrome, FF

export const OTP_CLOSE = { 'outcomeCode': 'OTP_CLOSE' };

Cela fonctionne dans chrome, FF, ne fonctionne pas dans IE 11

export const OTP_CLOSE = { outcomeCode: 'OTP_CLOSE' };

Je suppose que cela est en quelque sorte lié aux mots réservés de Windowsentrez la description de l'image ici

Lev Savranskiy
la source
0

Je suis tombé sur cette erreur où plutôt qu'une virgule de fin ou quelque chose du genre, cette syntaxe avait été utilisée dans un constants.js

    var titles = {
      [title.X]: 'X title',
      [title.Y]: 'Y title'
    }

IE 11 n'aimait pas du tout cela.

Comme mentionné précédemment, cela a été facilement résolu en utilisant

   var titles = {
     'title.X': 'X title',
     'title.Y': 'Y title'   
   }
Kingy
la source
2
Ce ne sont pas des expressions équivalentes. Le premier utilise les valeurs des propriétés title.X et title.Y comme clés dans l'objet titres, le second utilise les chaînes "title.X" et "title.Y" comme clés.
nabrown