Можливі випадки помилки Javascript: "Очікуваний ідентифікатор, рядок або номер"


84

Деякі користувачі повідомляють про випадкові помилки JS на моєму сайті. У повідомленні про помилку написано "Очікуваний ідентифікатор, рядок або число", а номер рядка - 423725915, що є лише довільним числом і змінюється для кожного звіту, коли це відбувається. В основному це відбувається з браузерами IE7 / Mozilla 4.0.

Я сканував свій код купу разів і запустив jslint, але він нічого не підібрав - хтось знає про загальний тип проблем JS, що призводять до цього повідомлення про помилку?


Перше, що спадає на думку - це очевидне.
Ентоні Форлоні

Чи може це бути літерал масиву, у якого в кінці є звисаюча кома? (Крім того, що таке "Mozilla 4.0"?)
Точний

Mozilla 4.0 сумісна в рядку userAgent
psychotik

Відповіді:


147

Причиною помилок цього типу часто може бути неправильна кома у визначенні об'єкта або масиву:

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

Якщо воно з’являється у випадковому рядку, можливо, це частина визначення об’єкта, яке ви створюєте динамічно.


це був зниклий; у призначенні події. Підказка на динамічно створені об'єкти допомогла це зрозуміти. jslint не знайшов цього спочатку, оскільки його було створено як вбудований js як частину HTML-сторінки. Дякую!
psychotik

2
Ні, не було б. Більшість сучасних браузерів виправляють це за вас. IE6 / 7 ні. І налагодження IE8 в режимі емуляції IE7 цього не вловлює. (Я здогадуюсь, ви знаєте, що IE7 не має налагоджувача - використання VS з IE7 цього теж не вловлює). Спробуй, а потім скажи мені;)
psychotik

1
Дякую! Очевидно, це не проблема в інших браузерах, таких як Chrome.
B Сім,

5
Ви можете шукати такі випадки, використовуючи регулярні вирази ", \ s *]" та ", \ s * \}" (без лапок). Мені заощадило багато часу.
Gökhan Kurt

2
Правильний вираз для javascript з такими розривами рядків: ,\s*?\n?\s*?]і,\s*?\n?\s*?\}
hayatbiralem

84

Використання класу слова як ключа в словнику Javascript може також викликати страшну помилку "Очікуваний ідентифікатор, рядок або число", оскільки клас є зарезервованим ключовим словом в Internet Explorer.

БАД

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

ДОБРО

{'class': 'overlay'}

Використовуючи зарезервоване ключове слово як ключ у словнику Javascript, додайте ключ у лапки.

Сподіваюся, ця підказка заощадить вам день налагодження пекла.


Хороший, я борюся з цією проблемою годинами. Вирішено зараз.
Джон Прадо,

Дякую, шановний сер, що врятував мене від того, щоб дивитись на цю бібліотеку javascript довше, ніж було потрібно.
Khepri

1
Я відправив повідомлення про помилку в JSHint, сподіваюся , вони будуть в змозі виявити ці види помилок в майбутньому: github.com/jshint/jshint/issues/1000
Тревіс

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 теж було цікавим.

Удачі.


+1 Це мені дуже допомогло. Додатковий знак запитання для мене не зламав ie8, але зрушив ie7.
Іван Дурст

9

Це остаточна невідповідь: усунення спокусливої, але неправильної відповіді, щоб допомогти іншим перейти до правильних відповідей.

Може здатися, що налагодження висвітлить проблему. Однак єдиним браузером, в якому виникає проблема, є IE, і в IE ви можете налагодити лише той код, який був частиною оригінального документа. Для динамічно доданого коду налагоджувач просто показує елемент body як поточну інструкцію, і 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){...}що спричиняло помилку, оскільки delete - це ключове слово. stackoverflow.com/questions/26255 / ...
Snekse


2

Як зазначалося раніше, наявність додаткової коми ставила помилку.

Також в IE 7.0 відсутність крапки з комою в кінці рядка спричинила помилку. Він чудово працює в Safari та Chrome (без помилок у консолі).


2

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

Окрім неправильно розставлених коми, у цьому блозі в коментарях хтось повідомив:

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


1

Видаліть непотрібне, увійдіть у функцію. ви отримаєте рішення.

Зверніться до цього

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


Ви вирішили правильно, я підтримав вас, щоб ви виключили -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

Ще одна варіація цієї помилки: у мене була функція під назвою 'продовжити', і оскільки це зарезервоване слово, вона викинула цю помилку. Мені довелося перейменувати свою функцію 'continueClick'



0

Ця проблема може виникнути під час використання Knockout JS. Якщо ви спробуєте встановити атрибут class, як у прикладі нижче, він не вдасться:

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

Уникніть рядка класу таким чином:

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

Мої 2 центи.


0

Я теж стикався з цим питанням. Я знайшов нижче два рішення. 1). Як і згадано іншими вище, видаліть зайві коми з об’єкта JSON. 2). Крім того, мій JSP / HTML був. Через це він запускав старий режим браузера, який видавав помилку JS для додаткової коми. При використанні він запускає режим HTML5 браузера (якщо підтримується), і він прекрасно працює навіть з Extra Comma, як і будь-які інші браузери FF, Chrome тощо.


1
Ласкаво просимо до Stack Overflow! Чи можете ви навести приклад того, що це означає: "Мій JSP / HTML був".
billrichards

0

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


0

Була та сама проблема з іншою конфігурацією. Це було в кутовому заводському визначенні, але я припускаю, що це може трапитися і в іншому місці:

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
        } 
    }
});

0

Це також може статися в Typescript, якщо ви викликаєте функцію посеред нічого в класі. Наприклад

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

Виклики функцій, як-от console.log()повинні бути всередині функцій. Не в тій області, де ви повинні оголошувати поля класів.


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'   
   }

2
Це не еквівалентні вирази. Перший використовує значення властивостей title.X та title.Y як ключі в об’єкті title, другий використовує рядки „title.X” та „title.Y” як ключі.
темно-коричневий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.