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 Tips(3) 关于$()包装集内元素的改变
Dec 14 Javascript
原生js实现shift/ctrl/alt按键的获取
Apr 08 Javascript
javascript解决innerText浏览器兼容问题思路代码
May 17 Javascript
javascript 表格内容排序 简单操作示例代码
Jan 03 Javascript
在myeclipse中如何加入jquery代码提示功能
Jun 03 Javascript
javascript html5实现表单验证
Mar 01 Javascript
Web程序员必备的7个JavaScript函数
Jun 14 Javascript
vue2.0 自定义 饼状图 (Echarts)组件的方法
Mar 02 Javascript
对vue下点击事件传参和不传参的区别详解
Sep 15 Javascript
详解vue2.0 资源文件assets和static的区别
Nov 27 Javascript
vue实现滑动超出指定距离回顶部功能
Jul 31 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
Jun 02 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运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
PHP二维数组的去重问题解析
2011/07/17 PHP
codeigniter中view通过循环显示数组数据的方法
2015/03/20 PHP
PHP convert_uudecode()函数讲解
2019/02/14 PHP
asp.net中System.Timers.Timer的使用方法
2013/03/20 Javascript
用jquery统计子菜单的条数示例代码
2013/10/18 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
JavaScript中常见的八个陷阱总结
2017/06/28 Javascript
详解Vue结合后台的列表增删改案例
2018/08/21 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
2018/09/03 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
微信小程序实现点击图片放大预览
2019/10/21 Javascript
js实现贪吃蛇游戏(简易版)
2020/09/29 Javascript
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
[41:56]Spirit vs Liquid Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
浅析python redis的连接及相关操作
2019/11/07 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
TripAdvisor斯洛伐克:阅读评论、比较价格和酒店预订
2018/04/25 全球购物
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
可口可乐唇膏:Lip Smackers
2019/08/27 全球购物
美国健康和保健平台:healtop
2020/07/02 全球购物
SQL Server的固定数据库角色都有哪些?对应的服务器权限有哪些?
2013/05/18 面试题
大学军训感想
2014/02/12 职场文书
暑期社会实践先进个人主要事迹
2014/05/22 职场文书
岗位职责说明书模板
2014/07/30 职场文书
镇党政领导班子民主生活会思想汇报
2014/10/11 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
2014年教研工作总结
2014/12/06 职场文书
统计员岗位职责范本
2015/04/14 职场文书
2016年少先队活动总结
2016/04/06 职场文书
承诺书的签字人,需不需要承担相应的责任?
2019/07/09 职场文书
Python图像处理库PIL详细使用说明
2022/04/06 Python
Python各协议下socket黏包问题原理
2022/04/12 Python