JS:如果对象存在,是否有一种运算符可以返回对象属性?

34 浏览
0 Comments

JS:如果对象存在,是否有一种运算符可以返回对象属性?

我将用例子来解释:\nElvis运算符(?:)\n

\n“Elvis运算符”是Java三元运算符的简写形式。其中一个方便之处是,如果一个表达式解析为false或null,则返回一个“合理的默认”值。一个简单的例子可能是这样的:\n

\n

def gender = user.male ? "male" : "female"  //传统的三元运算符用法
def displayName = user.name ?: "Anonymous"  //更紧凑的Elvis运算符

\n

\n安全导航运算符(?.)\n安全导航运算符用于避免NullPointerException。通常情况下,当您有一个对象的引用时,您可能需要在访问对象的方法或属性之前验证它不是null。为了避免这种情况,安全导航运算符将简单地返回null,而不是抛出异常,如下所示:\n

\n

def user = User.find( "admin" )           //如果'admin'不存在,这可能为null
def streetName = user?.address?.street    //如果user或user.address为null,streetName将为null - 不会抛出NPE

0
0 Comments

2020年更新:JavaScript现在已经有了Elvis运算符和安全导航运算符的等价物。

安全属性访问:可选链操作符(?.)是目前处于ECMAScript提案的第4阶段的特性。你可以使用Babel进行使用。

// 如果a或b为null/undefined,则返回undefined。否则返回a.b.c
const myVariable = a?.b?.c;

逻辑与运算符(&&)是处理这种情况的“旧”、更冗长的方式。

const myVariable = a && a.b && a.b.c;

提供默认值:空值合并运算符(??)是目前处于ECMAScript提案的第4阶段的特性。你可以使用Babel进行使用。如果运算符左边是一个无效值(null/undefined),它允许你设置一个默认值。

const myVariable = a?.b?.c ?? 'Some other value';
// 结果为 'Some other value'
const myVariable2 = null ?? 'Some other value';
// 结果为 ''
const myVariable3 = '' ?? 'Some other value';

逻辑或运算符(||)是一个具有略微不同行为的替代解决方案。如果运算符左边是假值,它允许你设置一个默认值。注意,下面的myVariable3的结果与上面的myVariable3不同。

const myVariable = a?.b?.c || 'Some other value';
// 结果为 'Some other value'
const myVariable2 = null || 'Some other value';
// 结果为 'Some other value'
const myVariable3 = '' || 'Some other value';

这个回答需要更多的赞。空值合并运算符现在已经是第4阶段了。

a && a.b && a.c

应该改为

a && a.b && a.b.c

我不能自己编辑,因为这个改动对于SO来说不够大,我也不想做“改动不重要的东西来凑够6个字符”的事情。

你还可以使用[]语法来实现这个功能,如下所示:

obj.val?.prop
obj.val?.[expr]
obj.arr?.[index]
obj.func?.(args)

我在开发工具中尝试了一下,人们可能希望"const result = a?.b?.c ?? 'Some other value';"的结果是"Some other value",因为我没有定义"a",但它只会抛出一个"Uncaught ReferenceError: a is not defined"的错误。"Is not defined"等于undefined,对吗?

0
0 Comments

有时候我们需要在访问对象属性时先判断对象是否存在,以避免出现错误。在JavaScript中,没有内置的安全导航运算符来实现这个功能。然而,我们可以使用一些技巧来达到相同的效果。

在上述内容中,作者提供了一种替代方案,以实现安全导航的效果。作者使用了逻辑与(&&)运算符来判断对象属性是否存在,并将结果赋值给一个变量。具体代码如下:

var streetName = user && user.address && user.address.street;

上述代码中,作者通过多次使用逻辑与(&&)运算符来判断对象的层级结构是否存在,如果存在则返回该属性的值,如果不存在则返回undefined。这样可以避免在访问不存在的属性时出现错误。

如果我们希望在属性不存在时返回一个默认值,可以使用逻辑或(||)运算符来实现。具体代码如下:

var streetName = (user && user.address && user.address.street) || "Unknown Street";

上述代码中,如果对象属性不存在,则返回默认值"Unknown Street"。

这种方法可以实现安全导航的效果,但是需要注意的是,它无法区分属性值为null还是undefined。因此,在使用时需要根据具体情况进行判断和处理。

总结起来,虽然JavaScript中没有内置的安全导航运算符,但我们可以通过使用逻辑与(&&)运算符和逻辑或(||)运算符来实现类似的效果。这种方法可以避免在访问不存在的对象属性时出现错误,并可以设置默认值来应对属性不存在的情况。

0
0 Comments

在JavaScript中,如果对象存在,则有没有返回对象属性的运算符?这个问题的出现原因是因为JavaScript没有类似Elvis运算符的功能。然而,可以使用逻辑的“或”运算符来代替Elvis运算符。例如,displayname = user.name || "Anonymous"

如果你想要一种替代语法,可以考虑查看CoffeeScript。它具有一些类似于你所寻找的简写形式。例如,存在运算符可以用来检查对象属性是否存在:

zip = lottery.drawWinner?().address?.zipcode

。还有一些其他方面的功能,如函数快捷方式:

()->  // 相当于 function(){}

,以及函数调用的简写形式:

func 'arg1','arg2' // 相当于 func('arg1','arg2')

当然,需要将CoffeeScript编译成JavaScript或者将其作为<script type='text/coffeescript'>插入页面中进行使用。使用<script type='text/coffeescript'>只适用于开发环境,不适用于生产环境。

虽然逻辑的“或”运算符在大多数情况下可以解决问题,但它并不完全符合要求,因为它只在左操作数未定义时才选择右操作数,而不是在左操作数定义但为假值时选择右操作数。

在讨论中还提到了CoffeeScript的一些其他功能,如多行注释和类。然而,这些功能与问题的关系不大,因此建议只保留与问题相关的内容。

此外,还提到了可选链式操作符?.和空值合并运算符??,这些是JavaScript的新特性,但是浏览器的支持情况尚不完善。

JavaScript目前没有一种直接返回对象属性的运算符,但可以使用逻辑的“或”运算符作为替代方案。如果需要更多类似Elvis运算符的功能,可以考虑使用CoffeeScript或者使用JavaScript的新特性。

0