JavaScript 对象如何为假而不为空?

问题描述 投票:0回答:2

在 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 servicenow rhino
2个回答
0
投票

在 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 对象有几个带有假值的属性。当我们使用布尔函数将这些值转换为布尔值时,它们的计算结果都为假。但是,这些属性都不为空


0
投票

值得指出几件事:

我们将 JS 中的布尔值分为“真值”和“假值”

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));

并报告结果。

© www.soinside.com 2019 - 2024. All rights reserved.