Possibili casi di errore Javascript: "Identificatore, stringa o numero previsto"


84

Alcuni utenti segnalano errori JS occasionali sul mio sito. Il messaggio di errore dice "Identificatore, stringa o numero previsto" e il numero di riga è 423725915, che è solo un numero arbitrario e cambia per ogni rapporto quando si verifica ciò. Ciò accade principalmente con i browser IE7 / Mozilla 4.0.

Ho scansionato il mio codice un sacco di volte e ho eseguito jslint ma non ha rilevato nulla: qualcuno sa del tipo generale di problemi JS che portano a questo messaggio di errore?


La prima cosa che mi viene in mente è l'ovvio.
Anthony Forloney

Potrebbe essere un array letterale che ha una virgola penzolante alla fine? (Inoltre, cos'è "Mozilla 4.0"?)
punta

Mozilla 4.0 compatibile nella stringa userAgent
psychotik

Risposte:


147

La causa di questo tipo di errore può spesso essere una virgola fuori posto nella definizione di un oggetto o di un array:

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

Se appare su una linea casuale, forse fa parte della definizione di un oggetto che stai creando dinamicamente.


mancava; in un incarico di evento. L'indizio per guardare gli oggetti creati dinamicamente ha aiutato a capirlo. jslint non ha trovato questo inizialmente perché è stato generato come js inline come parte di una pagina html. Grazie!
psychotik

2
No, non lo sarebbe. La maggior parte dei browser moderni risolve questo problema per te. IE6 / 7 no. E il debug di IE8 in modalità di emulazione di IE7 non lo rileva. (Immagino che tu sappia che IE7 non ha un debugger - l'uso di VS con IE7 non cattura neanche questo). Provalo e poi dimmi;)
psychotik

1
Grazie! Apparentemente questo non è un problema in altri browser, come Chrome.
B Seven

5
Puoi cercare tali occorrenze utilizzando regex ", \ s *]" e ", \ s * \}" (senza virgolette). Mi ha fatto risparmiare un sacco di tempo.
Gökhan Kurt

2
Regex per javascript con interruzioni di riga come questa: ,\s*?\n?\s*?]e,\s*?\n?\s*?\}
hayatbiralem

84

L'utilizzo della parola classe come chiave in un dizionario Javascript può anche attivare il temuto errore "Identificatore, stringa o numero previsto" perché la classe è una parola chiave riservata in Internet Explorer.

CATTIVO

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

BENE

{'class': 'overlay'}

Quando si utilizza una parola chiave riservata come chiave in un dizionario Javascript, racchiudere la chiave tra virgolette.

Spero che questo suggerimento ti risparmi una giornata di debug infernale.


Bello, sto lottando con questo problema per ore. Risolto ora.
John Prado

Grazie buon signore per avermi evitato di fissare questa libreria javascript più a lungo del necessario.
Khepri

1
Ho inviato un bug a JSHint, spero che saranno in grado di rilevare questo tipo di errori in futuro: github.com/jshint/jshint/issues/1000
travis

1
@travis In realtà lo hanno permesso come risultato di # 674 :-)
cmbuckley

3
Ho avuto esattamente lo stesso errore, ma sulla proprietà "import". Ecco un elenco completo di "Parole riservate" developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Edgar Zagórski

11

In realtà ho ottenuto qualcosa del genere su IE di recente ed era correlato agli "errori" di sintassi JavaScript. Dico errore tra virgolette perché andava bene ovunque ma su IE. Questo era sotto IE6. Il problema era correlato alla creazione di oggetti JSON e una virgola aggiuntiva, come

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

A IE6 non piace davvero quella virgola dopo 3. Potresti cercare qualcosa del genere, piccoli problemi di formalità di sintassi.

Sì, pensavo che anche il numero di righe multimilionario nel mio JavaScript a 25 righe fosse interessante.

In bocca al lupo.


+1 Questo mi ha aiutato molto. Il punto interrogativo in più non ha rotto ie8 per me, ma ha rotto ie7.
Ivan Durst

9

Questa è una non risposta definitiva: eliminare una risposta allettante ma sbagliata per aiutare gli altri a navigare verso le risposte corrette.

Potrebbe sembrare che il debug evidenzi il problema. Tuttavia, l'unico browser in cui si verifica il problema è IE e in IE è possibile eseguire il debug solo del codice che faceva parte del documento originale. Per il codice aggiunto dinamicamente, il debugger mostra semplicemente l'elemento body come istruzione corrente e IE afferma che l'errore si è verificato su un numero di riga enorme.

Ecco una pagina web di esempio che dimostrerà questo problema in 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>

Questo ha prodotto per me il seguente errore:

Line: 54654408
Error: Object required

@Protectorone Metti temporaneamente il javascript nel documento stesso tramite un <script>tag, locale o come risorsa caricata. Debug. Torna al tuo script di lavoro.
ErikE

