1. js エンジンはコードの読み込み時に構文解析を実行します。記述された js が標準化されていない場合、構文解析は失敗します。このときのエラーを構文エラーといいます
2. 構文解析に合格し、js エンジンがコードを実行します。実行中に発生するエラーはランタイム エラーと呼ばれます
エンジンが異なれば、これら 2 つのエラーの処理方法も異なります。次のように:
var p = {name: "Jack", age:33,};//33 の後にカンマがあることに注意してください
p.toString = function() {return "Name: " this.name ", Age: " this.age}; 🎜>console.log( p);
alert(p);//名前: Jack、33 歳
Firefox でテストすると、エンジンは 33 以降のカンマを無視します。文法チェックを通過して実行できるもの テスト期間中にエラーは報告されません
IE6/7でテストした場合、構文解析期間中にエラーが報告され、当然実行期間には入りません。
ただし、この問題は IE8 では修正されており、エラーは報告されません。他のブラウザではエラーは報告されません。
要約すると、このエラーは見つけるのが困難です。多くの場合、誤ってカンマを追加したり、多くの属性を含むオブジェクトまたは配列を定義し、それらの一部を削除して余分なカンマを残したりすることが原因で発生します。
//不規則な書き込み
var p = {name:"Jack",age:33,};
var ary = ["one","two","three",];
//標準的な書き方
var p = {name :"Jack",age:33};
var ary = ["one","two","three"];
さらに、配列リテラル この問題は、配列の最後に余分なカンマがあるようなものです
var ary = [1,2,];
console.log(ary.length);
IE6/7/8 の出力長は 3、 IE9などのブラウザは2. ECMAScript 5 11.1.4 には、最後のカンマを無視する必要があると記載された段落が含まれています。ただし、この仕様は IE9 まで実装されませんでした。他のブラウザは問題ありません。
ECMAScript 5 11.1.4 は次のように記述しました:
要素リスト内のコンマの前に AssignmentExpression (つまり、先頭にカンマがあるか、別のカンマの後にある場合、配列の末尾で要素が省略されている場合、配列要素の欠落は配列の長さに影響し、後続の要素のインデックスが増加します。
かつて誰かが配列のこの機能を利用して、いわゆる「世界一短い IE 判定」
var ie = !-[1,];
alert(ie);
しかし、IE9 では終了してしまいました。このバグをブラウザを判断するために使用しないでください。
JSON
JSON 形式では、コンマは複数の属性キーと値のペア間の区切り文字です。次に例を示します。
var json = { id: 1, name: 'heero' };
しかし、プログラミングする場合、余分な情報を追加するのは簡単です。
最後のキーと値のペア の後にもカンマが追加されます。
var json = { id: 1, name: 'heero', };
この場合、IE6 および 7 ではエラーが報告されますが、IE8 およびその他のブラウザーでは問題ありません。
配列
配列では、コンマは要素間の区切り文字です。例:
var arr = [1, 2, 3];
同様に、
最後の要素 の後にコンマを誤って追加する可能性があります:
var arr = [1, 2, 3,];
直感的には、これは構文が間違っているはずです。しかし実際には、IE6 を含むすべてのブラウザがこの状況と互換性があります。次のサンプル コードを考えてみましょう:
var arr = [1, 2, 3,];<p>for (var i = 0; i <arr.length i><code>var arr = [1, 2, 3,];<br>for (var i = 0; i < arr.length; i ) { alert(arr[i]); }
IE以外のブラウザでは、1、2、3が順に出力されますが、IEブラウザでは、1、2、3、未定義が順に出力されます。明らかに、
IE は余分なカンマの後に未定義要素 を追加します。
余分なコンマが最後ではなく途中にある別のケースを考えてみましょう:
var arr = [1, 2,, 3,];<p>for (var i = 0; i <arr.length i><code>var arr = [1, 2,, 3,];<br>for (var i = 0; i < arr.length; i ) { alert(arr[i]); }
すべてのブラウザは、1、2、未定義、3 を出力します。処理方法は同じであることがわかります。つまり、
は余分なカンマの前に未定義の要素 を挿入します。