Javascript 为什么不是';t ind=index1()| | index2()的值;其中index1()=未定义且index2()=0等于0但未定义?

Javascript 为什么不是';t ind=index1()| | index2()的值;其中index1()=未定义且index2()=0等于0但未定义?,javascript,function,closures,Javascript,Function,Closures,我有一个函数concat(),它从一开始到另一结束使用生成器函数,并通过组合这两个生成器充当另一个生成器。例如,如果第一个生成器函数生成一个从0到2的数字,第二个生成器函数生成一个从0到1的数字,则concat()会为以后的未定义调用生成(0,1,2,0,1)。在实现concat()之后,当进行测试时,它会返回(0,1,2,1)以供以后未定义的调用。它跳过第二个生成器函数的第一个生成值 我已经改变了我的实现方式,它可以工作,但我不明白为什么它对其他人不起作用。我已尝试打印返回的即时结果,发现0被

我有一个函数concat(),它从一开始到另一结束使用生成器函数,并通过组合这两个生成器充当另一个生成器。例如,如果第一个生成器函数生成一个从0到2的数字,第二个生成器函数生成一个从0到1的数字,则concat()会为以后的未定义调用生成(0,1,2,0,1)。在实现concat()之后,当进行测试时,它会返回(0,1,2,1)以供以后未定义的调用。它跳过第二个生成器函数的第一个生成值

我已经改变了我的实现方式,它可以工作,但我不明白为什么它对其他人不起作用。我已尝试打印返回的即时结果,发现0被跳过,因为第二个生成器和第一个生成器在输入时返回,或者操作为第二个生成器的第一个值提供未定义的值,正如我在返回前输入的console.log所指出的。我不知道为什么会这样。 多行注释代码按预期工作。两者有什么不同

const from=(开始)=>{
return()=>{
const next=开始;
开始+=1;
下一步返回;
};
};
const to=(fromIndex,end)=>{
return()=>{
常数at=fromIndex();
如果(在{
返回(从(开始),结束);
};
常数concat=(index1,index2)=>{
return()=>{
设ind=index1()| index2();
//控制台日志(ind);
返回ind;
/*
//这与预期的效果一样:
ind=index1();
如果(ind!==未定义){
返回ind;
}
ind=index2();
如果(ind!==未定义){
返回ind;
}
*/
};
};
常数con=concat(fromTo(0,3),fromTo(0,2));
console.log('con():',con());//0
console.log('con():',con());//1.
console.log('con():',con());//2.
console.log('con():',con());//1,但应为0

console.log('con():',con());//未定义但应为1,因为您有一张真实支票

调用
index1()
时返回
0
。你有一个手术室。这里的问题是or表示“
0
不真实”,所以请转到
index2()

因此,您不能只做那个简单的检查,这就是为什么您的其他版本可以工作的原因。你能得到的最接近的是这样的东西

const concat = (index1, index2) => {
  return () => {
    const ind = index1()
    return ind !== undefined ? ind : index2()
  }
}

但是你实际上并没有得到
0
当你期望得到时,它是
未定义的
@VLAZ是的,我正在得到未定义的。为什么会这样?因为
index1()
index2()
返回
undefined
。不过,我还没有检查它们是如何工作的,或者它们应该做什么。你似乎更了解他们。@VLAZ我知道他们都未定义返回。为什么第二个生成器的值返回undefined,而假定它返回0?所有内容都在多行注释部分工作,有什么不同?
0
为false,因此它将转到下一个索引。如果你从
1开始,它就不会问这个问题了。谢谢!我用布尔值(未定义的| | 0)检查真值,该值为false。我没想到它会变成false,然后赋值为undefined。我期望赋值为0。这个假设正确吗:const a=undefined | | false;//相当于忽略未定义、忽略false、无赋值,所以分配未定义?所以a=undefined?
a
将是
false
,如果第一项不是真值,它将使用下一项。