在 ServiceNow 脚本中,我尝试检测是否定义了某些内容。
关于this page它说
All values are truthy unless they are defined as falsy. That is, all values are truthy except false, 0, -0, 0n, "", null, undefined, and NaN.
因此,任何 JavaScript 对象都必须为 true,除非它为 null。
但请考虑此 ServiceNow 代码,它打印有关由记录生成器创建的事件的一些信息,该记录生成器具有名为 location
的变量。
var incGR = new GlideRecord('incident');
incGR.get('49eab040975d6510378377500153afe8');
gs.info(typeof incGR.variables);
gs.info(incGR.variables ? true : false);
gs.info(incGR.variables.location);
gs.info(incGR.variables.constructor.name);
当作为后台脚本运行时,它会打印以下内容:
*** Script: object
*** Script: false
*** Script: 8269b993db7d3200860930cf9d961945
*** Script: GlideElementVariables
现在我明白了 incGR
和 incGR.variables
实际上是 Java 对象(在旧版本的 Rhino 引擎中创建)。不过,如果 incGR.variables
是一个非空对象,它怎么会是 false?
最佳答案
值得指出的几件事:
我们将JS中的 bool 值分为“真”和“假”
Truthy 意味着它将导致使用 if
或 ?
; falsy 意味着它将转到 else
或 :
。
因此,在您的声明中:
Thus, any JavaScript object must be true unless it is null.
我想你的意思是:
Thus, any JavaScript object must be truthy unless it is falsy.
但我们明白您的意思,别担心!
这就是你面临的难题
如何incGR.variables? true : false
是 false
但是还有 incGR.variables.location
和 incGR.variables.constructor 的值.name
?
这对我来说确实也是一个谜。我同意你的观点,incGR.variables.location
可以有值(在本例中为字符串)的唯一方法是让 incGR.variables
成为一个对象,因此要诚实。
可能的解决方案
您是否检查过它是否不是标准的 Javascript 对象?是否可能存在一个“getter”专门以 incGR.variables
的“falsy”值进行响应,但确实为 incGR.variables.location
提供正确的值?
您可以通过添加此行来进一步帮助调试:
gs.info(JSON.stringify(incGR.variables,null,2));
并报告结果。
您可以“清洗”它以使其正常运行
执行以下操作会将其转换为正确的 Javascript 对象。
var incGR = new GlideRecord('incident');
incGR.get('49eab040975d6510378377500153afe8');
const incGR_js = JSON.parse(JSON.stringify(incGR));
gs.info(typeof incGR_js.variables);
gs.info(incGR_js.variables ? true : false);
gs.info(incGR_js.variables.location);
gs.info(incGR_js.variables.constructor.name);
关于javascript - JavaScript 对象如何为 false 且不为 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75902981/