在 ServiceNow 脚本中,我试图检测是否定义了某些内容。
在这个页面它说
所有值都是真值,除非它们被定义为假值。也就是说,除了 false、0、-0、0n、""、null、undefined 和 NaN 之外,所有值都是真值。
因此,任何 JavaScript 对象都必须为真,除非它为空。
然而考虑一下这个 ServiceNow 代码,它打印了一些关于由 Record Producer 创建的事件的信息,该事件有一个名为
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
是一个非空对象,它怎么可能是假的呢?
在 JavaScript 中,对象在布尔上下文中可以为 false,如果它有一个 falsy 值则不能为 null。 JavaScript 中的假值是在布尔上下文中计算时被视为假的值。以下是 JavaScript 中虚假值的一些示例:
false
0
''
(空字符串)null
undefined
NaN
如果一个对象具有这些值之一作为属性值,那么它在布尔上下文中将被认为是假的,即使它不是空的。例如:
const obj = {
prop1: 0,
prop2: '',
prop3: null,
prop4: undefined,
prop5: NaN,
};
console.log(Boolean(obj.prop1)); // false
console.log(Boolean(obj.prop2)); // false
console.log(Boolean(obj.prop3)); // false
console.log(Boolean(obj.prop4)); // false
console.log(Boolean(obj.prop5)); // false
在这个例子中,obj 对象有几个带有假值的属性。当我们使用布尔函数将这些值转换为布尔值时,它们的计算结果都为假。但是,这些属性都不为空
值得指出几件事:
Truthy 意味着它会导致使用
if
或 ?
; falsy 意味着它将转到 else
或 :
.
所以在你的这个声明中:
因此,任何 JavaScript 对象都必须为真,除非它为空。
我想你的意思是:
因此,任何 JavaScript 对象都必须是真实的,除非它是虚假的。
但是我们明白你的意思,别担心!
incGR.variables ? true : false
怎么可能是false
但是有incGR.variables.location
和incGR.variables.constructor.name
的值?
这对我来说确实也是一个谜。我同意你的看法,
incGR.variables.location
可以有一个值(在本例中是一个字符串)的唯一方法是让 incGR.variables
成为一个对象,因此是真实的。
您是否检查过它是否可能不是标准的 Javascript 对象?可能有一个“吸气剂”专门响应
incGR.variables
的“虚假”值,但确实为 incGR.variables.location
提供正确的值?
您可以通过添加此行进一步帮助调试:
gs.info(JSON.stringify(incGR.variables,null,2));
并报告结果。