Visual Studio 使用“===”比较 JavaScript 中的类型时出现代码警告

Visual Studio Code warning when comparing types in JavaScript using '==='

这是一个由两部分组成的问题。并且不同于 JavaScript 中基于相等性的其他问题,因为它处理 IDE "Visual Studio Code" 中显示的特定警告以及该警告消息出错或不出错的原因.

我在 Visual Studio 代码中收到以下警告消息:

Operator '===' cannot be applied to types 'number' and => 'string'

在以下代码行中:

var x = 23;
var y = "23";

x.valueOf() === y.valueOf() ? 
    console.log("Types ARE the same") 
        : console.log("Types ARE NOT the same");

现在这种技术对我来说绝对有效,我理解对这种类型的事物使用三等号而不是双重等号的原因。我在 codeschool 和 pluralsight 的几个基础课程中学到的相同代码是一种基于两个不同值的类型生成布尔值的方法,其中乘积或返回值是 truefalse 这样技术就可以派上用场了。

我的问题:

上面的代码与以下代码有何不同:

 x === y ? 
    console.log("Types ARE the same") 
        : console.log("Types ARE NOT the same");

在这个比较两个简单值及其类型的简单示例中,通过使用 valueOf() 方法还有什么我可以做的吗?

还有 Visual Studio 代码错误地生成了此警告,如果没有,是否有更好的方法来进行此类检查?

因为无论我在上面使用什么方法,我都会在 Visual Studio 代码中得到相同的警告错误,但它在实践中对我来说工作正常。

根据我从 MDN 文档 here for String.prototype.valueOf(); and here 中看到的 Number.prototype.valueOf(); 和您拥有的代码,我必须说您已经拥有 xy字符串和数字的原始值。不需要对 x 和 y 执行 valueOf(),因为它们不是 Object 类型。

理想情况下,您可以在字符串对象上使用 String.prototype.valueOf(); 来获取它的原始值,并使用 Number.prototype.valueOf(); 来获取数字对象的原始值,这将分别产生字符串数据类型和数字数据类型值。

因此,我想是警告。虽然我之前没有使用 visual-studio 的经验,但我觉得它理解 .valueOf() 应该用在对象类型上而不是原始类型上。

所以因为上面的例子是比较两个明显不同类型的已知定义值,Visual Studio代码在发出警告时实际上是正确的,因为它知道对于事实变量 x 是一个字符串并且变量 y 是一个整数,因此警告(非常模糊而且对我来说不是那么直观)通过比较这两个已知的硬编码值,我们总是会得到一个错误,如果我们实际上删除等号之一并将其设为双等于运算符,则它将始终等于 true,因为它将强制执行 "Type Coercion",这会将字符串值更改为整数。因此,如果我们在参数可能未知的函数中设置这种相同类型的三元语句,那么警告消息就会消失:

function compareTwo(a,b) { 
    a.valueOf() == b.valueOf() 
        ? console.log("value types ARE the same") 
            : console.log("value types ARE NOT the same");
}

因为现在任何人都可以将任何东西传递给这个函数,而且在任何情况下它都不再总是真或假。

valueOf 无关紧要,与警告无关。但是 VS 正确地识别出您正在使用类型敏感比较 === 比较两种不同的类型。您的表达式 23 === "23" 将始终 return 为假,因此它也可以只说

false ? doIfTrue() : doIfFalse();

或者更好的是,只需删除语句的整个第一部分,因为它永远不会触发

doIfFalse();

VS 认识到这一点,因此发出警告。您的条件语句是完全多余的,可以安全地删除。

如果您要写类似

的内容,您会收到类似的警告
if (true) doSomething();

if (true == false) doSomething();

VS 将识别条件没有意义,并使代码每次都触发或完全无法访问,并且它会警告您(它应该这样做)。

正如您所指出的:如果变量未在范围内进行硬编码,则警告将消失,因为 VS 停止验证在函数外部设置的变量类型。 Javascript 不是一种类型化语言,跟踪所有变量的内容对于 IDE 来说太费力和复杂了。

根据您的编码风格,所有 VS 都知道它甚至可能是您想要的行为(如果变量类型匹配,则执行某些操作,否则执行其他操作)。但是,当在同一范围内设置变量时,它只会创建无法访问的代码。