运算符+;=生成意外结果javascript

运算符+;=生成意外结果javascript,javascript,logical-operators,Javascript,Logical Operators,功能范围(开始、结束、st){ var-arr=[]; var计数器=启动; 虽然(counter我不确定您希望代码做什么,但是counter+=st | | counter+1相当于 counter += (st || (counter + 1)); if(st) { counter = counter + st; } else { counter = counter + counter + 1; } counter = (counter + st ) || (counte

功能范围(开始、结束、st){
var-arr=[];
var计数器=启动;

虽然(counter我不确定您希望代码做什么,但是
counter+=st | | counter+1
相当于

counter += (st || (counter + 1));
if(st) {
    counter = counter + st;
}
else {
    counter = counter + counter + 1;
}
counter = (counter + st ) || (counter + 1);
if(counter + st) {
    counter = counter + st;
}
else {
    counter = counter + 1;
}
counter = counter * 2 + 1;
counter += 1;
这相当于

counter += (st || (counter + 1));
if(st) {
    counter = counter + st;
}
else {
    counter = counter + counter + 1;
}
counter = (counter + st ) || (counter + 1);
if(counter + st) {
    counter = counter + st;
}
else {
    counter = counter + 1;
}
counter = counter * 2 + 1;
counter += 1;
另一方面,
counter=counter+st | | counter+1
相当于

counter += (st || (counter + 1));
if(st) {
    counter = counter + st;
}
else {
    counter = counter + counter + 1;
}
counter = (counter + st ) || (counter + 1);
if(counter + st) {
    counter = counter + st;
}
else {
    counter = counter + 1;
}
counter = counter * 2 + 1;
counter += 1;
这相当于

counter += (st || (counter + 1));
if(st) {
    counter = counter + st;
}
else {
    counter = counter + counter + 1;
}
counter = (counter + st ) || (counter + 1);
if(counter + st) {
    counter = counter + st;
}
else {
    counter = counter + 1;
}
counter = counter * 2 + 1;
counter += 1;

所以它们做了完全不同的事情。我假设操作符的优先级会让你失望。

我不确定你希望代码做什么,但是
计数器+=st | |计数器+1
相当于

counter += (st || (counter + 1));
if(st) {
    counter = counter + st;
}
else {
    counter = counter + counter + 1;
}
counter = (counter + st ) || (counter + 1);
if(counter + st) {
    counter = counter + st;
}
else {
    counter = counter + 1;
}
counter = counter * 2 + 1;
counter += 1;
这相当于

counter += (st || (counter + 1));
if(st) {
    counter = counter + st;
}
else {
    counter = counter + counter + 1;
}
counter = (counter + st ) || (counter + 1);
if(counter + st) {
    counter = counter + st;
}
else {
    counter = counter + 1;
}
counter = counter * 2 + 1;
counter += 1;
另一方面,
counter=counter+st | | counter+1
相当于

counter += (st || (counter + 1));
if(st) {
    counter = counter + st;
}
else {
    counter = counter + counter + 1;
}
counter = (counter + st ) || (counter + 1);
if(counter + st) {
    counter = counter + st;
}
else {
    counter = counter + 1;
}
counter = counter * 2 + 1;
counter += 1;
这相当于

counter += (st || (counter + 1));
if(st) {
    counter = counter + st;
}
else {
    counter = counter + counter + 1;
}
counter = (counter + st ) || (counter + 1);
if(counter + st) {
    counter = counter + st;
}
else {
    counter = counter + 1;
}
counter = counter * 2 + 1;
counter += 1;
所以他们做了完全不同的事情。我假设操作符的优先级会把你甩了。

区别在于

counter += st || counter + 1;
意思与

counter = counter + (st || counter + 1);
counter=counter+st | | counter+1
表示
counter=(counter+st)| |(counter+1)


在您的示例中,代码
st
undefined
,因此循环有效地执行

counter += counter + 1;
每次,这相当于

counter += (st || (counter + 1));
if(st) {
    counter = counter + st;
}
else {
    counter = counter + counter + 1;
}
counter = (counter + st ) || (counter + 1);
if(counter + st) {
    counter = counter + st;
}
else {
    counter = counter + 1;
}
counter = counter * 2 + 1;
counter += 1;
因此,大型跳过


另一方面,在

counter = counter + st || counter + 1;
st
未定义
意味着
计数器+st
NaN
,该值为false,因此有效运行

counter = counter + 1;
这相当于

counter += (st || (counter + 1));
if(st) {
    counter = counter + st;
}
else {
    counter = counter + counter + 1;
}
counter = (counter + st ) || (counter + 1);
if(counter + st) {
    counter = counter + st;
}
else {
    counter = counter + 1;
}
counter = counter * 2 + 1;
counter += 1;
但是,这只是偶然发生的。如果使用不同的参数调用函数,例如:

功能范围(开始、结束、st){
var-arr=[];
var计数器=启动;
而(counter的区别在于

counter += st || counter + 1;
意思与

counter = counter + (st || counter + 1);
counter=counter+st | | counter+1
表示
counter=(counter+st)| |(counter+1)


在您的示例中,代码
st
undefined
,因此循环有效地执行

counter += counter + 1;
每次,这相当于

counter += (st || (counter + 1));
if(st) {
    counter = counter + st;
}
else {
    counter = counter + counter + 1;
}
counter = (counter + st ) || (counter + 1);
if(counter + st) {
    counter = counter + st;
}
else {
    counter = counter + 1;
}
counter = counter * 2 + 1;
counter += 1;
因此,大型跳过


另一方面,在

counter = counter + st || counter + 1;
st
未定义
意味着
计数器+st
NaN
,该值为false,因此有效运行

counter = counter + 1;
这相当于

counter += (st || (counter + 1));
if(st) {
    counter = counter + st;
}
else {
    counter = counter + counter + 1;
}
counter = (counter + st ) || (counter + 1);
if(counter + st) {
    counter = counter + st;
}
else {
    counter = counter + 1;
}
counter = counter * 2 + 1;
counter += 1;
但是,这只是偶然发生的。如果使用不同的参数调用函数,例如:

功能范围(开始、结束、st){
var-arr=[];
var计数器=启动;

虽然(如果您显示它给您的是什么,与您期望的是什么,计数器可能会有帮助,因为运算符优先级。@crayonstreamit假设在未提供
st
的情况下为计数器添加1,因为它将是未定义的,如果您显示它给您的是什么,与您期望的是什么,因为运算符优先级。@crayonstreamit假设添加。)1如果未提供
st
,则计数器,因为它将未定义