JavaScript点表示法[重复]
Posted
技术标签:
【中文标题】JavaScript点表示法[重复]【英文标题】:JavaScript dot notation [duplicate] 【发布时间】:2011-01-01 08:42:24 【问题描述】:以下行显然最好用点表示法编写。我正在尝试清理我的 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'] 最好用点表示法编写。
【问题讨论】:
你应该首先测试 .getElementById ,因为有些浏览器为了向后兼容而伪造 .all ; byId 是您真正需要的功能。 如果有人想知道,使用任何一种表示法似乎都没有任何性能优势:jsperf.com/dot-notation-vs-square-bracket-notation 如果您寻找使用 a.b 而不是 a['b'] 的理由,请查看我的 answer 【参考方案1】:以下似乎更人性化。
var tipobj;
if (document.all)
tipobj = document.all["dhtmltooltip"];
else if (document.getElementById)
tipobj = document.getElementById("dhtmltooltip");
else
tipobj = "";
【讨论】:
也许,但它仍然使用方括号表示法,所以不回答问题。 您可以根据需要将document.all["dhtmltooltip"]
更改为document.all.dhtmltooltip
。
你可以,这就是问题的核心。
这个答案应该是一个评论......它甚至没有尝试回答实际问题,只是在旁边给出了一些格式建议。【参考方案2】:
它使用功能检查来检索 id 为 dhtmltooltip
的元素,如果没有进行检索的能力,则回退到空的 String
。
更新:正如其他人指出的那样,应该首先检查getElementById
,并且可能会被省略,因为任何可以被称为“现代”的浏览器都有它很长一段时间。
更新 2:在新的上下文中,JSLint 抱怨它不是 document.all.dhtmltooltip
。您可能应该将整个内容重写为:
var tipobj = document.getElementById("dhtmltooltip");
并完成它。
【讨论】:
这与使用点符号有什么关系? 所以这条线将取代我的整条线,让它更轻、更现代,但仍然可以正常工作? 只要你不关心支持 IE 4 和其他令人难以置信的古老浏览器。【参考方案3】:快速的 Google 搜索显示 document.all
仅用于支持 IE4。它是一个数组,允许浏览器访问 DOM 的不同部分(参见here。)
您首先发布的代码检查 document.all 是否存在。如果不是,它将tipobj
设置为""
。现在,除此之外,除非您真的想要 IE4 支持,否则真的不值得破译您发布的行。由于仍然很少有人使用 IE4,而且这段代码不符合任何现代标准,我将删除该行并将 tipobj
设置为 ""
。
【讨论】:
这与使用点符号有什么关系?【参考方案4】:有two ways to access properties of an object in JavaScript。
点符号
foo.bar.baz
方括号表示法
foo['bar']['baz']
您在部分代码中使用了后者。
道格拉斯·克罗克福德(Douglas Crockford)是 JSLint(一个提供错误信息的工具)的作者,他认为尽可能使用点表示法更好。
【讨论】:
谢谢,这就解释了!您似乎认为他的意见不一定 100% 有效,有没有比 JSLint 更好的方法来验证我的代码? 我认为除了运行和测试之外没有更好的方法来验证 JS 代码。我认为@David Dorward 试图说明的观点是两者都是有效的,这只是风格问题。点表示法是大多数人更喜欢的样式,但使用方括号表示法本身并没有错。 感谢 pkaeding。让我首先使用 JSLint 的是 w3 验证器,它说: 字符“&”是分隔符的第一个字符,但作为数据出现 所以我想我会检查整个脚本,但这个特殊的错误甚至没有出现..如果我不这样做,我会提出另一个问题想办法! DN 比 SBN 稍微高效一些,而且通常更具可读性。在某些情况下,我认为 SBN 更具可读性,但这可能与我习惯的约定有关。 JSLint 是一个不错的工具,不要把我回答的措辞当作对它的批评,我的目的是避免宣传或贬低它。 标记验证器会发现与在 HTML 文档中表达 JavaScript 相关的问题。 JSLint 不会,它只查看 JS,而不是它在文档中的表示。【参考方案5】: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");
以上两个 sn-ps 是关于支持非常 old browser 版本的复杂性成本的一个很好的例子:
【讨论】:
这条线完全取代了我的吗? 是的,除非您想支持 IE 4 或更早版本。【参考方案6】:看起来唯一真正的问题是格式/语法。这应该完全相同并符合 javascript 最佳实践。主要区别在于使用 javascript 点表示法而不是括号表示法。
if (ie || ns6)
var tipobj = document.all ? document.all.dhtmltooltip : document.getElementById ? document.getElementById("dhtmltooltip") : "";
【讨论】:
【参考方案7】:为什么不直接使用:
var tipobj = dhtmltooltip.id
除非点符号不适用于所有浏览器,否则不确定为什么需要长版本?
【讨论】:
【参考方案8】:如果点表示法有问题,您可以随时设置 /*jslint sub: true */ 选项来覆盖它。
【讨论】:
【参考方案9】:Quentin both ways are valid 已回答。
我更喜欢使用elem.bar
而不是elem['bar']
的原因之一是它可以节省3 个字符。当然这不是一个很大的改进,但每次作业免费 3 口也不错。
【讨论】:
以上是关于JavaScript点表示法[重复]的主要内容,如果未能解决你的问题,请参考以下文章