Возможные случаи ошибки Javascript: «Ожидаемый идентификатор, строка или число»

87

Некоторые пользователи сообщают о случайных ошибках JS на моем сайте. В сообщении об ошибке написано «Ожидаемый идентификатор, строка или номер», а номер строки - 423725915, который является произвольным числом и изменяется для каждого отчета, когда это происходит. В основном это происходит с браузерами IE7 / Mozilla 4.0.

Я просканировал свой код несколько раз и запустил jslint, но он ничего не обнаружил - кто-нибудь знает общий тип проблем JS, которые приводят к этому сообщению об ошибке?

психотик
источник
Первое, что приходит в голову, - очевидное.
Энтони Форлони
Может быть, это литерал массива с запятой в конце? (Кроме того, что такое «Mozilla 4.0»?)
Пойнти,
Совместимость с Mozilla 4.0 в строке userAgent
psychotik

Ответы:

150

Причиной этого типа ошибки часто может быть неуместная запятая в определении объекта или массива:

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

Если он появляется в случайной строке, возможно, это часть определения объекта, который вы создаете динамически.

амеркадер
источник
это отсутствовало; в назначении события. Это помогло понять, как взглянуть на динамически создаваемые объекты. jslint не нашел этого изначально, потому что он был сгенерирован как встроенный js как часть html-страницы. Спасибо!
psychotik
2
Нет, не будет. Большинство современных браузеров исправят это за вас. IE6 / 7 - нет. И отладка IE8 в режиме эмуляции IE7 этого не улавливает. (Я предполагаю, что вы знаете, что в IE7 нет отладчика - использование VS с IE7 также не обнаруживает этого). Попробуй, а потом расскажи;)
psychotik
1
Спасибо! Судя по всему, это не проблема в других браузерах, например Chrome.
B Seven
5
Вы можете искать такие вхождения с помощью регулярных выражений ", \ s *]" и ", \ s * \}" (без кавычек). Сэкономил мне много времени.
Gökhan Kurt
2
,\s*?\n?\s*?],\s*?\n?\s*?\}
Регулярное выражение
84

Использование слова class в качестве ключа в словаре Javascript также может вызвать ужасную ошибку «Ожидаемый идентификатор, строка или число», поскольку класс - это зарезервированное ключевое слово в Internet Explorer.

ПЛОХО

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

ХОРОШО

{'class': 'overlay'}

При использовании зарезервированного ключевого слова в качестве ключа в словаре Javascript заключите ключ в кавычки.

Надеюсь, эта подсказка сэкономит вам день адской отладки.

Рой Хёнджин Хан
источник
Хороший, я часами борюсь с этой проблемой. Решено сейчас.
Джон Прадо
Спасибо, сэр, за то, что избавили меня от необходимости смотреть на эту библиотеку javascript дольше, чем это необходимо.
Хепри
1
Я отправил ошибку в JSHint, надеюсь, они смогут обнаруживать подобные ошибки в будущем: github.com/jshint/jshint/issues/1000
travis
1
@travis Они фактически разрешили это в результате # 674 :-)
cmbuckley
3
У меня была точно такая же ошибка, но на свойстве «импорт». Вот полный список «Зарезервированных слов» developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Эдгар Загурски
11

На самом деле я недавно получил нечто подобное в IE, и это было связано с синтаксическими «ошибками» JavaScript. Я говорю об ошибке в кавычках, потому что это было нормально везде, кроме IE. Это было под IE6. Проблема была связана с созданием объекта JSON и дополнительной запятой, например

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

IE6 действительно не любит эту запятую после 3. Вы можете поискать что-то в этом роде, небольшие проблемы с синтаксической формальностью.

Да, мне показалось, что многомиллионный номер строки в моем 25-строчном JavaScript тоже был интересным.

Удачи.

cjstehno
источник
+1 Это мне очень помогло. Дополнительный знак вопроса не сломал IE8 для меня, но сломал ie7.
Иван Дерст
9

Это окончательный отказ от ответа: устранение заманчивого, но неправильного ответа, чтобы помочь другим перейти к правильным ответам.

Может показаться, что отладка высветит проблему. Однако проблема возникает только в браузере IE, а в IE можно отлаживать только код, который был частью исходного документа. Для динамически добавляемого кода отладчик просто показывает элемент тела как текущую инструкцию, а IE утверждает, что ошибка произошла на огромном номере строки.

Вот образец веб-страницы, демонстрирующий эту проблему в 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>

Это привело к следующей ошибке:

Line: 54654408
Error: Object required
Эрике
источник
@Protectorone Временно поместите javascript в сам документ через <script>тег, локальный или как загруженный ресурс. Отлаживать. Вернитесь к своему рабочему сценарию.
ErikE
5

Только что увидел ошибку в одном из моих приложений, в качестве универсального, не забудьте указать имена всех свойств javascript, которые совпадают с ключевым словом.

Обнаружил эту ошибку после исправления ошибки, когда объект, например:

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

сгенерировал ошибку (класс и функция являются ключевыми словами) это было исправлено добавлением кавычек

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

Я надеюсь сэкономить тебе время

