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



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

// query
function testBoolean(){
 return false
}
if(testBoolean()){'true'} else {'false'}

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

现在我自己的函数也返回一个布尔值,但我需要一个明确的比较才能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' 不存在(duhhhh),该函数返回值 'false' 的类型布尔值,并且仍然作为 true 传递。我尝试查看"不同交易"选项。

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

userExists('notextistinguser')=='false' 

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

将最后一行更改为:

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

或将函数的返回更改为:

return fn.boolean(res)

现在返回正确的结果。


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

以下是测试的一些结果:

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

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

xdmp.eval()总是返回一个ValueIteratorValueIterator是 MarkLogic 进行惰性求值的核心。非null ValueIterator将始终是真实的,就像任何非null(非布尔)对象一样。如果您知道 eval 返回单个值(或者您只需要第一个值),请在 ValueIterator 实例上使用 .next().value(或者更准确地说,在 MarkLogic>=8.0-5 中使用fn.head(vi))。例如

'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

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

看看我的 applyAs() 包装器函数,了解使用一流函数使使用xdmp.eval()更简单的示例。

当您的函数返回res时,似乎res不是 false 的实际布尔值或任何会被强制为 false 的值。因此,相反,返回一个"真"值并强制转换为布尔真。

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

最新更新