如何检测 javascript 中无效属性的使用

How can I detect use of invalid properties in javascript?

本文关键字:属性 无效 javascript 何检测 检测      更新时间:2023-09-26

我正在学习Javascript,我写了以下代码:

if (mystring.len > 0) {
    // do stuff
}

我不小心用了.len而不是.length.令我惊讶的是,没有提出任何错误。 mystring.len返回undefined,这使得比较失败,但代码继续运行。我希望提出实际错误,以便修复代码。添加"use strict"没有帮助,jslint也没有帮助。

我知道有一些方法可以主动检查属性是否存在,但这不是我想要的。我希望Javascript告诉我何时在属性名称中输入了拼写错误。

在这种情况下,有没有办法导致Javascript给出错误?

不 - 这就是JavaScript的工作方式,它非常有用。谁能说检查len是需要修复的事情?考虑:

if(mystring.len === undefined) {
   mystring.len = "Test";
}

你能做的最好的事情就是在使用之前简单地检查事物是否已定义:

if(mystring.len !== undefined) {
}

我很欣赏这种奇怪之处,以及它感觉不健壮(最初来自 C# 背景),但不幸的是,您无能为力。JavaScript 区分大小写的事实使这更加令人沮丧。不过,您将学会与之共存!

如果你真的想运行一些静态分析,那么你可以考虑创建一个转译器(例如 Babel)扩展来运行这种分析 - 但如果你期望某些东西被undefined我会变得非常困难我发现是常见的地方。

编辑

这是一个真实的例子,我会在undefined有用的地方使用它。我正在使用一个需要将内容从一个位置移动到另一个位置的图书馆。除非指定了原始位置,否则它无法做到这一点,因此我可能会编写如下所示的内容,如果由于某种原因没有值,则初始化值:

function update(node) {
   if(node.x === undefined) { node.x = 0; }    
   node.y = node.y || 0; // This is the shorthand way I'd actually write it
   // Do some other stuff
};
使用

"严格"(根据我的经验),以便未显式声明/实例化然后引用的变量将抛出错误(否则,JS只会即时创建一个新的var)。所以这在这里无济于事。

这听起来像是一个错误,通常由其他语言的编译器拾取,但由于JS是解释的,除非你在强大的IDE中,否则你不会有这种明确的错误检查。您是否正在使用文本编辑器或其他东西来编写JS?

这不是 JavaScript 考虑上述代码的方式。JS中的每个变量都是一个对象。因此,当您执行mystring.len时,它实际上尝试访问 mystring obj 的len属性,当它找不到该属性时,它将返回undefined - 这就是它应该的样子。这就是为什么使用 JSLint 找不到任何错误的原因。

举个例子——

var myObj = {name: 'Hello', id: 1};
console.log(myObj.name);   // Returns 'Hello'
console.log(myObj.text);   // 'undefined'

为了防止此类代码给您带来任何错误,您可以轻松使用 hasOwnProperty() 方法,如下所示-

if(myObj.hasOwnProperty('text')) doSomething();

由于myObj没有任何属性textdoSomething()函数永远不会被调用。

这是许多/所有答案都提到的JavaScript的行为。但是,有一个选项可以阻止您可能想要尝试的新属性:

Object.seal https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal

简单的答案是 JavaScript 不是类型安全的......你不应该检查它,但如果你仍然想检查,你可以通过以下方式进行:

if ('len' in mystring){
}

如果你问这个问题,你应该看看打字稿...