Хосуэ Александр Ибарра
источник
Я столкнулся с той же проблемой. В моем коде использовалось что-то вроде того, if(_features.delete){...}что вызывало ошибку, потому что удаление - это ключевое слово. stackoverflow.com/questions/26255/…
Snekse 07
2

Как отмечалось ранее, наличие лишней запятой приводило к ошибке.

Также в IE 7.0 отсутствие точки с запятой в конце строки вызывало ошибку. Он отлично работает в Safari и Chrome (без ошибок в консоли).

B Семь
источник
2

IE7 гораздо менее снисходителен, чем новые браузеры, особенно Chrome. Мне нравится использовать JSLint для поиска этих ошибок. Среди прочего он найдет эти неправильно поставленные запятые. Вы, вероятно, захотите активировать опцию игнорирования неправильных пробелов.

Помимо неправильно поставленных запятых, в этом блоге в комментариях кто-то сообщил:

Я выслеживал ошибку, в которой говорилось только «Ожидаемый идентификатор» только в IE (7). Мои исследования привели меня на эту страницу. После некоторого разочарования выяснилось, что проблема в том, что я использовал зарезервированное слово в качестве имени функции («переключатель»). Ошибка была непонятна и указывала на неправильный номер строки.

Мухд
источник
1

Удалите ненужное, войдите в функцию. вы получите решение.

Обратитесь к этому

http://blog.favrik.com/2007/11/29/ie7-error-expected-identifier-string-or-number/

king4test
источник
Ваше решение правильное, я проголосовал за вас, чтобы исключить -1 голос против. Не уверен, почему кто-то проголосовал против правильного ответа.
akousmata
1

Эта ошибка возникает, когда мы добавили или пропустили удаление запятой в конце массива или в коде функции. На наличие такой ошибки необходимо наблюдать весь код веб-страницы.

Я получил его в коде приложения Facebook, когда писал код для 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>
Тусиф Джамадар
источник
0

Для меня это звучит как сценарий, который был загружен с помощью src и загружен только наполовину, что вызывает синтаксическую ошибку, поскольку остаток не загружен.

Роланд Боуман
источник
0

IE7 имеет проблемы с массивами объектов

columns: [
{
  field: "id",
  header: "ID"
},
{
  field: "name",
  header: "Name" , /* this comma was the problem*/ 
},
...
Стефан Мичев
источник
0

Другой вариант этой ошибки: у меня была функция с именем «continue», и, поскольку это зарезервированное слово, она выдавала эту ошибку. Мне пришлось переименовать свою функцию в continueClick

Кевин Одлеман
источник
0

Возможно, у вас есть объект, имеющий метод «конструктор», и вы пытаетесь его вызвать.

Нильс Стенбек
источник
0

Вы можете столкнуться с этой проблемой при использовании Knockout JS. Если вы попытаетесь установить атрибут класса, как в примере ниже, это не удастся:

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

Экранируйте строку класса следующим образом:

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

Мои 2 цента.

iDevGeek
источник
0

Я тоже столкнулся с этой проблемой. Я нашел ниже два решения. 1). Как уже упоминалось выше, удалите лишнюю запятую из объекта JSON. 2). Кроме того, мой JSP / HTML имел. Из-за этого он запускал старый режим браузера, который выдавал ошибку JS для дополнительной запятой. При использовании он запускает режим HTML5 браузера (если поддерживается) и отлично работает даже с дополнительной запятой, как и любые другие браузеры FF, Chrome и т. Д.


источник
1
Добро пожаловать в Stack Overflow! Можете ли вы привести пример того, что это означает: «Мой JSP / HTML был».
Billrichards 05
0

Вот простой метод отладки проблемы: выведите скрипт / код на консоль. Скопируйте код из консоли в свою IDE. Большинство IDE выполняют проверку ошибок в коде и выделяют ошибки. Вы должны почти сразу увидеть ошибку в редакторе JavaScript / HTML.

Hisenberg
источник
0

Была такая же проблема с другой конфигурацией. Это было в определении фабрики angular, но я предполагаю, что это могло произойти и в другом месте:

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

Фикс очень экзотический:

angular.module("myModule").factory("myFactory", function(){
    return { // <--- notice the absence of the return line
        myMethod : function()
        {
            // method definition
        } 
    }
});
wiwi
источник
0

Это также может произойти в Typescript, если вы вызываете функцию из ниоткуда внутри класса. Например

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

Вызовы функций, например, console.log()должны быть внутри функций. Не в той области, где вы должны объявлять поля класса.

Rayray
источник
0

Машинопись для выпуска Windows

Это работает в IE, chrome, FF

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

Это работает в Chrome, FF, не работает в IE 11

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

Я думаю, это как-то связано с зарезервированными словами Windowsвведите описание изображения здесь

Лев Савранский
источник
0

Я столкнулся с этой ошибкой, когда вместо конечной запятой или чего-то подобного этот синтаксис использовался в constants.js

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

IE 11 это совсем не понравилось.

Как упоминалось ранее, это легко исправить с помощью

   var titles = {
     'title.X': 'X title',
     'title.Y': 'Y title'   
   }
Kingy
источник
2
Это не эквивалентные выражения. Первый использует значения свойств title.X и title.Y как ключи в объекте заголовков, второй использует строки «title.X» и «title.Y» как ключи.
nabrown