Posibles casos de error de JavaScript: "Identificador, cadena o número esperado"

84

Algunos usuarios informan errores ocasionales de JS en mi sitio. El mensaje de error dice "Identificador, cadena o número esperado" y el número de línea es 423725915, que es solo un número arbitrario y cambia para cada informe cuando esto ocurre. Esto sucede principalmente con los navegadores IE7 / Mozilla 4.0.

Escaneé mi código un montón de veces y ejecuté jslint pero no detectó nada. ¿Alguien sabe del tipo general de problemas de JS que conducen a este mensaje de error?

psicotik
fuente
Lo primero que me viene a la mente es lo obvio.
Anthony Forloney
¿Podría ser un literal de matriz que tiene una coma al final? (Además, ¿qué es "Mozilla 4.0"?)
Puntiagudo
Mozilla 4.0 compatibles en la cadena userAgent
Psychotik

Respuestas:

147

La causa de este tipo de error a menudo puede ser una coma mal colocada en una definición de objeto o matriz:

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

Si aparece en una línea aleatoria, tal vez sea parte de una definición de objeto que está creando dinámicamente.

comerciante
fuente
fue una falta; en una asignación de evento. La pista para mirar objetos creados dinámicamente ayudó a captar esto. jslint no encontró esto inicialmente porque se generó como js en línea como parte de una página html. ¡Gracias!
psychotik
2
No, no lo haría. La mayoría de los navegadores modernos solucionan este problema. IE6 / 7 no lo hace. Y la depuración de IE8 en el modo de emulación de IE7 no detecta esto. (Supongo que sabe que IE7 no tiene un depurador; el uso de VS con IE7 tampoco detecta esto). Pruébelo y luego dígame;)
psychotik
1
¡Gracias! Aparentemente esto no es un problema en otros navegadores, como Chrome.
B Siete
5
Puede buscar tales ocurrencias usando expresiones regulares ", \ s *]" y ", \ s * \}" (sin comillas). Me ahorro mucho tiempo.
Gökhan Kurt
2
Regex para javascript con saltos de línea como este: ,\s*?\n?\s*?]y,\s*?\n?\s*?\}
hayatbiralem
84

El uso de la palabra clase como clave en un diccionario Javascript también puede desencadenar el temido error "Identificador, cadena o número esperado" porque clase es una palabra clave reservada en Internet Explorer.

MALO

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

BUENO

{'class': 'overlay'}

Cuando utilice una palabra clave reservada como clave en un diccionario Javascript, incluya la clave entre comillas.

Espero que esta pista te salve un día de depuración infernal.

Roy Hyunjin Han
fuente
Bonito, estoy luchando con este problema durante horas. Resuelto ahora.
John Prado
Gracias, buen señor, por salvarme de mirar esta biblioteca javascript por más tiempo del necesario.
Khepri
1
Envié un error a JSHint, espero que puedan detectar este tipo de errores en el futuro: github.com/jshint/jshint/issues/1000
travis
1
@travis De hecho lo permitieron como resultado de # 674 :-)
cmbuckley
3
Tuve exactamente el mismo error, pero en la propiedad "importar". Aquí hay una lista completa de "Palabras reservadas" developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Edgar Zagórski
11

En realidad, recibí algo así en IE recientemente y estaba relacionado con "errores" de sintaxis de JavaScript. Digo error entre comillas porque estaba bien en todas partes menos en IE. Esto fue bajo IE6. El problema estaba relacionado con la creación de objetos JSON y una coma adicional, como

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

IE6 realmente no le gusta esa coma después de 3. Puede buscar algo así, pequeños problemas delicados de formalidad de sintaxis.

Sí, pensé que el número de línea multimillonario en mi JavaScript de 25 líneas también era interesante.

Buena suerte.

cjstehno
fuente
+1 Esto me ayudó mucho. El signo de interrogación adicional no rompió ie8 para mí, pero rompió ie7.
Ivan Durst
9

Esta es una no respuesta definitiva: eliminar una respuesta tentadora pero incorrecta para ayudar a otros a navegar hacia las respuestas correctas.

Puede parecer que la depuración destacaría el problema. Sin embargo, el único navegador en el que se produce el problema es IE, y en IE solo puede depurar el código que formaba parte del documento original. Para el código agregado dinámicamente, el depurador solo muestra el elemento del cuerpo como la instrucción actual, e IE afirma que el error ocurrió en un número de línea enorme.

Aquí hay una página web de muestra que demostrará este problema en 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>

Esto me produjo el siguiente error:

Line: 54654408
Error: Object required
ErikE
fuente
@Protectorone Coloca temporalmente el javascript en el documento a través de una <script>etiqueta, ya sea local o como recurso cargado. Depurar. Regrese a su guión de trabajo.
ErikE
5

