js定義對象或數組直接量時各瀏覽器對多餘逗號的處理(json)

來源:互聯網
上載者:User

1、js引擎在代碼載入時進行文法分析,如果js寫的不規範則文法分析通不過。這時候的錯誤稱為語法錯誤
2、文法分析通過了,js引擎會執行代碼。執行期間發生的錯誤稱為運行錯誤

不同引擎處理這2種錯誤的提示不太一樣。如下:
複製代碼 代碼如下:
var p = {name:"Jack",age:33,};//注意33後有個逗號
p.toString = function() {return "姓名:" +this.name + ",年齡:" + this.age};
console.log(p);
alert(p);//姓名:Jack,年齡33<br>

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 輸出length為3,IE9及其它瀏覽器為2。ECMAScript 5 11.1.4 其中有段說明了應該忽略最後的逗號。但直到IE9才實現該規範。其它瀏覽器則沒問題。

ECMAScript 5 11.1.4 寫道:

Array elements may be elided at the beginning, middle or end of the element list. Whenever a comma in the element list is not preceded by an AssignmentExpression (i.e., a comma at the beginning or after another comma), the missing array element contributes to the length of the Array and increases the index of subsequent elements. Elided array elements are not defined. If an element is elided at the end of an array, that element does not contribute to the length of the Array.

有人曾經利用了數組的這個特性創造出了所謂《全世界最短的IE判斷》
複製代碼 代碼如下:
var ie = !-[1,];
alert(ie);

但在IE9下被終止了。不要利用這個Bug去判斷瀏覽器。

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,];
for (var i = 0; i < arr.length; i++) { alert(arr[i]); }

在IE以外的瀏覽器上,均依次輸出1、2、3;但在IE瀏覽器上,卻是依次輸出1、2、3、undefined。明顯地,IE在那個多餘的逗號後加了一個undefined元素

再考慮另一種情況,多餘的逗號不在末尾,而是在中間:

var arr = [1, 2,, 3,];
for (var i = 0; i < arr.length; i++) { alert(arr[i]); }

所有瀏覽器均輸出1、2、undefined、3,可見處理方式是一樣的,就是在多餘的逗號前插入一個undefined元素

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.