最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2011年03月05日 13:46:29   作者:  
定義對象或數(shù)組直接量時不同瀏覽器引擎對多余逗號的處理,js報錯分為兩種:語法錯誤和運行錯誤。
1、js引擎在代碼載入時進行語法分析,如果js寫的不規(guī)范則語法分析通不過。這時候的錯誤稱為語法錯誤
2、語法分析通過了,js引擎會執(zhí)行代碼。執(zhí)行期間發(fā)生的錯誤稱為運行錯誤

不同引擎處理這2種錯誤的提示不太一樣。如下:
復(fù)制代碼 代碼如下:

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后的逗號,可以通過語法檢查,在執(zhí)行期也不會報錯
IE6/7下測試,語法分析期就報錯了,當(dāng)然也不會進入執(zhí)行期了。
不過在IE8下已經(jīng)修復(fù)此問題,不會報錯了。其它瀏覽器也不會報錯。

總結(jié)下:此錯誤很難發(fā)現(xiàn),經(jīng)常是不小心就加了個逗號,或者定義了一個很多屬性的對象或數(shù)組后來又要刪除其中的某些而不小心留下了多余的逗號。
復(fù)制代碼 代碼如下:

//不規(guī)范的寫法
var p = {name:"Jack",age:33,};
var ary = ["one","two","three",];
//規(guī)范的寫法
var p = {name:"Jack",age:33};
var ary = ["one","two","three"];

此外,定義數(shù)組直接量時也可能碰到這個問題,如數(shù)組最后多了個逗號
復(fù)制代碼 代碼如下:

var ary = [1,2,];
console.log(ary.length);

IE6/7/8 輸出length為3,IE9及其它瀏覽器為2。ECMAScript 5 11.1.4 其中有段說明了應(yīng)該忽略最后的逗號。但直到IE9才實現(xiàn)該規(guī)范。其它瀏覽器則沒問題。

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.

有人曾經(jīng)利用了數(shù)組的這個特性創(chuàng)造出了所謂《全世界最短的IE判斷》
復(fù)制代碼 代碼如下:

var ie = !-[1,];
alert(ie);

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

JSON

在JSON格式中,逗號是多個屬性鍵值對間的分隔符,例如:

var json = { id: 1, name: 'heero' };

但在編程的時候,很容易會畫蛇添足,在最后一對鍵值對后也加上了逗號

var json = { id: 1, name: 'heero', };

在這種情況下,IE6、7會報錯,但IE8以及其他瀏覽器則沒有問題。

數(shù)組

在數(shù)組中,逗號是元素間的分隔符,例如:

var arr = [1, 2, 3];

同樣地,我們也有可能不小心在最后一個元素后加了逗號

var arr = [1, 2, 3,];

憑直覺來說,這應(yīng)該是錯誤的語法。但實際上,所有瀏覽器都對這種情況實現(xiàn)了兼容,包括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元素。

相關(guān)文章

最新評論

和林格尔县| 兴国县| 中宁县| 黄山市| 蕉岭县| 格尔木市| 永善县| 双辽市| 文安县| 虎林市| 鱼台县| 安龙县| 和顺县| 板桥市| 台北市| 合山市| 六枝特区| 嵩明县| 中江县| 惠东县| 抚州市| 青铜峡市| 靖宇县| 临高县| 阿克陶县| 和政县| 五指山市| 九台市| 稻城县| 永登县| 越西县| 林周县| 铁岭县| 厦门市| 黄冈市| 浑源县| 宣城市| 南江县| 柞水县| 呈贡县| 封开县|