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

时间:2016-03-14 15:46:25

标签: marklogic serverside-javascript

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

// query

function testBoolean(){
 return false
}

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

给出字符串“false”,因为testBoolean()的类型为Boolean。

现在我自己的函数也返回一个布尔值,但我需要在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),该函数返回值为'false'的类型boolean,但仍然传递为true。我试着查看'different-transaction'选项。

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

userExists('notextistinguser')=='false' 

那么我的自定义功能现在是什么类型的?它报告布尔值,但作为字符串?

3 个答案:

答案 0 :(得分:4)

将您的最后一行更改为:

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

答案 1 :(得分:1)

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

ValueIterator

请注意,'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的规则将单例值强制转换为其有效布尔值,XQuery定义了它的语义。

请查看我的applyAs() wrapper function,了解使用第一类函数使fn.boolean()稍微简单一点。

答案 2 :(得分:0)

当您的函数返回res时,res不是false的实际布尔值或任何将被强制为false的值。因此,返回'truthy'值并强制转换为布尔值true。

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