如何检测 javascript 中无效属性的使用
How can I detect use of invalid properties in javascript?
我正在学习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
没有任何属性text
,doSomething()
函数永远不会被调用。
这是许多/所有答案都提到的JavaScript的行为。但是,有一个选项可以阻止您可能想要尝试的新属性:
Object.seal
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal
简单的答案是 JavaScript 不是类型安全的......你不应该检查它,但如果你仍然想检查,你可以通过以下方式进行:
if ('len' in mystring){
}
如果你问这个问题,你应该看看打字稿...
- Jqx图表给出错误错误:
属性高度=“-1”的负值无效 - 输入元素模式属性的Javascript正则表达式在reFiddle上有效,但在页面上无效
- 如何检测 javascript 中无效属性的使用
- 错误:<路径>属性 d=“MNaN,NaNA5,5 0 1,1 NaN,NaNL0,0Z”的值无效
- 未捕获的语法错误:无法在“元素”上设置“innerHTML”属性:提供的标记是无效的 XML
- 无效的属性 ID
- 样式属性赋值上的“赋值中的左侧无效”
- D3:x 轴上的日期名称:<文本>属性 x=“NaN”的值无效
- 更改 CSS“z-index”属性:“赋值中的左侧无效”
- 谷歌地图:- 无效值错误:设置图标:不是字符串;并且没有网址属性;并且没有路径属性
- C3 时间序列图表给出错误 <路径>属性的值无效
- 错误:参数 4 的值无效.属性“方法”:意外属性
- 在IE中收到错误,例如“参数数量错误或属性分配无效”
- 错误:
属性宽度=“NaN” 6d3.v3.min.js:1 的值无效: 属性 x=“NaN” - 使用对象属性构造正则表达式时,限定符无效
- 错误:<的值无效;路径>属性
- 小数位数百分比属性无效
- 向BreezeJS查询添加扩展子句后,EntityAspect属性仍然无效
- 属性<的值无效;旅行模式>:未定义,什么
- 为什么我的HTML id属性无效,当我有4倍相同的id加一个计数器