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
似乎当您的函数 returns res
时 res
不是 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()
的使用。
我们讨论的是 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
似乎当您的函数 returns res
时 res
不是 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()
的使用。