Possíveis casos de erro de Javascript: “Esperado identificador, string ou número”

87

Alguns usuários estão relatando erros ocasionais de JS em meu site. A mensagem de erro diz "Esperado identificador, string ou número" e o número da linha é 423725915, que é apenas um número arbitrário e muda para cada relatório quando isso ocorre. Isso acontece principalmente com os navegadores IE7 / Mozilla 4.0.

Eu verifiquei meu código um monte de vezes e executei jslint, mas não detectou nada - alguém sabe do tipo geral de problemas de JS que levam a esta mensagem de erro?

psicótico
fonte
A primeira coisa que vem à mente é o óbvio.
Anthony Forloney
Poderia ser um literal de array que tem uma vírgula pendente no final? (Além disso, o que é "Mozilla 4.0"?)
Pontudo
Mozilla 4.0 compatível na string userAgent
psychotik

Respostas:

150

A causa desse tipo de erro geralmente pode ser uma vírgula mal colocada em uma definição de objeto ou matriz:

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

Se aparecer em uma linha aleatória, talvez seja parte de uma definição de objeto que você está criando dinamicamente.

amercader
fonte
era uma falta; em uma atribuição de evento. A pista para observar objetos criados dinamicamente ajudou a entender isso. jslint não encontrou isso inicialmente porque foi gerado como js inline como parte de uma página html. THX!
psicótico de
2
Não, não iria. A maioria dos navegadores modernos corrige isso para você. IE6 / 7 não. E a depuração do IE8 no modo de emulação do IE7 não pega isso. (Suponho que você saiba que o IE7 não tem um depurador - usar o VS com o IE7 também não pega isso). Experimente e me diga;)
psychotik
1
Obrigado! Aparentemente, isso não é um problema em outros navegadores, como o Chrome.
B Sete de
5
Você pode pesquisar essas ocorrências usando regex ", \ s *]" e ", \ s * \}" (sem aspas). Me economizou muito tempo.
Gökhan Kurt
2
Regex para javascript com quebras de linha como esta: ,\s*?\n?\s*?]e,\s*?\n?\s*?\}
hayatbiralem
84

Usar a palavra classe como uma chave em um dicionário Javascript também pode acionar o temido erro "Identificador, string ou número esperado" porque classe é uma palavra-chave reservada no Internet Explorer.

RUIM

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

BOA

{'class': 'overlay'}

Ao usar uma palavra-chave reservada como uma chave em um dicionário Javascript, coloque a chave entre aspas.

Espero que esta dica economize um dia infernal de depuração.

Roy Hyunjin Han
fonte
Legal, estou lutando com esse problema por horas. Resolvido agora.
John Prado
Obrigado, bom senhor, por me evitar de ficar olhando para esta biblioteca javascript por mais tempo do que o necessário.
Khepri
1
Enviei um bug para JSHint, espero que eles sejam capazes de detectar esses tipos de erros no futuro: github.com/jshint/jshint/issues/1000
travis
1
@travis Eles realmente permitiram como resultado de # 674 :-)
cmbuckley
3
Tive exatamente o mesmo erro, mas na propriedade "import". Aqui está uma lista completa de "Palavras reservadas" developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Edgar Zagórski
11

Na verdade, recebi algo parecido no IE recentemente e estava relacionado a "erros" de sintaxe JavaScript. Eu digo erro entre aspas porque estava bem em qualquer lugar, menos no IE. Isso foi no IE6. O problema estava relacionado à criação do objeto JSON e uma vírgula extra, como

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

O IE6 realmente não gosta dessa vírgula após 3. Você pode procurar por algo assim, pequenos problemas de formalidade de sintaxe delicados.

Sim, também achei interessante o número de linha de vários milhões em meu JavaScript de 25 linhas.

Boa sorte.

Cjstehno
fonte
+1 Isso me ajudou muito. O ponto de interrogação extra não quebrou ie8 para mim, mas quebrou ie7.
Ivan Durst
9

Esta é uma resposta definitiva: eliminar uma resposta tentadora, mas errada, para ajudar os outros a navegar em direção às respostas corretas.

Pode parecer que a depuração destacaria o problema. No entanto, o único navegador em que o problema ocorre é o IE, e no IE você só pode depurar o código que fazia parte do documento original. Para código adicionado dinamicamente, o depurador mostra apenas o elemento do corpo como a instrução atual e o IE afirma que o erro aconteceu em um grande número de linha.

Aqui está um exemplo de página da web que demonstrará esse problema no 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>

Isso gerou para mim o seguinte erro:

Line: 54654408
Error: Object required
ErikE
fonte
@Protectorone Coloque temporariamente o javascript no próprio documento por meio de uma <script>tag, local ou como recurso carregado. Depurar. Volte para o seu script de trabalho.
ErikE
5

Acabei de ver o bug em um de meus aplicativos, como um resumo, lembre-se de incluir o nome de todas as propriedades javascript que são iguais à palavra-chave.

