为啥 JSLint 更喜欢点符号而不是方括号?

Posted

技术标签:

【中文标题】为啥 JSLint 更喜欢点符号而不是方括号?【英文标题】:Why does JSLint prefer dot notation over Square Bracket?为什么 JSLint 更喜欢点符号而不是方括号? 【发布时间】:2012-10-27 14:11:39 【问题描述】:

我一直在检查我的一些代码并收到一些错误,说最好使用点表示法。我发现我使用的是方括号表示法 (with clarity from this great post),但是,我想问一下为什么 Crockford 更喜欢点表示法?我正在做的项目已经使用了 SBN,因为它的整体性,我不认为它令人困惑或不可读,但如果用户 dot 有明显的原因,我会更正它。

只是想在继续之前完全理解它!

【问题讨论】:

因为 Crockford 说它更好。这是一个人的意见。输入的字符也更少。 :) 【参考方案1】:

我相信这是为了区分数组元素和对象属性,并减少混乱的代码。

例如:

var x = [];
x.push(stuff);

x[0] 是我们访问它的方式。

var y =  foo: "bar" ;

y['foo']y.foo 工作,但要明确foo对象 y 的属性 并且 不是数组 y 中的元素,我们可以对对象使用点符号。

【讨论】:

它与用于索引数组的运算符相同。即具有一个元素的数组具有称为“0”的属性。所以对数组进行索引就是使用[] 访问对象的属性 从来不知道!我们如何将它与数组一起使用? @Christoph 我改写了,因为是的,这是不正确的,因为你不能用数字开始一个标识符,我的意思是数组的 ´[]` 运算符没有什么特别之处,它是相同的运算符JS 中的所有其他对象和数组都不是真正的数组它们是特定的对象类 [] 中的数字不是索引而是属性的名称 @RuneFS - 数组不过是对象,是的,但是当您只想编写可读代码时,理论上的现实 是无关紧要的。在可读代码方面,company.namecompanies[0] 之间存在差异。内置 Array 对象的存在是有原因的,因为它确实使某些场景更易于实现。 @techfoobar 是的,他们访问不同的属性:)【参考方案2】:

我最了解 Crockford,我认为这归结为一致性和避免使用保留字。在他的site 中,他说:

当下标是字符串常量时可以使用点表示法 以合法标识符的形式。因为语言错误 定义,保留字不能在点符号中使用,但是 它们可以用在下标符号中。

由于您可以在下标符号中引用保留字,因此可能会引起混淆。基本上,避免使用保留字作为对象成员的名称。点符号强制执行这一点(通过语言——Crockford 称之为错误),因此避免使用保留字被认为是一种更好的编码实践。

同样在同一个网站上,他还表示点符号“更方便一点”。

【讨论】:

使用 google 闭包编译器时如何解决。示例:var Promise = window['Promise']; 但是下标符号不是更通用吗?您可以使用变量使用下标表示法来调用成员,但使用点表示法它会调用该变量,就好像它是一个成员一样。即:var obj = name: 'Java Script'; var _key = 'name'; obj['_key'] === 'name'; //=> true; obj._key === 'name'; //=> false【参考方案3】:

来自“javascript: The Good Parts”,上面写着on page 21:

.符号是首选,因为它更紧凑,读起来更好。

这本书是道格拉斯·克罗克福德自己写的。

【讨论】:

【参考方案4】:

这两种语法都没有问题,并且都适用于所有环境。但是,通过尽可能使用点表示法,您每次可以保存三个字符。

Source

请务必记住,JSLint 标准完全基于意见。大多数通常是流行的观点,但有些是有争议的。话虽如此,我更喜欢JSHint,而不是它允许您关闭任何您不同意的选项。

【讨论】:

你也可以关闭 JSLint 中的选项 (我最初在这里有一个关于关键字不是有效属性名称的评论。尽管我可以尝试,但我不能让 Chrome 抱怨它们。) @cHao,出于好奇,您将如何声明具有名为 var 的属性的对象? @AshBurlaczenko:在对象文字中,只需将属性名称用引号括起来。喜欢foo = 'var': 'this works fine' ;

以上是关于为啥 JSLint 更喜欢点符号而不是方括号?的主要内容,如果未能解决你的问题,请参考以下文章

jsLint 预期

为啥 JSLint 要我使用双引号而不是单引号?预期为 '"' 而看到的是 '''

何时/为啥要在 SQL 中使用 QUOTENAME?

使用方括号而不是引号定义的供应商的预处理指令

为啥游戏逻辑更喜欢 update() 而不是 didFinishUpdate?

js对象属性 通过点(.) 和 方括号([]) 的不同之处