JavaScript不兼容性/不一致性

6

我准备在几周后做一个演示,想知道:在开发过程中需要注意哪些前十个JavaScript不兼容问题?有哪些会让你卡壳?我可以先提供一个:

var somevar = {
 'internet': 'explorer',
 'hates': 'trailing',
 'commas': 'in',
 'json': 'code', // oh noes!
}

使用类库如jQuery或base不能修复的其他常见问题是什么?

以上代码中的陷阱是什么? - Vijay Dev
在某些浏览器上,'code'后面的尾随逗号可以存在,而在其他浏览器上则不行。 - Thilo
这可能会让正在学习JavaScript的PHP开发人员(例如我)感到困惑,因为我已经习惯了PHP始终接受最后一个逗号。 - thomasrutter
请注意,本问题与此问题有些关联:http://stackoverflow.com/questions/754689/any-references-for-differences-between-how-ff-and-ie-treat-javascript - cgp
10个回答

7
使用类似HTML标记的HTML编码
<div id="foo">
    <a href="#">Link 1</a>
</div>

如果您获得了外部div的引用,在某些浏览器中,它将具有一个子节点,而在其他浏览器中则具有三个子节点,这取决于如何处理空格。在链接元素之前和之后,一些浏览器将文本节点与换行符和空格作为“div#foo”的子节点。

幸运的是,像prototype.js这样的库已经处理了这个问题。 - Thilo
我不确定是否有任何库可以处理所有情况,因为空格解析到DOM中在各个浏览器中并不一致,这也是我认为的重点。(存在无法替代的数据丢失)我会在一些浏览器中尝试验证它。 - cgp
更多是DOM问题,而不是JS问题,不过JS在遍历DOM方面相当一致。 - annakata

6

嗯,暗示的分号会导致问题。

return {
    a: 1,
    b: 2
}

有些人喜欢将左括号单独放在一行,像这样:

return
{
    a: 1,
    b: 2
}

然而,由于解析器看到的是以下内容,因此这个最后的语句将返回 undefined
return;
{
    a: 1,
    b: 2
}

那是一个非常好的。 - meandmycode
1
但这是不兼容性吗? - reinierpost
不,这更像是一个“陷阱”。现在JS中已经没有太多的不兼容性了。DOM才是罪魁祸首。 - Magnar

3

var x = new Boolean(false); if (x) ... else...;

这段代码中,'if'分支还是'else'分支会被执行?

var x = "hi", y = new String("hi");

x和y的typeof是什么?

编辑:..

parseInt("017")产生15(八进制),而不是17。

在使用对象作为哈希映射时,需要使用object.hasOwnProperty(key)来确保属性没有通过原型链继承。

'Error'对象在IE和Firefox中具有不同的签名。


1
那么 JavaScript 的不兼容性在哪里呢? - Sergey Ilinsky
尽管不是所有的浏览器都存在不一致性,但这个答案提供了语言中最多的不一致性。 - cgp

2

还有一个问题(我认为这种情况不太常见):

(typeof document.getElementById)

在IE中:"object"
在Firefox中:"function"

0

JavaScript 在不同浏览器的实现中几乎没有任何不一致性。如果有的话,那将是一个噩梦(因为 DOM 实现中存在多个不一致性)。因此,“十大 JavaScript 不兼容性/不一致性”可能只能填上你发现的“最后一项”。确实可能还有一两个,但我几乎不指望它们会是主要问题,甚至值得关注。


0

除了DOM API的不一致性(这是库解决的问题),就没有太多问题了。

但是一些JS引擎已经实现了更多功能,比如[].map()、[].filter()等,let语句或E4X。当我在针对Mozilla开发(Firefox扩展,使用Jaxer进行服务器端开发)和一般浏览器开发(网站)之间切换时,我需要记住每个浏览器中可用的内容以及不可用的内容。因此,重点在于实现了什么,而不是如何实现


0

0
alert(document instanceof Document)

在Firefox中:true!

在Internet Explorer中:异常:文档未定义


0

关于日期对象:

alert( (new Date()).getYear();

Firefox 返回 109

Internet Explorer 返回 2009


0
一个补充,Element 也不是一个定义过的基本类型...
//uses jQuery
function getSomething(input) {
   if (typeof(input) == string)
       input = $(input)[0] || $('#'+input)[0] || null;

   if (input instanceof Element)
       input = $(input);

   if (input instanceOf jQuery) {
       ...do something...
   }
}

我不得不用新的元素替换instanceOf。

if (input && input.tagName)...

如果在IE中DOM元素能够正确地基类化就太好了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接