Encontrou este bug depois de atender a um bug onde um objeto como:

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

gerou o erro (classe e função são palavras-chave) que foi corrigido adicionando aspas

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

Espero te poupar algum tempo

Josue Alexander Ibarra
fonte
Eu tive o mesmo problema. Meu código estava usando algo parecido com o if(_features.delete){...}que estava causando um erro porque delete é uma palavra-chave. stackoverflow.com/questions/26255/…
Snekse
2

Conforme observado anteriormente, ter uma vírgula extra gerou um erro.

Também no IE 7.0, não ter um ponto-e-vírgula no final de uma linha causava um erro. Funciona bem no Safari e Chrome (sem erros no console).

B Seven
fonte
2

O IE7 é muito menos tolerante do que os navegadores mais recentes, especialmente o Chrome. Eu gosto de usar JSLint para encontrar esses bugs. Ele encontrará essas vírgulas colocadas incorretamente, entre outras coisas. Você provavelmente desejará ativar a opção de ignorar espaços em branco inadequados.

Além de vírgulas colocadas indevidamente, neste blog, nos comentários que alguém relatou:

Tenho procurado um erro que dizia apenas "Identificador esperado" apenas no IE (7). Minha pesquisa me levou a esta página. Depois de alguma frustração, descobri que o problema era que eu usava uma palavra reservada como nome de função ("switch"). O erro não foi claro e apontou para o número da linha errado.

Muhd
fonte
1

Este erro ocorre quando adicionamos ou deixamos de remover uma vírgula no final da matriz ou no código de função. É necessário observar todo o código de uma página da web para tal erro.

Eu consegui em um código de aplicativo do Facebook enquanto estava codificando para uma API do 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
fonte
0

Isso me parece um script que foi puxado com src e carregado apenas na metade, causando um erro de sintaxe, se o restante não for carregado.

Roland Bouman
fonte
0

O IE7 tem problemas com matrizes de objetos

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

Outra variação desse bug: eu tinha uma função chamada 'continue' e como é uma palavra reservada, gerou este erro. Tive que renomear minha função 'continueClick'

Kevin Audleman
fonte
0

Talvez você tenha um objeto com um método 'construtor' e tente invocá-lo.

Niels Steenbeek
fonte
0

Você pode encontrar esse problema ao usar o Knockout JS. Se você tentar definir o atributo de classe como o exemplo abaixo, ele falhará:

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

Escape a string de classe assim:

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

Meus 2 centavos.

iDevGeek
fonte
0

Eu também havia me deparado com esse problema. Encontrei abaixo duas soluções. 1). Igual ao mencionado por outros acima, remova a vírgula extra do objeto JSON. 2). Além disso, meu JSP / HTML estava tendo. Por causa disso, ele estava ativando o modo antigo do navegador, que gerava um erro JS para vírgula extra. Quando usado, aciona o modo HTML5 do navegador (se compatível) e funciona bem mesmo com Extra Comma, como qualquer outro navegador FF, Chrome etc.


fonte
1
Bem-vindo ao Stack Overflow! Você pode dar um exemplo do que isso significa: "Meu JSP / HTML estava tendo."
billrichards de
0

Aqui está uma técnica fácil para depurar o problema: echo o script / código para o console. Copie o código do console em seu IDE. A maioria dos IDEs realiza verificação de erros no código e destaca os erros. Você deve conseguir ver o erro quase imediatamente no seu editor de JavaScript / HTML.

Hisenberg
fonte
0

Tive o mesmo problema com uma configuração diferente. Isso estava em uma definição de fábrica angular, mas suponho que poderia acontecer em outro lugar também:

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

A correção é muito exótica:

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

Isso também pode acontecer em Typescript se você chamar uma função no meio do nada dentro de uma classe. Por exemplo

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

Chamadas de função, como console.log()devem estar dentro de funções. Não na área onde você deveria declarar campos de classe.

rayray
fonte
0

Texto datilografado para problema do Windows

Isso funciona no IE, chrome, FF

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

Isso funciona no cromo, FF, não funciona no IE 11

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

Acho que de alguma forma está relacionado às palavras reservadas do Windowsinsira a descrição da imagem aqui

Lev Savranskiy
fonte
0

Eu me deparei com este erro onde, em vez de uma vírgula final ou algo parecido, esta sintaxe foi usada em um constants.js

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

O IE 11 não gostou nada disso.

Conforme mencionado anteriormente, isso foi facilmente corrigido usando

   var titles = {
     'title.X': 'X title',
     'title.Y': 'Y title'   
   }
Kingy
fonte
2
Estas não são expressões equivalentes. O primeiro usa os valores das propriedades title.X e title.Y como chaves no objeto de títulos, o segundo usa as cadeias de caracteres "title.X" e "title.Y" como chaves.
nabrown