我正在学习Javascript并编写了以下代码:
if (mystring.len > 0) {
// do stuff
}
我不小心使用了.len
而不是.length
。令我惊讶的是,没有出现任何错误。 mystring.len
返回undefined
,这使得比较失败但代码保持正常运行。我宁愿提出一个实际的错误,所以我可以修复代码。添加"使用严格"没有帮助,也没有jslint。
我知道有办法积极检查某个属性是否存在,但这不是我所寻找的。我希望Javascript告诉我何时我在一个属性名称中输入了错字。
有没有办法让Javascript在这种情况下给出错误?
答案 0 :(得分:5)
不 - 这就是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
};
答案 1 :(得分:1)
"使用严格" (根据我的经验)使用那些未被显式声明/实例化然后被引用的变量将抛出错误(否则,JS会立即创建一个新的var)。所以这对我们没有帮助。
这听起来像是一个通常由其他语言的编译器拾取的错误,但是由于JS被解释,你不会有这种明确的错误检查,除非你在一个强大的IDE中。您使用文本编辑器还是写JS?
答案 2 :(得分:1)
这不是JavaScript考虑上述代码的方式。 JS中的每个变量都是一个对象。因此,当您执行mystring.len
时,它实际上尝试访问len
obj的mystring
属性,当它找不到该属性时,它将返回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
没有任何属性text
,因此永远不会调用doSomething()
函数。
答案 3 :(得分:1)
这是许多/所有答案中提到的JavaScript的行为。但是,有一个选项可以阻止您可能想要尝试的新属性:
Object.seal
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal
答案 4 :(得分:0)
简单的答案是JavaScript不是类型安全的......你不应该检查它,但如果你仍然想检查你可以通过:
if ('len' in mystring){
}
如果你问这个问题,你应该查看Typescript ......