2008-01-25

小心js中的逗号

关键字: javascript
修改了一些js代码之后,FF正常,IE却报错了:
Expected identified, string or number
根据我上次的经验,应该是有多余的逗号。
于是我在eclipse中用正则表达式 ,\s*} 进行搜索,未找到任何匹配的字符串。
这就奇怪了!
只好另外想辙了,在我的project目录下搜索到今天修改的js文件列表,一共5个,我用肉眼逐一扫描这些js,最后发现问题出在这里:
Ext.MessageBox.show({
   msg: 'Loading data from template...',
   progressText: 'Loading...',
   width:300,
   wait:true,/*
   waitConfig: {interval:500}*/
});
var delegate = doLoad.createDelegate(doLoad, [], true);
templateDataStore.on('load', delegate);
templateDataStore.load({params:[tplId, userinfo.id]});

实际上这和上次的问题是同样类型的,有多余逗号,让IE噎住了,只是我写正则表达式的时候没考虑到这种/*****/的情况,没能把它揪出来。

去掉这个多余的逗号,IE不报错了。
评论
sunjohn 2008-04-07
zhujinju 写道
stworthy 写道
写到前面比较难看了,用比较好的JS编辑器就能自动检查出来了,这个属于普通的语法问题。

我还没找到这种编辑器,能否给推荐一个

Spket IDE 1.6.10 有这个功能,并且其 JavaScript Formatter 可以设置自动除去多余的逗号
rappy 2008-04-07
这都良好帖!!!

这不是误导人要使劲犯错,然后花个一天半天时间用尽各种办法找到错误,
然后再陶醉于找到错误的满足感吗

这种错误完全是粗心导致

实在不敢恭维这帖的评价.
bsdance 2008-04-07
Ext.MessageBox.show({   
   msg: 'Loading data from template...',   
   progressText: 'Loading...',   
   width:300,   
   wait:true,
 /*waitConfig: {interval:500}*/  
});   
var delegate = doLoad.createDelegate(doLoad, [], true);   
templateDataStore.on('load', delegate);   
templateDataStore.load({params:[tplId, userinfo.id]});  
clia 2008-03-05
可以养成这样的习惯:
如果要修改数组,修改之前先把最后一个元素加上逗号,修改完之后再把最后一个元素的逗号去掉。修改时就可以把所有元素一视同仁了。
只要养成了习惯,写出来的代码是最好的,写的过程也会比较爽。
dd-up 2008-02-29
sam.ds.chen 写道
修改了一些js代码之后,FF正常,IE却报错了:
Expected identified, string or number
根据我上次的经验,应该是有多余的逗号。
于是我在eclipse中用正则表达式 ,\s*} 进行搜索,未找到任何匹配的字符串。
这就奇怪了!
只好另外想辙了,在我的project目录下搜索到今天修改的js文件列表,一共5个,我用肉眼逐一扫描这些js,最后发现问题出在这里:
Ext.MessageBox.show({
   msg: 'Loading data from template...',
   progressText: 'Loading...',
   width:300,
   wait:true,/*
   waitConfig: {interval:500}*/
});
var delegate = doLoad.createDelegate(doLoad, [], true);
templateDataStore.on('load', delegate);
templateDataStore.load({params:[tplId, userinfo.id]});

实际上这和上次的问题是同样类型的,有多余逗号,让IE噎住了,只是我写正则表达式的时候没考虑到这种/*****/的情况,没能把它揪出来。

去掉这个多余的逗号,IE不报错了。



怪楼主注释的地方不对.
dd-up 2008-02-29
finaland 写道
我一般这么处理:
在创建一个对象的时候,首先为他设置定义开始定义结束标志位属性,然后在开始标志位结束标志位之间创建对象的实际属性

比如:

Ext.MessageBox.show({
___BOODEF:"Begin of object define", // 标志位:对象定义开始

// 实际属性,开始
msg: 'Loading data from template...',
progressText: 'Loading...',
width:300,
wait:true,
// 实际属性,结束

/* 这是注释掉的属性
waitConfig: {interval:500},*/

___EOODEF:"End of object define" // 标志位:对象定义结束
});

这种做法的主要问题如下:
1、标志属性名不能和实际属性名重复,而对象的实际属性名无法预知
所以要使用那些实际属性不太可能使用的名字,比如上例中的
___BOODEF = begin of object define
___EOODEF = end of object define

或者短点的:
___B__O___:"begin of it"
___E__O___:"end of it"

或者你和我一样自恋的话,可以用自己的名字:
___FINALNAD_B__:"finaland's object def begin"
___FINALAND_E__:"finaland's object def end"

2、如果你使用 for(i in obj) 的方法循环遍历当前 obj 的所有属性,除了实际属性之外,你会得到多余的标志位属性

3、对象定义写起来比较麻烦,刚开始异常痛苦,后来我用女朋友的名字作为标志位名,就好多了