5

Ho appena visto il bug in una delle mie applicazioni, come un catch-all, ricordati di racchiudere il nome di tutte le proprietà javascript che sono le stesse della parola chiave.

Trovato questo bug dopo aver partecipato a un bug in cui un oggetto come:

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

ha generato l'errore (classe e funzione sono parole chiave) questo è stato risolto aggiungendo virgolette

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

Spero di farti risparmiare tempo


Mi sono imbattuto nello stesso problema. Il mio codice utilizzava qualcosa di simile if(_features.delete){...}che causava un errore perché l'eliminazione è una parola chiave. stackoverflow.com/questions/26255/...
Snekse


2

Come notato in precedenza, la presenza di una virgola in più generava un errore.

Anche in IE 7.0, non avere un punto e virgola alla fine di una riga ha causato un errore. Funziona bene in Safari e Chrome (senza errori nella console).


2

IE7 è molto meno indulgente rispetto ai browser più recenti, in particolare Chrome. Mi piace usare JSLint per trovare questi bug. Troverà queste virgole posizionate in modo improprio, tra le altre cose. Probabilmente vorrai attivare l'opzione per ignorare gli spazi non corretti.

Oltre alle virgole inserite in modo improprio, in questo blog nei commenti qualcuno ha segnalato:

Ho cercato un errore che diceva solo "Identificatore previsto" solo in IE (7). La mia ricerca mi ha portato a questa pagina. Dopo un po 'di frustrazione, si è scoperto che il problema che ho usato una parola riservata come nome di una funzione ("switch"). L'errore non era chiaro e indicava il numero di riga sbagliato.



1

Questo errore si verifica quando aggiungiamo o perdiamo la rimozione di una virgola alla fine dell'array o nel codice della funzione. È necessario osservare l'intero codice di una pagina web per tale errore.

L'ho ricevuto in un codice dell'app di Facebook mentre stavo codificando per un'API di 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>

0

Questo suona come uno script che è stato inserito con src e caricato solo a metà, causando un errore di sintassi sine il resto non viene caricato.


0

IE7 ha problemi con gli array di oggetti

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

0

Un'altra variazione di questo bug: avevo una funzione chiamata "continue" e poiché è una parola riservata ha generato questo errore. Ho dovuto rinominare la mia funzione "continueClick"



0

Puoi riscontrare questo problema durante l'utilizzo di Knockout JS. Se provi a impostare l'attributo di classe come nell'esempio seguente, fallirà:

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

Esci dalla stringa della classe in questo modo:

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

I miei 2 centesimi.


0

Anch'io mi ero imbattuto in questo problema. Ho trovato di seguito due soluzioni. 1). Come menzionato da altri sopra, rimuovi la virgola extra dall'oggetto JSON. 2). Inoltre, il mio JSP / HTML stava avendo. Per questo motivo stava attivando la vecchia modalità del browser che dava un errore JS per una virgola extra. Quando viene utilizzato, attiva la modalità HTML5 del browser (se supportata) e funziona bene anche con Extra Comma proprio come qualsiasi altro browser FF, Chrome ecc.


1
Benvenuto in Stack Overflow! Puoi fare un esempio di cosa significa: "Il mio JSP / HTML stava avendo".
billrichards

0

Ecco una tecnica semplice per eseguire il debug del problema: eseguire l'eco dello script / codice sulla console. Copia il codice dalla console nel tuo IDE. La maggior parte degli IDE esegue il controllo degli errori sul codice ed evidenzia gli errori. Dovresti essere in grado di vedere l'errore quasi immediatamente nel tuo editor JavaScript / HTML.


0

Ha avuto lo stesso problema con una configurazione diversa. Questo era in una definizione di fabbrica angolare, ma presumo che potrebbe accadere anche altrove:

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

La correzione è molto esotica:

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

0

Questo può accadere anche in Typescript se chiami una funzione nel bel mezzo del nulla all'interno di una classe. Per esempio

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

Chiamate di funzione, come console.log()deve essere all'interno delle funzioni. Non nell'area in cui dovresti dichiarare i campi di classe.


0

Problema con il dattiloscritto per Windows

Funziona in IE, Chrome, FF

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

Funziona in Chrome, FF, Non funziona in IE 11

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

Immagino sia in qualche modo correlato alle parole riservate di Windowsinserisci qui la descrizione dell'immagine


0

Mi sono imbattuto in questo errore in cui invece di una virgola finale o qualcosa del genere, questa sintassi era stata utilizzata in constants.js

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

A IE 11 non è piaciuto affatto.

Come accennato in precedenza, questo è stato facilmente risolto utilizzando

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

2
Queste non sono espressioni equivalenti. Il primo utilizza i valori delle proprietà title.X e title.Y come chiavi nell'oggetto titoli, il secondo utilizza le stringhe "title.X" e "title.Y" come chiavi.
nabrown
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.