js定義對(duì)象或數(shù)組直接量時(shí)各瀏覽器對(duì)多余逗號(hào)的處理(json)
2、語法分析通過了,js引擎會(huì)執(zhí)行代碼。執(zhí)行期間發(fā)生的錯(cuò)誤稱為運(yùn)行錯(cuò)誤
不同引擎處理這2種錯(cuò)誤的提示不太一樣。如下:
var p = {name:"Jack",age:33,};//注意33后有個(gè)逗號(hào)
p.toString = function() {return "姓名:" +this.name + ",年齡:" + this.age};
console.log(p);
alert(p);//姓名:Jack,年齡33<br>
firefox下測(cè)試,引擎會(huì)忽略33后的逗號(hào),可以通過語法檢查,在執(zhí)行期也不會(huì)報(bào)錯(cuò)
IE6/7下測(cè)試,語法分析期就報(bào)錯(cuò)了,當(dāng)然也不會(huì)進(jìn)入執(zhí)行期了。
不過在IE8下已經(jīng)修復(fù)此問題,不會(huì)報(bào)錯(cuò)了。其它瀏覽器也不會(huì)報(bào)錯(cuò)。
總結(jié)下:此錯(cuò)誤很難發(fā)現(xiàn),經(jīng)常是不小心就加了個(gè)逗號(hào),或者定義了一個(gè)很多屬性的對(duì)象或數(shù)組后來又要?jiǎng)h除其中的某些而不小心留下了多余的逗號(hào)。
//不規(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í)也可能碰到這個(gè)問題,如數(shù)組最后多了個(gè)逗號(hào)
var ary = [1,2,];
console.log(ary.length);
IE6/7/8 輸出length為3,IE9及其它瀏覽器為2。ECMAScript 5 11.1.4 其中有段說明了應(yīng)該忽略最后的逗號(hào)。但直到IE9才實(shí)現(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ù)組的這個(gè)特性創(chuàng)造出了所謂《全世界最短的IE判斷》
var ie = !-[1,];
alert(ie);
但在IE9下被終止了。不要利用這個(gè)Bug去判斷瀏覽器。
JSON
在JSON格式中,逗號(hào)是多個(gè)屬性鍵值對(duì)間的分隔符,例如:
var json = { id: 1, name: 'heero' };
但在編程的時(shí)候,很容易會(huì)畫蛇添足,在最后一對(duì)鍵值對(duì)后也加上了逗號(hào):
var json = { id: 1, name: 'heero', };
在這種情況下,IE6、7會(huì)報(bào)錯(cuò),但I(xiàn)E8以及其他瀏覽器則沒有問題。
數(shù)組
在數(shù)組中,逗號(hào)是元素間的分隔符,例如:
var arr = [1, 2, 3];
同樣地,我們也有可能不小心在最后一個(gè)元素后加了逗號(hào):
var arr = [1, 2, 3,];
憑直覺來說,這應(yīng)該是錯(cuò)誤的語法。但實(shí)際上,所有瀏覽器都對(duì)這種情況實(shí)現(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在那個(gè)多余的逗號(hào)后加了一個(gè)undefined元素。
再考慮另一種情況,多余的逗號(hào)不在末尾,而是在中間:
var arr = [1, 2,, 3,];
for (var i = 0; i < arr.length; i++) { alert(arr[i]); }
所有瀏覽器均輸出1、2、undefined、3,可見處理方式是一樣的,就是在多余的逗號(hào)前插入一個(gè)undefined元素。
相關(guān)文章
使用JS location實(shí)現(xiàn)搜索框歷史記錄功能
這篇文章主要介紹了使用JS location實(shí)現(xiàn)搜索框歷史記錄功能,本文通過實(shí)例 代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12微信小程序使用progress組件實(shí)現(xiàn)顯示進(jìn)度功能【附源碼下載】
這篇文章主要介紹了微信小程序使用progress組件實(shí)現(xiàn)顯示進(jìn)度功能,涉及progress組件相關(guān)屬性設(shè)置操作技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下2017-12-12JavaScript數(shù)組、json對(duì)象、eval()函數(shù)用法實(shí)例分析
這篇文章主要介紹了JavaScript數(shù)組、json對(duì)象、eval()函數(shù)用法,結(jié)合實(shí)例形式分析了JS數(shù)組創(chuàng)建、賦值、連接、翻轉(zhuǎn),json對(duì)象定義、讀取,eval()函數(shù)的功能、使用等,需要的朋友可以參考下2019-02-02Atitit.js的鍵盤按鍵事件捆綁and事件調(diào)度
這篇文章主要介紹了Atitit.js的鍵盤按鍵事件捆綁and事件調(diào)度的相關(guān)資料,需要的朋友可以參考下2016-04-04微信小程序有旋轉(zhuǎn)動(dòng)畫效果的音樂組件實(shí)例代碼
這篇文章主要介紹了微信小程序有旋轉(zhuǎn)動(dòng)畫效果的音樂組件,需要的朋友可以參考下2018-08-08