`
zhouyrt
  • 浏览: 1127876 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

定义对象或数组直接量时不同引擎对多余逗号的处理

阅读更多

这种错误已经我已经多次犯了,一次用Ext做abcc的demo,一次是abcc查询模块。

js报错分为两种:语法错误和运行错误

 

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

 

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.
 

 

 

 

分享到:
评论

相关推荐

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

    定义对象或数组直接量时不同浏览器引擎对多余逗号的处理,js报错分为两种:语法错误和运行错误。

    springmybatis

    MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...

    你必须知道的495个C语言问题

    1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 声明问题 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 *1.26 main的正确定义是什么...

    《你必须知道的495个C语言问题》

    1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 13 声明问题 14 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 14 *1.26 main的正确...

    C语言FAQ 常见问题列表

    o 7.18 当数组是函数的参数时, 为什么 sizeof 不能正确报告数组的大小 ? * 8. 内存分配 o 8.1 为什么这段代码不行?char *answer; printf("Type something:\n"); gets(answer); printf("You typed \"%s\"\n", ...

    上海电机学院C语言实训答案

    ③ 用函数( void sort (int a[ ] )对4个元素的数组a排序(升序或降序都可以); ④ 由输入整数分解排序后的数组得到最大值和最小值: int getmaxn(int a[ ]) 返回值为最大值 int getminn(int b[ ]) 返回值为最小值 ...

    js-basics-exercises:关于JavaScript基础的练习

    将课程名称定义为以逗号分隔的列表例如:“ Web应用程序I,计算机体系结构,数据科学和数据库技术,计算机网络技术和服务,信息系统安全性,软件工程,系统和设备编程” 创建一个包含名称的数组,每个数组位置一个...

    你必须知道的495个C语言问题(PDF)

    2.5 在C 中是否有模拟继承等面向对象程序设计特性的好方法? . . . 7 i 目录ii 2.6 我遇到这样声明结构的代码: struct name f int namelen; char namestr[1];g; 然后又使用一些内存分配技巧使namestr 数组用起 来...

    freemarker总结

    JAVA模版引擎Freemarker常用标签(一) 1. if指令 这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: <#if condition>... <#elseif condition>... <#elseif condition>......

    基于j2ee的ajax宝典

    3.11.2 使用Object直接创建对象·············· 115 3.11.3 使用JSON语法创建对象·············· 118 3.12 小结······· 119 第4章 XML详解······ 120 4.1 XML概述····...

    ExtAspNet_v2.3.2_dll

    -修正Tree控件的一个BUG(定义Mappings属性时)。 +PageManager.Instance应该存在于HttpContext.Current,而不是一个全局变量。 -这个BUG导致Asp.net compatibility中的示例无法完成,现在已经修正。 +去除...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -修正Tree控件的一个BUG(定义Mappings属性时)。 +PageManager.Instance应该存在于HttpContext.Current,而不是一个全局变量。 -这个BUG导致Asp.net compatibility中的示例无法完成,现在已经修正。 +去除...

Global site tag (gtag.js) - Google Analytics