【问题标题】:if() handles booleans in a strange wayif() 以一种奇怪的方式处理布尔值
【发布时间】:2016-06-29 18:08:25
【问题描述】:

我们在这里谈论的是 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”不存在(duhhh),该函数返回值为“false”的布尔类型,但仍将其传递为 true。我尝试查看“不同交易”选项。

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

userExists('notextistinguser')=='false' 

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

【问题讨论】:

    标签: marklogic serverside-javascript


    【解决方案1】:

    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() wrapper function 示例,使用一流的函数使xdmp.eval() 的使用更简单一些。

    【讨论】:

      【解决方案2】:

      将最后一行更改为:

      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

      【讨论】:

        【解决方案3】:

        当您的函数返回 res 时,res 似乎不是 false 的实际布尔值或任何会被强制为假的值。因此,改为返回“真实”值并强制转换为布尔值 true。

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

        【讨论】:

          猜你喜欢
          • 2019-10-03
          • 1970-01-01
          • 1970-01-01
          • 2020-01-22
          • 1970-01-01
          • 2017-01-17
          • 2017-12-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多