Do write portable code

September 4, 2007 – 1:50 pm

最近遇到两个 bug ,都是因为代码写得不具有可移植性而造成的。Javascript 本身就由于浏览器的差异有许多需要注意的地方,写代码的时候一定要万分小心,多多测试。

数组常量值末尾多余的逗号

Javascript 里面用类似 [1,2,3] 的方法来初始化数组是众所周知的。但是有一个地方却比较容易犯错误。特别是对于熟悉 C 语言的人来说,C 语言里面明确说明,以下这种情况里面,多余的逗号是可以接受的:

int array[] = {1,2,};

然而作为一个弱类型的语言,语法相对会比较随意的 javascript ,在这里却有一个陷井。事实上,标准可以允许中间或着头部的位置出现多余的逗号,这样会把多余的 undefined 的对象加入到数组中。不过末尾的逗号却会因为浏览器的不同而产生不同的结果。例如

var arr = [1,2,3,];
alert(arr.length);

在 IE6 下会得到 4 ,而在 Firefox 2 下得到的是 3 。且不论谁对谁错,但这已经是不得不去面对的事实了。这次我就遇到了这个问题,事实上,我是在 rails 的 ERB 模板里面生成一个 javascript 的数组常量。大概像这个样子:

var data = [
    <% for entry in @entries -%>
        <%= format_entry entry %>,
    <% end -%>
    ];

这样产生了末尾多余的逗号,导致了在 Firefox 和 IE 下产生了不同的结果。最后对最后一个元素特殊对待才解决了问题:

var data = [
    <% for entry in @entries[0..-2] -%>
        <%= format_entry entry %>,
    <% end -%>
    <%= format_entry @entries[-1] %>
    ];

时间的格式

我要在 javascript 里面通过字符串解析出时间来。在 Ruby 里面的 Time 类有一个方便的 to_s 方法可以直接把时间转化为字符串,它得到的格式是这样的 Tue Sep 04 13:48:25 +0800 2007 。我便直接使用了这个格式,一直都是好好的,后来拿到 IE 下面去跑的时候,根本跑不出结果来。调试了很久才发现 IE 下面没有能把那个时间解析出来,IE 不认那个 “+0800″ 。最后我用 strftime 格式化成了一种通用的格式把这个问题解决了。

  1. One Response to “Do write portable code”

  2. @entries.collect{|entry|format_entry entry}.join(‘,’) ?

    By Sparkle on Oct 24, 2008

Post a Comment