Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何尽可能减少这种情况_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript 如何尽可能减少这种情况

Javascript 如何尽可能减少这种情况,javascript,ecmascript-6,Javascript,Ecmascript 6,我不理解我在这种情况下的行为。我尽量减少代码。 在这种情况下,我想知道r.user.id或r.user.uid是否等于getUser.uid。 为此,我在下面编写了这段代码。它可以工作,但我不明白为什么r?.user?.id | uid==getUser?.uidme返回toto不是布尔值。此代码是否与上面的代码类似 if (r?.user?.id||uid === getUser?.uid) { console.log("test 1", r?.user?.id||u

我不理解我在这种情况下的行为。我尽量减少代码。 在这种情况下,我想知道
r.user.id
r.user.uid
是否等于
getUser.uid

为此,我在下面编写了这段代码。它可以工作,但我不明白为什么
r?.user?.id | uid==getUser?.uid
me返回
toto
不是布尔值。此代码是否与上面的代码类似

if (r?.user?.id||uid === getUser?.uid) {
  console.log("test 1", r?.user?.id||uid === getUser?.uid);
}

if (r.user?.id === getUser?.uid) {
  console.log("test 2");
}
               
if (r.user?.uid === getUser?.uid) {
  console.log("test 3");
}

正如VLAZ所说,
| |
不是逻辑OR运算符,而是语法错误。(它看起来像逻辑OR运算符[
|
],后跟按位OR运算符[
|
],但不能这样做,因为它们之间需要一个操作数)。您只需要
|
(逻辑OR运算符)

我假设在您的真实代码中,
r.user
可能是
未定义的
null
(对于
getUser
),否则所有这些可选的链接操作符都是不必要的

如果
r.user
undefined
null
,则
r.user?.id
将为
undefined
。因此,
getUser?.uid
(如果
getUser
undefined
null
)。假设您不想在
undefined
情况下进行匹配,则需要检查是否存在这种情况

鉴于此,您的第一个示例可能会尽可能简洁,或者更明确:

if (r.user?.id !== undefined && (r.user?.id === getUser?.uid || r.user?.uid === getUser?.uid)) {
    // ...
}

或者您可以考虑添加变量:

const gid = getUser?.uid;
if (gid !== undefined && (r.user?.id === gid || r.user?.uid === gid)) {
    // ...
}

r
之后添加
,如果
r
本身可能是
未定义的
空的
,您的条件太多,不必要地复杂。我不清楚您想用这段代码实现什么,所以我假设它的目的是验证
getUser.uid
是否等于
r.user.id
r.user.uid
(存在的第一个)

我将在两个变量中提取这两个值:

const id1=getUser.uid;
常量id2=r.user?.id | | r.user?.uid;
这里的
id1
要么是
getUser.uid
(如果
getUser
具有属性
uid
),要么是
未定义的

id2
是第一个匹配:

  • r.user.id
    ,如果
    r
    具有属性
    user
    ,则该属性是具有属性
    id
    的对象
  • r.user.uid
    ,如果
    r.user
    没有
    id
    但有
    uid
  • 未定义
    如果
    r
    没有
    用户
    r
    用户
    ,但
    r.user
    没有
    id
    uid
现在,您所要做的就是将
id1
id2
进行比较,可能还要防止
未定义的

if(id1!==undefined&&id1==id2){
console.log('yes!');
}
我建议-

函数userMatches(getUser,r)
{if(getUser&&r?.user)
返回r.user.id==getUser.uid
||r.user.uid===getUser.uid
其他的
返回错误
}
或者使用默认参数,比如-

constusermatches=({uid=0},{user={})=>
user.id==uid | | user.uid==uid

什么是
r?.user?.id | uid===getUser?.uid
应该是什么?它当前是
r?.user?.id | |(uid==getUser?.uid)
()。你是说
(r?.user?.id | | uid)==getUser?.uid
还是别的什么?什么是
uid
?您可以对嵌套用户
const{id,uid}=r.user??{}
然后使用
if(r.user&&[id,uid].includes(getUser?.uid))
也不需要在
r.user?.id
中进行可选链接,因为您已经在前面检查了
r.user
,在
getUser
之后添加问号有什么意义?
getUser
是否总是定义的?
r?
也一样。您想要实现什么?是否要验证
getUser.uid
是否等于
r.user.id
r.user.uid
(存在的第一个)?如果
r.user.id
r.user.uid
都应与
getUser.uid
进行比较,则不能简单地比较“
id2
是第一个匹配的…”您必须同时选中两者。“两者”表示
&&
。问题中的代码使用
|
const gid = getUser?.uid;
if (gid !== undefined && (r.user?.id === gid || r.user?.uid === gid)) {
    // ...
}