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 相关文章推荐
[JS源码]超长文章自动分页(客户端版)
Jan 09 Javascript
js实现网站首页图片滚动显示
Feb 04 Javascript
Javascript call和apply区别及使用方法
Nov 14 Javascript
textarea 控制输入字符字节数(示例代码)
Dec 27 Javascript
javascript事件冒泡实例分析
May 13 Javascript
javascript实现获取服务器时间
May 19 Javascript
Javascript常用小技巧汇总
Jun 24 Javascript
Javascript中内建函数reduce的应用详解
Oct 20 Javascript
获取JavaScript异步函数的返回值
Dec 21 Javascript
详解基于Vue+Koa的pm2配置
Oct 24 Javascript
微信小程序用户信息encryptedData详解
Aug 24 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
Feb 06 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
phpphp图片采集后按原路径保存图片示例
2014/02/18 PHP
PHP中数据库单例模式的实现代码分享
2014/08/21 PHP
php使用session二维数组实例
2014/11/06 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
浅析javascript闭包 实例分析
2010/12/25 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
JS小功能(checkbox实现全选和全取消)实例代码
2013/11/28 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
2014/11/28 Javascript
JavaScript DOM进阶方法
2015/04/13 Javascript
用JavaScript实现对话框的教程
2015/06/04 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
Javascript实现倒计时时差效果
2017/05/18 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
浅谈Angular6的服务和依赖注入
2018/06/27 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
2019/01/18 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
2019/11/01 Javascript
Python与shell的3种交互方式介绍
2015/04/11 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
python获取中文字符串长度的方法
2018/11/14 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
python仿抖音表白神器
2019/04/08 Python
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
自荐信模版
2013/10/24 职场文书
毕业生个人求职的自我评价
2013/10/28 职场文书
学前教育求职自荐信范文
2013/12/25 职场文书
红旗团支部事迹材料
2014/01/27 职场文书
仓库文员岗位职责
2014/04/06 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
维稳承诺书
2015/01/20 职场文书
家访教师心得体会
2016/01/23 职场文书
2016年校园社会综合治理宣传月活动总结
2016/03/16 职场文书
react中props 的使用及进行限制的方法
2021/04/28 Javascript
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python