【问题标题】:JavaScript dot notation [duplicate]JavaScript点表示法[重复]
【发布时间】: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

标签: javascript syntax


【解决方案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 口也不错。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-11
          • 1970-01-01
          • 1970-01-01
          • 2018-04-29
          • 2011-05-30
          • 2016-09-02
          相关资源
          最近更新 更多