Javascriptエラーの考えられるケース:「予期される識別子、文字列、または数値」


84

一部のユーザーは、私のサイトで時折JSエラーを報告しています。エラーメッセージには「予期される識別子、文字列、または番号」と表示され、行番号は423725915です。これは任意の番号であり、これが発生するとレポートごとに変更されます。これは主にIE7 / Mozilla4.0ブラウザで発生します。

コードを何度もスキャンしてjslintを実行しましたが、何も検出されませんでした。このエラーメッセージの原因となる一般的なタイプのJSの問題を知っている人はいますか?


最初に頭に浮かぶのは明らかです。
Anthony Forloney 2010年

最後にぶら下がっているコンマがある配列リテラルでしょうか?(また、「Mozilla4.0」とは何ですか?)
とがった2010年

userAgent文字列と互換性のあるMozilla4.0
psychotik

回答:


147

このタイプのエラーの原因は、多くの場合、オブジェクトまたは配列定義のコンマの置き忘れである可能性があります。

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

ランダムな行に表示される場合は、動的に作成しているオブジェクト定義の一部である可能性があります。


それは行方不明でした; イベントの割り当てで。動的に作成されたオブジェクトを見る手がかりは、これを理解するのに役立ちました。jslintは、これが最初はhtmlページの一部としてインラインjsとして生成されたcozを検出しませんでした。どうも!
psychotik 2010年

2
いいえ、そうではありません。最近のほとんどのブラウザはこれを修正します。IE6 / 7はそうではありません。また、IE7エミュレーションモードでIE8をデバッグしても、これは検出されません。(IE7にはデバッガーがないことをご存知だと思います。IE7でVSを使用してもこれは検出されません)。それを試してから教えてください;)
psychotik 2010年

1
ありがとうございました!どうやらこれはChromeのような他のブラウザでは問題ではありません。
B七つの

5
このようなオカレンスは、正規表現 "、\ s *]"および "、\ s * \}"(引用符なし)を使用して検索できます。私は多くの時間を節約しました。
–GökhanKurt 2016

2
次のような改行のあるJavaScriptの,\s*?\n?\s*?],\s*?\n?\s*?\}
正規表現

84

クラスはInternetExplorerの予約キーワードであるため、Javascript辞書のキーとして単語クラスを使用すると、恐ろしい「予期される識別子、文字列、または数字」エラーが発生する可能性もあります。

悪い

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

良い

{'class': 'overlay'}

予約済みのキーワードをJavascript辞書のキーとして使用する場合は、キーを引用符で囲みます。

このヒントがあなたに地獄のデバッグの日を節約することを願っています。


いいですね、私はこの問題に何時間も苦労しています。今解決しました。
ジョンプラド

必要以上にこのjavascriptライブラリを見つめることから私を救ってくれてありがとう。
ケプリ2012

1
私はうまくいけば、彼らが将来的にエラーのこれらの種類を検出することができるでしょう、JSHintにバグを提出:github.com/jshint/jshint/issues/1000は
トラヴィス

1
@travis彼らは実際に#674の結果としてそれを許可しました:-)
cmbuckley 2013年

3
まったく同じエラーが発生しましたが、プロパティ「import」で発生しました。ここでは「予約語」の完全なリストであるdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
エドガーZagórski

11

実際、最近IEでそのようなものを入手しましたが、これはJavaScript構文の「エラー」に関連していました。IE以外はどこでも問題なかったので、引用符でエラーを言います。これはIE6の下にありました。この問題は、JSONオブジェクトの作成と、次のような余分なコンマに関連していました。

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

IE6は、3の後のコンマが本当に好きではありません。そのような、ちょっとした構文形式の問題を探すかもし​​れません。

ええ、25行のJavaScriptの数百万行の番号も面白いと思いました。

幸運を。


+1これは私を大いに助けました。余分な疑問符は私にとってie8を壊しませんでしたが、ie7を壊しました。
Ivan Durst

9

これは決定的な答えではありません。魅力的だが間違った答えを排除して、他の人が正しい答えに向かって進むのを助けます。

デバッグが問題を浮き彫りにするように見えるかもしれません。ただし、問題が発生するブラウザはIEのみであり、IEでは元のドキュメントの一部であったコードのみをデバッグできます。動的に追加されたコードの場合、デバッガーは現在の命令としてbody要素を表示するだけであり、IEはエラーが膨大な行番号で発生したと主張します。

IEでこの問題を示すサンプルWebページを次に示します。

<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<script>ローカルまたはロードされたリソースとして、タグを介して一時的にJavaScriptをドキュメント自体に配置します。デバッグ。作業中のスクリプトに戻ります。
ErikE 2012年

5

私のアプリケーションの1つでバグを見たばかりですが、キャッチオールとして、キーワードと同じすべての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

このエラーは、配列の最後または関数コードでコンマを追加または削除しなかった場合に発生します。このようなエラーについては、Webページのコード全体を監視する必要があります。

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セント。


0

私もこの問題に遭遇しました。私は以下の2つの解決策を見つけました。1)。上記の他の人が述べたのと同じように、JSONオブジェクトから余分なコンマを削除します。2)。また、私のJSP / HTMLにはがありました。このため、ブラウザの古いモードがトリガーされ、余分なカンマに対してJSエラーが発生していました。使用すると、ブラウザのHTML5モード(サポートされている場合)がトリガーされ、他のブラウザFF、Chromeなどと同じようにExtraCommaでも正常に動作します。


1
Stack Overflowへようこそ!これが何を意味するかの例を挙げていただけますか:「私のJSP / HTMLは持っていました。」
ビルリチャーズ2015

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用のTypescriptの問題

これはIE、クロム、FFで動作します

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

これはChrome、FFで機能し、IE11では機能しません

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

どういうわけかWindowsの予約語に関連していると思いますここに画像の説明を入力してください


0

このエラーは、末尾のコンマなどではなく、constants.jsで使用されていた場合に発生しました。

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

IE11はこれをまったく気に入らなかった。

前述のように、これはを使用して簡単に修正できました

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

2
これらは同等の式ではありません。1つ目はtitle.Xプロパティとtitle.Yプロパティの値をtitlesオブジェクトのキーとして使用し、2つ目は文字列「title.X」と「title.Y」をキーとして使用します。
nabrown
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.