Acabo de ver el error en una de mis aplicaciones, como una solución general, recuerde incluir el nombre de todas las propiedades de JavaScript que son iguales a la palabra clave.

Encontré este error después de atender un error en el que un objeto como:

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

generó el error (la clase y la función son palabras clave) esto se solucionó agregando comillas

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

Espero ahorrarte algo de tiempo

Josué Alejandro Ibarra
fuente
Me encontré con el mismo problema. Mi código estaba usando algo como if(_features.delete){...}que estaba causando un error porque eliminar es una palabra clave. stackoverflow.com/questions/26255/…
Snekse
2

Como se señaló anteriormente, tener una coma adicional arrojó un error.

También en IE 7.0, no tener un punto y coma al final de una línea provocaba un error. Funciona bien en Safari y Chrome (sin errores en la consola).

B siete
fuente
2

IE7 es mucho menos indulgente que los navegadores más nuevos, especialmente Chrome. Me gusta usar JSLint para encontrar estos errores. Encontrará estas comas colocadas incorrectamente, entre otras cosas. Probablemente desee activar la opción para ignorar los espacios en blanco incorrectos.

Además de las comas colocadas incorrectamente, en este blog en los comentarios alguien informó:

He estado buscando un error que solo decía "Identificador esperado" solo en IE (7). Mi investigación me llevó a esta página. Después de cierta frustración, resultó que el problema es que usé una palabra reservada como nombre de función ("interruptor"). El error no estaba claro y apuntaba a un número de línea incorrecto.

Muhd
fuente
1

Este error ocurre cuando agregamos o no quitamos una coma al final de la matriz o en el código de función. Es necesario observar el código completo de una página web para tal error.

Lo obtuve en un código de aplicación de Facebook mientras codificaba para una API de 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
fuente
0

Esto me suena a una secuencia de comandos que se introdujo con src y se cargó a la mitad, lo que provocó un error de sintaxis, pero el resto no se cargó.

Roland Bouman
fuente
0

IE7 tiene problemas con matrices de objetos

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

Otra variación de este error: tenía una función llamada 'continuar' y, dado que es una palabra reservada, arrojó este error. Tuve que cambiar el nombre de mi función 'continueClick'

Kevin Audleman
fuente
0

Tal vez tenga un objeto que tenga un método 'constructor' e intente invocarlo.

Niels Steenbeek
fuente
0

Puede encontrar este problema mientras usa Knockout JS. Si intenta configurar el atributo de clase como el ejemplo a continuación, fallará:

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

Escapa de la cadena de clase de esta manera:

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

Mis 2 centavos.

iDevGeek
fuente
0

Yo también me había encontrado con este problema. Encontré a continuación dos soluciones. 1). Igual que lo mencionado por otros anteriormente, elimine la coma adicional del objeto JSON. 2). Además, mi JSP / HTML estaba teniendo. Debido a esto, estaba activando el modo anterior del navegador, lo que daba un error JS para una coma adicional. Cuando se usa, activa el modo HTML5 del navegador (si es compatible) y funciona bien incluso con Extra Comma al igual que cualquier otro navegador FF, Chrome, etc.


fuente
1
¡Bienvenido a Stack Overflow! ¿Puede dar un ejemplo de lo que esto significa: "Mi JSP / HTML estaba teniendo".
Billrichards
0

Aquí hay una técnica fácil para depurar el problema: repita el script / código en la consola. Copie el código de la consola en su IDE. La mayoría de los IDE realizan una verificación de errores en el código y resaltan los errores. Debería poder ver el error casi de inmediato en su editor de JavaScript / HTML.

Hisenberg
fuente
0

Tuve el mismo problema con una configuración diferente. Esto fue en una definición de fábrica angular, pero supongo que también podría suceder en otros lugares:

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

Fix es muy exótico:

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

Esto también puede suceder en TypeScript si llama a una función en medio de la nada dentro de una clase. Por ejemplo

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

Las llamadas a funciones, como console.log()deben ser funciones internas. No en el área donde debería declarar campos de clase.

rayo Rayo
fuente
0

Problema de TypeScript para Windows

Esto funciona en IE, chrome, FF

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

Esto funciona en Chrome, FF, no funciona en IE 11

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

Supongo que de alguna manera está relacionado con las palabras reservadas de Windows.ingrese la descripción de la imagen aquí

Lev Savranskiy
fuente
0

Me encontré con este error en el que, en lugar de una coma final o algo así, esta sintaxis se había utilizado en constants.js

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

A IE 11 no le gustó esto en absoluto.

Como se mencionó anteriormente, esto se solucionó fácilmente usando

   var titles = {
     'title.X': 'X title',
     'title.Y': 'Y title'   
   }
Kingy
fuente
2
Estas no son expresiones equivalentes. El primero usa los valores de las propiedades title.X y title.Y como claves en el objeto de títulos, el segundo usa las cadenas "title.X" y "title.Y" como claves.
nabrown