if() 以一种奇怪的方式处理布尔值

if() handles booleans in a strange way

我们讨论的是 MarkLogic 平台上的服务器端 java 脚本。 现在我很困惑:

// query

function testBoolean(){
 return false
}

if(testBoolean()){'true'} else {'false'}

给出字符串 "false",因为 testBoolean() 是布尔类型。

现在我自己的函数 returns 也是一个布尔值,但在 if() 弄清楚之前我需要一个明确的比较...

function userExists(userName) {
    // check if user exists in security database
    var data = {userName : userName}
    var options = {
               "database" : xdmp.securityDatabase()
                };
    var res = xdmp.eval("declareUpdate(); var sec = require('/MarkLogic/security.xqy'); sec.userExists(userName)",
                                data,options);
    return res
};

// make sure result is actually aboolean
// xdmp.type(userExists('scc-user-1'))

if(userExists('notextistinguser')){ 'true' } else {'false'}

给出字符串 "true" ???

用户 'notextistinguser' 不存在(duhhh),函数 returns 一个值为 'false' 的布尔类型,但仍然传递为 true。我试着查看 'different-transaction' 选项。

当我明确比较需要将 false 转换为字符串时?

userExists('notextistinguser')=='false' 

那么现在我的自定义函数是什么类型的呢?它报告布尔值但充当字符串?

将最后一行更改为:

if(fn.boolean(userExists('notextistinguser'))){ 'true' } else {'false'}

或将函数中的 return 更改为:

return fn.boolean(res)

现在 return 是正确的结果。


fn.boolean() 将为您将其转换为实际的 JavaScript 布尔值。

以下是一些测试结果:

typeof(userExists('notextistinguser')) //Returns Object

typeof(fn.boolean(userExists('notextistinguser'))) //Returns Boolean

https://docs.marklogic.com/fn.boolean

似乎当您的函数 returns resres 不是 false 的实际布尔值或任何会被强制为假的值。因此,返回 'truthy' 值并将其强制转换为布尔值 true。

您需要验证函数返回的内容并根据需要强制转换为布尔值。

xdmp.eval() always returns a ValueIterator. ValueIterator is the core of how MarkLogic does lazy evaluation. A non-null ValueIterator will always be truthy, just like any non-null (non-Boolean) object. If you know your eval returns a single value (or you just want the first one), use .next().value on your ValueIterator instance (or, more correctly, fn.head(vi) 在 MarkLogic >=8.0-5)。例如,

'use strict';
var itr = xdmp.eval('false;'); // Returns a ValueIterator 
                               // instance that iterates 
                               // over a singleton boolean value
itr instanceof ValueIterator;  // true
1 === itr.count;               // true, singleton
false !== itr && true !== itr; // true, ValueIterators aren’t booleans       
false === fn.boolean(itr);     // true, fn.boolean coerces 
                               // singleton ValueIterator 
                               // instances to their effective 
                               // boolean values
false === itr.next().value;    // true

请注意,根据定义其语义的 XQuery 规则,fn.boolean() 会将单例值强制为其有效布尔值。

查看我的 applyAs() wrapper function 示例,了解使用 first-class 函数来简化 xdmp.eval() 的使用。