JS:如果对象存在,是否有一种运算符可以返回对象属性?
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
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,对吗?
有时候我们需要在访问对象属性时先判断对象是否存在,以避免出现错误。在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中没有内置的安全导航运算符,但我们可以通过使用逻辑与(&&)运算符和逻辑或(||)运算符来实现类似的效果。这种方法可以避免在访问不存在的对象属性时出现错误,并可以设置默认值来应对属性不存在的情况。
在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的新特性。