JavaScript点符号

下面这行显然是用点记法写得最好的。 我试图清理我的JavaScript代码,使其严格。 这是什么意思?

if (ie||ns6) { var tipobj=document.all? document.all["dhtmltooltip"] : document.getElementById? document.getElementById("dhtmltooltip") : ""; } 

我添加了一些上下文到我的代码行,万一这有帮助? 我对DOM一无所知。 我不是试图支持Internet Explorer 4,这不是我的代码,我不能自己写JavaScript。 我只是试图让它符合和JSLint工具说到这一行:

第17行字符43处的问题:['dhtmltooltip']最好用点符号表示。

有两种方法可以访问JavaScript中的对象的属性 。

点符号

 foo.bar.baz 

方括号表示法

 foo['bar']['baz'] 

你在你的代码的一部分使用后者。

编写JSLint(提供该错误信息的工具)的Douglas Crockford认为在可能的情况下最好使用点符号。

JSLint希望这样做:

 var tipobj= document.all ? document.all.dhtmltooltip : document.getElementById ? document.getElementById("dhtmltooltip") : ""; 

但是现在假定document.getElementById存在是完全安全的,从2000年开始在DOM Level Core 2上引入。

document.all已经死了,除非你试图支持像IE4这样的老式浏览器(12岁!):

 var tipobj = document.getElementById("dhtmltooltip"); 

以上两个片段是支持非常旧的浏览器版本的复杂性成本的一个很好的例子:

替代文字http://ejohn.orghttp://img.dovov.comcost-benefit.png

以下似乎更加用户友好。

 var tipobj; if (document.all) tipobj = document.all["dhtmltooltip"]; else if (document.getElementById) tipobj = document.getElementById("dhtmltooltip"); else tipobj = ""; 

一个快速的谷歌search说, document.all只用于支持IE4。 它是一个允许浏览器访问DOM的不同部分的数组(请参阅此处) 。

您发布的代码首先检查document.all是否存在。 如果不是,则将tipobj设置为"" 。 现在,除此之外,除非您真的需要IE4支持,否则破解您所发布的行并不值得。 由于很less有人仍然使用IE4,而且这段代码不符合任何现代标准,所以我只是放弃这一行,并将tipobj设置为""

它看起来像唯一真正的问题是格式化/语法。 这应该工作完全一样,符合JavaScript的最佳做法。 主要区别是使用JavaScript点符号而不是括号表示法。

 if (ie || ns6) { var tipobj = document.all ? document.all.dhtmltooltip : document.getElementById ? document.getElementById("dhtmltooltip") : ""; } 

它使用能力检查来检索id为dhtmltooltip的元素,如果没有检索能力,则回退到空String

更新 :正如其他人指出的那样, getElementById的检查应该是第一位的,并且可能会被省略,因为任何可能被直接称为“现代”的浏览器都已经使用了很长时间。

更新2 :在新的上下文中,JSLint正在抱怨它不是document.all.dhtmltooltip 。 你应该重写整个事情:

 var tipobj = document.getElementById("dhtmltooltip"); 

并完成它。

为什么不使用:

 var tipobj = dhtmltooltip.id 

不知道为什么长版本是必需的,除非点符号不适用于所有的浏览器?

如果点符号是一个问题,您可以随时设置/ * jslint sub:true * /选项来覆盖它。

正如昆廷所回答的, 两种方式都是有效的 。

我喜欢用elem.bar而不是elem['bar']的原因之一是它可以保存3个字符。 这当然不是一个很大的改进,但是每份作业可以免费三口也不错。