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

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

(0)

相关推荐

  • js对象转json数组的简单实现案例

    复制代码 代码如下: function obj2Str(obj){ switch(typeof(obj)){ case 'object': var ret = []; if (obj instanceof Array){ for (var i = 0, len = obj.length; i < len; i++){ ret.push(obj2Str(obj[i])); } return '[' + ret.join(',') + ']'; } else if (obj instanceof R

  • jquery遍历筛选数组的几种方法和遍历解析json对象

    jquery grep()筛选遍历数组 复制代码 代码如下: $().ready( function(){ var array = [1,2,3,4,5,6,7,8,9]; var filterarray = $.grep(array,function(value){ return value > 5;//筛选出大于5的 }); for(var i=0;i<filterarray.length;i++){ alert(filterarray[i]); } for (key in filtera

  • jQuery中json对象的复制方式介绍(数组及对象)

    1.jQuery自带的$.map方式 复制代码 代码如下: $.map(json, function (n) { return n; }); 这种方式原来用于复制数组还可以,今天用它复制数组中的某一条记录,发现字段名称丢失了,后来发现了第二种方法. 2.深复制与浅复制 复制代码 代码如下: // 浅层复制(只复制顶层的非 object 元素) var newObject = jQuery.extend({}, oldObject); // 深层复制(一层一层往下复制直到最底层) var newO

  • 以JSON形式将JS中Array对象数组传至后台的方法

    业务是需要将前台jQuery easyUI DataGrid列表中所选的若干行的数据传到后台进行update操作 通常情况下我们会获取所选取行对象的ID,通过循环及简单封装拼凑成一个长String传送过去,并在Service层解释再通过findByID获取实例并update 但今次我们需要将整个对象群完整的传输至后台 其结构如下 选用谷歌的GSON插件及json2.js搭配使用 前台代码如下,简洁起见已去除部分简单验证代码: 复制代码 代码如下: var rows = $('#dg1').dat

  • 使用js声明数组,对象在jsp页面中(获得ajax得到json数据)

    1.在jsp页面的js中可以用jsp标签 var patientInfoList={patientId:"${session.patientId}"};var docDepList=[],noTypeMap=["","普通号","主治医生号","副主任医师号","主任医师号"]; <c:forEach varStatus="idx" var="list

  • 深入理解PHP JSON数组与对象

    在PHP后端和客户端数据交互的过程中,JSON数据中有时格式不定,一会儿是数组,一会儿是对象,弄得客户端开发人员要崩溃的感觉. 因此,前后端相关人员先对PHP的json_encode函数原理有必要的了解是最重要的一个环节. PHP中的array是个万能的数据结构,并不像其它语言根据需要的场景会定义很多约束性的数据类型来描述结构,所以PHP程序员是很难给客户端人员讲清楚返回的是什么结构的数据的. 也就变成明明是通过PHP的数组数据编码成json的,但输出值有时是数组.有时是对象的情况. <?php

  • JSON两种结构之对象和数组的理解

    JSON简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C.C++.C#.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率). Json是一种异常简单易懂的数据格式,关于json的规定,仅仅如下而已: 1)

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

    1.js引擎在代码载入时进行语法分析,如果js写的不规范则语法分析通不过.这时候的错误称为语法错误 2.语法分析通过了,js引擎会执行代码.执行期间发生的错误称为运行错误 不同引擎处理这2种错误的提示不太一样.如下: 复制代码 代码如下: var p = {name:"Jack",age:33,};//注意33后有个逗号 p.toString = function() {return "姓名:" +this.name + ",年龄:" + thi

  • js 定义对象数组(结合)多维数组方法

    在php中定义数组很简单,但是在js中如果搞成字符为下标会出错,所以结合对象来搞 var top_ = { 'index':'首页', 'user':'用户', 'tree':'模块树' } ; var all_list = [ { "index": [ {'name':'网站栏目管理','url':'1.html'}, {'name':'网站栏目管理2','url':'2.html'} ] }, { "user": [ {'name':'用户管理','url':'

  • js获取对象、数组的实际长度,元素实际个数的实现代码

    js获取对象.数组的实际长度,元素实际个数的实现代码 /*获取对象.数组的长度.元素个数 *@param obj 要计算长度的元素,可以为object.array.string */ function count(obj){ var objType = typeof obj; if(objType == "string"){ return obj.length; }else if(objType == "object"){ var objLen = 0; for(v

  • java拼接字符串时去掉最后一个多余逗号的方法

    本文实例讲述了java拼接字符串时去掉最后一个多余逗号的方法.分享给大家供大家参考.具体分析如下: 先看下面这段代码: for (int t = 0; t < memberLen; t++) { memTemp = stafferMap.get(strMember[t]); if(memTemp != null){ memberNames += memTemp + ","; } } 以上的代码,拼接的字符串会多一个",",比如:"str1,str2,

  • js克隆对象、数组的常用方法介绍

    Ext的两种克隆的方法: 可以克隆对象.数据等:var newJson = Ext.clone(json); 只能克隆数组:var newJson = Ext.Array.clone(json); JQuery的方法: 深复制[可以迭代]:var newJson = jQuery.extend(true,{}, json); 浅复制[不能迭代]:var newJson = jQuery.extend({}, json); var newJson = $.map(json,function (n)

  • js定义对象简单学习例子

    无标题页 function student(name,sex,age){ this.name = name; this.sex = sex; this.age = age; this.resume = resume; } function resume(){ return (this.name + this.sex + this.age); } var myStudent = new student("阿会楠","男",22); var resume = myStu

  • JavaScript学习笔记之JS事件对象

    事件对象:当事件发生时,浏览器自动建立该对象,并包含该事件的类型.鼠标坐标等. 事件对象的属性:格式:event.属性. 一些说明: event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等: event对象只在事件发生的过程中才有效. firefox里的event跟IE里的不同,IE里的是全局变量,随时可用:firefox里的要用参数引导才能用,是运行时的临时变量. 在IE/Opera中是window.event,在Firefox中是event: 而事件的对象,在

  • js的对象与函数详解

    一.对象 就是人们要研究的任何事物,不仅能表示具体事物,还能表示抽象的规则,计划或事件.          属性的无序集合,每个属性可以存一个值(原始值,对象,函数) 对象的特性:封装,尽可能的隐藏对象的部分细节,使其受到保护.只保留有限的接口和外部发生联系. js 中{},[] 来定义数组和对象 1.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数. 2.[ ]中括号,表示一个数组,也可以理解为一个数组对象. 3.{ } 和[ ] 一起使用,我们前面说到,{ } 是一

  • javaScript遍历对象和数组的方法总结

    在日常工作过程中,我们对于javaScript遍历对象.数组的操作是十分的频繁的,今天抽空把经常用到的方法小结一下,方便今后参考使用! javaScript遍历对象总结 1.使用Object.keys()遍历 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性). var obj = {'0':'a','1':'b','2':'c'}; Object.keys(obj).forEach(function(key){ console.log(key,obj[key]);

  • Javascript入门学习第四篇 js对象和数组第1/2页

    比较难哦.做好心里准备吧...... 深呼吸... 1 , for  /  in : 一种遍历(枚举)对象属性的方法,可以循环我们呢事先不知道的属性. 它可以枚举处用户定义的所有属性,但却不能枚举出某些预定义的属性和方法. 不能枚举的属性通常是继承的属性 删除一个对象的属性:  delete book.width ; 从对象中移除了属性,在删除之后,用for/in将不会枚举该属性,并且用width in book 也检测不到该属性. for/in 的另一个重要的用途就是跟关联数组一起使用:(如果

随机推荐