天,又有一种写法了。

为什么不:
___FINALNAD_B__: null,
___FINALAND_E__: null
dd-up 2008-02-29
myy 写道
养成下面这样写的习惯:

Ext.MessageBox.show({
    msg: 'Loading data from template...'
   ,progressText: 'Loading...'
   ,width:300
   ,wait:true
   ,waitConfig: {interval:500}
});
....




我禁不住要回贴:
Ext.MessageBox.show({
    msg: 'Loading data from template...'
   ,progressText: 'Loading...'
   ,width:300
   ,wait:true
   ,waitConfig: {interval:500}
});
....



奇,第一次看见这样写的。
fyting 2008-02-20
hax 写道
对了,我还有一招。

比之把逗号写到前面,我更愿意加上一个特别的结尾,例如:

myObj = {
...,
...,
...,
...,
$:0
}

大家在这里可以发挥想象。例如写上当前时间:
01:43
也可以写个有趣的数字:
12:88
也可以画个脸型(横过来看)
face:-0
也可以写你的独特签名
PI:3.1415926535
……


myObj = {
    name:"abc",
    冏:"rz",
    haha:-0
}
liudaoru 2008-02-20
实际上是对象直接量的问题。IE和FF对{a:a,}的处理不一样,IE当成错误,而FF做了容错性处理,最好的是最后不要有","
让你笑了 2008-02-20
我也局的myy的写法不错,现在也这么写...

注释一行的时候很方便

像这样的逗号错误...不管怎么谢..检测起来都不好找的...
finaland 2008-02-18
我一般这么处理:
在创建一个对象的时候,首先为他设置定义开始定义结束标志位属性,然后在开始标志位结束标志位之间创建对象的实际属性

比如:

Ext.MessageBox.show({
___BOODEF:"Begin of object define", // 标志位:对象定义开始

// 实际属性,开始
msg: 'Loading data from template...',
progressText: 'Loading...',
width:300,
wait:true,
// 实际属性,结束

/* 这是注释掉的属性
waitConfig: {interval:500},*/

___EOODEF:"End of object define" // 标志位:对象定义结束
});

这种做法的主要问题如下:
1、标志属性名不能和实际属性名重复,而对象的实际属性名无法预知
所以要使用那些实际属性不太可能使用的名字,比如上例中的
___BOODEF = begin of object define
___EOODEF = end of object define

或者短点的:
___B__O___:"begin of it"
___E__O___:"end of it"

或者你和我一样自恋的话,可以用自己的名字:
___FINALNAD_B__:"finaland's object def begin"
___FINALAND_E__:"finaland's object def end"

2、如果你使用 for(i in obj) 的方法循环遍历当前 obj 的所有属性,除了实际属性之外,你会得到多余的标志位属性

3、对象定义写起来比较麻烦,刚开始异常痛苦,后来我用女朋友的名字作为标志位名,就好多了
kevin_liu 2008-02-04
我也碰到了这个问题,看起来是一个事故多发地~~
gavinju 2008-02-03
这样写程序的可读性不强。
---个人观点
zjumty 2008-02-02
beckrabbit 写道
初写JS都会遇到的问题,我只想说IE太恶心了,连多个逗号都不让过。

IE的恶心不是在于不放过逗号, 而是他只告诉你错了, 但不告诉你错在哪里!
cayenne 2008-02-02
个人感觉myy的写法比较好
afcn0 2008-02-02
ie数组多,是可以的,只不过length会错误变化而已
zhujinju 2008-02-02
[quote="ajaxgo"][quote="zhujinju我用的就是这个,没有提示出来对于的逗号.
语法要求的也不是非常严格.
aptana 本身就是 提示 要 火狐的 fireBug 一块 用的[/quote]


aptana怎么可能没有逗号提示,看看我的图片~~~
aptana用ff,只是可以能用ff来帮助aptana进行调试,我从来不这样去配合调试,都是单独在ff中调试[/quote]

aptana 对数组的 最后一个逗号检查不严格
比如 [1,2,3,] 在火狐里不出错,在IE 里不行
在aptana 中也不提示错误
jive 2008-02-01
aptana的确可以提示这种错误,那样找太麻烦啦。。。
ajaxgo 2008-01-31
[quote="zhujinju我用的就是这个,没有提示出来对于的逗号.
语法要求的也不是非常严格.
aptana 本身就是 提示 要 火狐的 fireBug 一块 用的[/quote]


aptana怎么可能没有逗号提示,看看我的图片~~~
aptana用ff,只是可以能用ff来帮助aptana进行调试,我从来不这样去配合调试,都是单独在ff中调试
purpen 2008-01-30
早已发现了.
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

您还没有登录,请登录后发表评论

sam.ds.chen
搜索本博客
博客分类
我的相册
04352697-7823-382a-9592-e177ec21889b-thumb
MyDesktop.zh
共 17 张
最近加入圈子
存档
最新评论