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点表示法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Flask render_template 期间未使用相对路径找到 Javascript 文件 [重复]

js数据类型

仅第一个单词的大写首字母[重复]

Javascript对象表示法与JSON对象[重复]

JavaScript学习:JavaScript语法

JQuery