我将举例解释:
猫王运算符(?:)
“猫王运算符”是缩写
Java的三元运算符。一个
这很方便的例子是
返回一个“合理的默认值”
如果表达式解析为false或
null。一个简单的例子是这样的
这样的:
def gender = user.male ? "male" : "female" //traditional ternary operator usage
def displayName = user.name ?: "Anonymous" //more compact Elvis operator
安全导航操作员(?.)
使用安全导航操作符
来避免NullPointerException。
通常当你有一个参考
您可能需要验证的对象
在访问前它不是空的
对象的方法或属性。
为了避免这种情况,安全航行
运算符将简单地返回null
而不是抛出异常,比如
所以:
def user = User.find( "admin" ) //this might be null if 'admin' does not exist
def streetName = user?.address?.street //streetName will be null if user or user.address is null - no NPE thrown
你可以自己卷:
function resolve(objectToGetValueFrom, stringOfDotSeparatedParameters) {
var returnObject = objectToGetValueFrom,
parameters = stringOfDotSeparatedParameters.split('.'),
i,
parameter;
for (i = 0; i < parameters.length; i++) {
parameter = parameters[i];
returnObject = returnObject[parameter];
if (returnObject === undefined) {
break;
}
}
return returnObject;
};
像这样使用它:
var result = resolve(obj, 'a.b.c.d');
*如果a, b, c或d中的任何一个未定义,则结果未定义。
你可以使用逻辑'OR'操作符来代替Elvis操作符:
例如displayname = user.name || "匿名"。
但Javascript目前还不具备其他功能。如果你想要一种替代语法,我建议你看看CoffeeScript。它有一些类似于你要找的东西的简写。
例如存在操作符
zip = lottery.drawWinner?().address?.zipcode
功能快捷键
()-> // equivalent to function(){}
性感的函数调用
func 'arg1','arg2' // equivalent to func('arg1','arg2')
还有多行注释和类。显然,你必须将此编译为javascript或插入到页面中,作为<script type='text/coffeescript>',但它增加了很多功能:)。使用<script type='text/coffeescript'>实际上只用于开发而不是生产。
这是一个有趣的解决方案,安全导航操作员使用一些mixin..
http://jsfiddle.net/avernet/npcmv/
// Assume you have the following data structure
var companies = {
orbeon: {
cfo: "Erik",
cto: "Alex"
}
};
// Extend Underscore.js
_.mixin({
// Safe navigation
attr: function(obj, name) { return obj == null ? obj : obj[name]; },
// So we can chain console.log
log: function(obj) { console.log(obj); }
});
// Shortcut, 'cause I'm lazy
var C = _(companies).chain();
// Simple case: returns Erik
C.attr("orbeon").attr("cfo").log();
// Simple case too, no CEO in Orbeon, returns undefined
C.attr("orbeon").attr("ceo").log();
// IBM unknown, but doesn't lead to an error, returns undefined
C.attr("ibm").attr("ceo").log();