【问题标题】:Why were the new JSLint errors "use spaces, not tabs" and "unsafe character" introduced?为什么引入了新的 JSLint 错误“使用空格,而不是制表符”和“不安全字符”?
【发布时间】:2012-12-04 11:47:52
【问题描述】:

我已经使用 JSLint 验证我的 JavaScript 大约 2 年了,偶尔会有一些规则发生变化。一般来说,当 JSLint 引入新规则时,有一个复选框可以在解析时忽略此规则,或者如果您选择不忽略它,则使您的代码符合它。

但是,当我今天运行 JSLint 验证时,我遇到了以下两个新错误:

使用空格,而不是制表符。

这不是“混合制表符和空格”错误。我只使用标签。这是“混合制表符和空格”的最近修改版本,现在一般不允许使用制表符。

还有:

不安全的字符。

*/

不安全的字符。

_const: {

没有可以忽略的新选项。我无法理解关闭块注释有什么不安全的地方,为什么它认为 _const: { 当我有 nomen: true 时不安全,(在标识符中悬挂 _)或者为什么我应该突然从空格切换到制表符,当我仍然有关于缩进4个空格作为制表符的配置。

有没有人知道为什么这些被引入至少如何让 JSLint 忽略这些新规则?

更新: Messy White Space 选项可以解决此问题,但会导致其他意外行为:

if (condition) { 
  //            ^-- there is a space but it won't indicate an error

【问题讨论】:

  • 请发布您的 linter 配置。
  • */ 在 JSLint 中被认为是不安全的,因为 JSLint 的创建者认为在每一行上使用 // cmets 比块 cmets 更安全,因为如果你不小心放了人为错误的机会“*/” 在您的评论中并过早关闭该块。就个人而言,我忽略它。
  • @Dawn 我不是只在那一行得到它,我会用另一个更没有意义的地方更新。
  • 这与正则表达式和/**/ 注释有关,它可能会被*/ 之类的正则表达式绊倒。所以 Douglas Crockford 很遗憾你应该使用 // 单引号。他们注释掉了整行(在刹车线之间),或者如果你把它们放在一行上,从//到行尾的所有代码。
  • 如果换行符被意外地从你的代码中删除了,那么//会注释掉文件的其余部分,而/* */不会,所以说第一个更安全是有点天真。

标签: javascript jslint


【解决方案1】:

看来,Douglas Crockford 刚刚让更多的人转向 JSHint。看看this commit

“混合空格和制表符”错误已被删除,并在其位置添加了一个新的“使用空格,而不是制表符”错误。除此之外,该差异中有一个微小的变化表明了造成这种情况的原因。以下行(添加评论):

at = source_row.search(/ \t/);
//                      ^ Space

已被替换为:

at = source_row.search(/\t/);
//                      ^ No space!

搜索后有一个if 语句。如果条件评估为true,则会发出“使用空格,而不是制表符”警告。声明如下:

if (at >= 0) {
    warn_at('use_spaces', line, at + 1);
}

希望这只是 Crockford 的一个小小的疏忽。如您所见,如果您在任何地方使用制表符,JSLint 现在会发出此警告。不幸的是,他的提交信息完全没用,而且文档似乎没有更新,所以我只能猜测这个变化背后的原因。

我建议你现在放弃 JSLint 并切换到 JSHint

【讨论】:

  • 感谢您对此进行调查。从 JSLint 切换到另一个验证器对我来说不是什么东东。我有一个完整的基础架构来运行针对 JSLint 的自动验证......
  • @KonstantinD-Infragistics - JSHint 开始作为 JSLint 的一个分支。交换它们应该很容易。如果有 JSLint 工具,通常也有 JSHint 工具(例如,两者都有 Node.js 包装器,允许您从终端运行它们)。或者,您是否能够控制正在使用的 JSLint 的版本?
  • 是的,我的 Node.js 代码没有下载更新的版本,并且在我更新 jslint 文件之前,我的自动执行不会显示这些错误,但是当您手动想要检查错误时,您不能再这样做了在 jslint.com 上。
  • 恕我直言,fu** 空格。
  • 是的,验证器必须在代码的每一行中指出制表符的用法,这很荒谬。它会分散您对代码中真正问题的注意力。另外,标签有什么问题?!
【解决方案2】:

您可以通过单击“混乱的空白”选项来抑制错误。

【讨论】:

  • 我实际上在这个解决方法中发现了一个缺陷,但它仍然是迄今为止唯一可用的东西......
  • 有什么缺陷,@KonstantinD-Infragistics?
  • 我在问题的最后部分已经解释过了。这种方式尾随空格被忽略,它们不应该,
【解决方案3】:

回答为什么 JSLint 现在给出了一个关于标签的错误,http://www.jslint.com/help.html 给出了这个理由:

制表符和空格不应混用。我们应该按顺序只选一个 避免两者兼而有之的问题。个人喜好 是一个极其不可靠的标准。两者都没有提供强大的 相对于其他的优势。五十年前,Tab 的优势在于 消耗更少的内存,但摩尔定律消除了这一优势。 空格比制表符有一个明显的优势:没有可靠的标准 一个制表符代表多少个空格,但它被普遍接受 一个空间占据一个空间。所以使用空格。您可以使用标签进行编辑 如果必须,但在提交之前确保它再次是空格。可能是 总有一天我们将最终获得标签的通用标准,但直到 那一天来了,更好的选择是空间。

基本上,他希望每个人就是否使用制表符或空格来防止它们被混合达成共识。他认为空间宽度的一致性使其成为最佳选择,所以我们都应该使用它。显然有些人会不同意这种思路(包括我自己),但这就是 JSLint 抛出该错误的原因。

【讨论】:

  • ...这毫无意义。由于定义的宽度正是空格不一致的原因......因为有些人会使用 2 个空格,有些人会使用 4 个等。所以有些文件缩进将是其他文件缩进的两倍。使用制表符,它只是 1 个制表符 == 缩进,您的编辑器与您的设置确定该缩进被视为多远......并且每个使用制表符的文件都会为您显示完全相同的内容。 Tab 是完美的占位符,用于表示“它是 1 级缩进……无论您希望它对您的编辑器意味着多远”,并且使用它的每个文件的缩进看起来完全相同。
【解决方案4】:

根据您的编辑器/IDE,您可以调整 TAB 的工作方式。

例如,我使用 Sublime Text。 在右下角附近有一个 Tab Size : 4.

我点击它并将其设置为“使用空格缩进”。

这更新了我所有的选项卡以使用空格并且 JSLint 错误消失了。我尝试在 JSLint 中使用尽可能少的选项,因为我希望我的代码结构良好。

我还使用 JSFormat,它会根据我的编辑器设置进行选项卡,所以每当我完成时,我会运行我的 JSFormat,然后运行 ​​JSLint。没有错误 = 快乐的孩子!

希望对你有帮助。

【讨论】:

  • 另外,对于 vim,只需将其添加到您的 .vimrc 中,再也不用担心它了:set tabstop=4 shiftwidth=4 expandtab
  • 大多数编辑器的使用空格缩进选项的问题是您按一次Tab,但必须按四次Backspace。据我所知,没有任何编辑器可以将制表符作为一个单独的实体正确处理。
  • 为了解决这个问题,许多编辑器都有自己的缩进和取消缩进热键。例如,对于 sublime 文本 cmd+] 将缩进,而 cmd+[ 将不缩进。当您需要清理别人的污水时提供帮助。
  • 但问题不在于解决方法。问题是,标签有什么问题?!为什么这值得在包含选项卡的每一行代码中提及!它会分散您对代码中实际问题的注意力!!事实上,我认为制表符更好,因为具有相同数量的制表符比空格(更少的实际字符)更容易,并且文件占用的空间更少(制表符占用 1 个字节而不是 4 个字节),尽管这不是那么重要。
猜你喜欢
  • 2011-03-28
  • 1970-01-01
  • 2011-02-22
  • 2011-07-06
  • 2017-04-19
  • 2019-01-29
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
相关资源
最近更新 更多