Javascript 为什么';“意外”&引用';对括号中的默认值使用| |运算符时

Javascript 为什么';“意外”&引用';对括号中的默认值使用| |运算符时,javascript,jslint,Javascript,Jslint,在此代码上从jslint()获取意外的“.” function test(foo) { "use strict"; return (foo || "").replace("bar", "baz"); } 为什么jslint在| |运算符强制执行空字符串时会出现问题,以便在foo未定义的情况下执行替换而不会导致错误 这意味着: function test(foo) { "use strict"; var xFoo = (foo || ""); return

在此代码上从jslint()获取意外的“.”

function test(foo) {
    "use strict";
    return (foo || "").replace("bar", "baz");
}
为什么jslint在| |运算符强制执行空字符串时会出现问题,以便在foo未定义的情况下执行替换而不会导致错误

这意味着:

function test(foo) {
    "use strict";
    var xFoo = (foo || "");
    return xFoo.replace("bar", "baz");
}
我知道这是基于观点的,我可以忽略它,等等。。。但是试着去理解为什么这样的锁链是不受欢迎的。我也知道eshint,但我不是想绕开这条信息,只是想了解原因

第一种方法似乎更简洁、更简洁,因为它不需要额外的变量(xFoo)


这两个函数在所有条件下都做完全相同的事情。

这可能是因为它认为
(foo | |“”)
将计算为布尔表达式,因此类似
false.replace()
的内容没有意义。尽管如此,是的,在您的情况下,您会得到一个变量或空字符串。

使用
string()
constructor将删除jslint处的错误

function test(foo) {
    "use strict";
    return String(foo || "").replace("bar", "baz");
}

另请参见,

您可以将其设置为两行

function test(foo) {
    "use strict";
    foo = foo || "";
    return foo.replace("bar", "baz");
}
无需创建临时
xFoo
变量。
foo
参数是自传入的参数的副本

看起来您在这里尝试的是提供一个默认参数。在这种情况下,我将通过更明确的方式和类型检查来明确您正在做什么:

function test(foo) {
    "use strict";
    if (foo === undefined) {
      foo = "";
    }
    return foo.replace("bar", "baz");
}
是的,它不那么简洁,但它将为以后阅读它的人误解代码的意图留下更少的空间。显式检查类型还允许您处理其他潜在问题

function test(foo) {
    "use strict";
    if (foo === undefined) {
      foo = "";
    } else if (typeof foo !== 'string') {
      throw('foo must be a string');
    }
    return foo.replace("bar", "baz");
}
如果您使用的是ES2015,您还可以使用:


对于几乎所有的项目,我都建议添加到您的构建过程中,这样您就可以使用默认参数和ES2015添加到语言中的有用功能。使用Babel可以让您现在就使用它们,而不必等待所有浏览器来实现它们。

这看起来像是JSLint.idk中的一个bug,特别是为什么JSLint有问题,但它不是好代码。如果您将
true
1
传递给它,您将有一个问题。@ChrisGciso-如果您知道
foo
将是false或字符串,那么您的代码绝对没有问题。这不是语法错误。如果您对
foo
的可能值有所了解,或者如果您希望它在传递无效的
foo
时引发异常,那么这甚至不是编程错误。因此,在许多情况下,在接受的答案中使用代码只是一种消除警告的方法,而不是修复任何实际错误的东西。@ChrisGciso-因此,JSLint迫使您处理一些可能非常好的代码,而JSHint显然认为这不值得抱怨。两者都不是真的对或错——这些都是观点。只有当你知道如果为
foo
传递了无效值,或者这是否可能发生时,你希望函数如何运行,才是真正的对与错。@ChrisGciso fwiw,“JSLint获取一个JavaScript源代码并扫描它。如果发现问题,它将返回一条消息,描述问题和源中的大致位置。问题不一定是语法错误,尽管经常是这样。JSLint研究了一些样式约定以及结构问题。它不能证明你的程序是正确的。它只是提供了另一组眼睛来帮助发现问题。JSLint定义了..,这是一种比ECMAScript定义的更严格的语言。。JSLint将拒绝大多数合法程序。“它永远不会是
false
,但它可能是
true
,我并不是说它将作为布尔表达式计算,只是JSLint可能认为它会,因为它看起来像一个布尔表达式。此外,如果
foo
false
未定义的
等,则表达式将使用
,这也是false。如果这两种情况都可以计算为
false
,那么它怎么可能是
true
?@ChrisGciso这也会通过
返回foo和&foo.replace(“bar”,“baz”)@ChrisGciso-appease方法附加到字符串文本,在jslint处作为警告通知<代码>函数测试(foo){“使用严格”;如果(!foo){return.replace(“bar”,“baz”);}}
函数测试(foo){“使用严格”;如果(!foo){return“bar.replace”(“bar”,“baz”);}}
@ChrisGciso-我不会说这是“正确的”编码方式。这是让jsLint停止抱怨的方法。杰斯林特在这里不是上帝。我可能会编写这样的函数,如果有人将
true
传递给它,我希望它抛出一个异常,因为这是一个无效的值,我不希望强制转换为字符串。在这种情况下,这种新方法是错误的。这个答案毫无意义。它讨论字符串对象和
string
构造函数,但在给定的代码中两者都没有使用。这不是阻止jsLint抱怨的正确方法,只是让它停止抱怨的方法之一。这与
字符串
函数没有任何关系;这都是关于函数调用的-
Number(foo | | |“”)。replace(…)
也会传递。
function test(foo = "") {
    "use strict";
    if (typeof foo !== 'string') {
      throw('foo must be a string');
    }
    return foo.replace("bar", "baz");
}