js定义对象或数组直接量时各浏览器对多余逗号的处理(json)


Posted in Javascript onMarch 05, 2011

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元素

Javascript 相关文章推荐
jquery中加载图片自适应大小主要实现代码
Aug 23 Javascript
js利用prototype调用Array的slice方法示例
Jun 09 Javascript
实例代码详解javascript实现窗口抖动及qq窗口抖动
Jan 04 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
May 05 Javascript
微信小程序 网络请求(GET请求)详解
Nov 16 Javascript
JS随机排序数组实现方法分析
Oct 11 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
Nov 22 Javascript
vue中路由验证和相应拦截的使用详解
Dec 13 Javascript
jQuery实现的点击图片居中放大缩小功能示例
Jan 16 jQuery
vue-router二级导航切换路由及高亮显示的实现方法
Jul 10 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
Oct 31 Javascript
JavaScript监听一个DOM元素大小变化
Apr 26 Javascript
判断用户是否在线的代码
Mar 05 #Javascript
判断用户的在线状态 onbeforeunload事件
Mar 05 #Javascript
在多个页面使用同一个HTML片段《续》
Mar 04 #Javascript
在多个页面使用同一个HTML片段的代码
Mar 04 #Javascript
如何确保JavaScript的执行顺序 之实战篇
Mar 03 #Javascript
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
Mar 03 #Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
Mar 03 #Javascript
You might like
非常好的php目录导航文件代码
2006/10/09 PHP
php下统计用户在线时间的一种尝试
2010/08/26 PHP
PHP使用range协议实现输出文件断点续传代码实例
2014/07/04 PHP
php使用fputcsv()函数csv文件读写数据的方法
2015/01/06 PHP
微信支付开发维权通知实例
2016/07/12 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
URL编码转换,escape() encodeURI() encodeURIComponent()
2006/12/27 Javascript
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
javascript事件处理模型实例说明
2016/05/31 Javascript
浅谈js内置对象Math的属性和方法(推荐)
2016/09/19 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
JavaScript 中 apply 、call 的详解
2017/03/21 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
js使用swiper实现层叠轮播效果实例代码
2018/12/12 Javascript
ES6入门教程之let、const的使用方法
2019/04/13 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
Python常用的日期时间处理方法示例
2015/02/08 Python
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
2020/09/01 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
2020/11/19 Python
python 实现控制鼠标键盘
2020/11/27 Python
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
淘宝网店营销策划书
2014/01/11 职场文书
中学劳技课教师的自我评价
2014/02/05 职场文书
孝敬父母的活动方案
2014/08/28 职场文书
英文慰问信范文
2015/03/24 职场文书
小学美术教学反思
2016/02/17 职场文书
关于MySQL临时表为什么可以重名的问题
2022/03/22 MySQL