Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.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_Variable Assignment_Ternary Operator_Conditional Operator_Operator Precedence - Fatal编程技术网

Javascript 变量的三元运算符赋值优先级

Javascript 变量的三元运算符赋值优先级,javascript,variable-assignment,ternary-operator,conditional-operator,operator-precedence,Javascript,Variable Assignment,Ternary Operator,Conditional Operator,Operator Precedence,问题:当使用三元运算符时,它是否计算右操作数的最右项?所以如果我加上逗号,那么它将采用最右边的逗号的表达式 如果我以某种方式反对这个过程,它会评估第二个最右边的术语(Q2) 是否所有false子句都分配给变量?如果是这样的话,为什么输出只是stop.html,而不包括Sorry或您太年轻了?我正在写这段代码来演示三元代码 鉴于以下代码: var url = age > 18 ? ( alert("OK, you can go."), // alert returns "un

问题:当使用
三元
运算符时,它是否计算右操作数的最右项?所以如果我加上逗号,那么它将采用最右边的逗号的表达式

如果我以某种方式反对这个过程,它会评估第二个最右边的术语(Q2)


是否所有false子句都分配给变量?如果是这样的话,为什么输出只是
stop.html
,而不包括
Sorry
您太年轻了

我正在写这段代码来演示三元代码

鉴于以下代码:

var url = age > 18 ? (
    alert("OK, you can go."),
    // alert returns "undefined", but it will be ignored because
    // isn't the last comma-separated value of the parenthesis
    "continue.html" // the value to be assigned if age > 18
) : (
    alert("You are much too young!"),
    alert("Sorry :-("), // Q2) ***When does it evaluate this line?
    // etc. etc.
    "stop.html" // the value to be assigned if !(age > 18) Q1) this line is evaluated first right?
);
location.assign(url); // "stop.html"
输出:

// 1. isGreater is called and return true (since true so isLess is never called)
// 2. since true, only times2 is called
var x1 = isGreater(1, 0) || isLess(1, 0) ? times2(5) : times3(5);
console.log('x1 is ' + x1);
// 1. isGreater is called, but return false
// 2. so isLess is called and return true
// 3. since true, only times2 is called
var x2 = isGreater(0, 1) || isLess(0, 1) ? times2(10) : times3(10);
console.log('x2 is ' + x2);
// 1. isGreater is called and return true
// 2. because true, isLess is called and return true
// 3. since both are true, only times2 is called
var x3 = isGreater(1, 0) && isLess(0, 1) ? times2(20) : times3(20);
console.log('x3 is ' + x3);
// 1. isGreater is called, but return false (since false, isLess is never called)
// 2. since false, only times3 is called
var x4 = isGreater(0, 1) && isLess(0, 1) ? times2(30) : times3(30);
console.log('x4 is ' + x4);
或者(| |)场景2

in isGreater
in times2
x1 is 10
in isGreater
in isLess
in times2
x3 is 40
输出:

// 1. isGreater is called and return true (since true so isLess is never called)
// 2. since true, only times2 is called
var x1 = isGreater(1, 0) || isLess(1, 0) ? times2(5) : times3(5);
console.log('x1 is ' + x1);
// 1. isGreater is called, but return false
// 2. so isLess is called and return true
// 3. since true, only times2 is called
var x2 = isGreater(0, 1) || isLess(0, 1) ? times2(10) : times3(10);
console.log('x2 is ' + x2);
// 1. isGreater is called and return true
// 2. because true, isLess is called and return true
// 3. since both are true, only times2 is called
var x3 = isGreater(1, 0) && isLess(0, 1) ? times2(20) : times3(20);
console.log('x3 is ' + x3);
// 1. isGreater is called, but return false (since false, isLess is never called)
// 2. since false, only times3 is called
var x4 = isGreater(0, 1) && isLess(0, 1) ? times2(30) : times3(30);
console.log('x4 is ' + x4);
和(&&)场景1

function isGreater(a, b) {
    console.log('in isGreater');
    return a > b;
}

function isLess(a, b) {
    console.log('in isLess');
    return a < b;
}

function times2(v) {
    console.log('in times2');
    return v * 2;
}

function times3(v) {
    console.log('in times3');
    return v * 3;
}
in isGreater
in isLess
in times2
x2 is 20
输出:

// 1. isGreater is called and return true (since true so isLess is never called)
// 2. since true, only times2 is called
var x1 = isGreater(1, 0) || isLess(1, 0) ? times2(5) : times3(5);
console.log('x1 is ' + x1);
// 1. isGreater is called, but return false
// 2. so isLess is called and return true
// 3. since true, only times2 is called
var x2 = isGreater(0, 1) || isLess(0, 1) ? times2(10) : times3(10);
console.log('x2 is ' + x2);
// 1. isGreater is called and return true
// 2. because true, isLess is called and return true
// 3. since both are true, only times2 is called
var x3 = isGreater(1, 0) && isLess(0, 1) ? times2(20) : times3(20);
console.log('x3 is ' + x3);
// 1. isGreater is called, but return false (since false, isLess is never called)
// 2. since false, only times3 is called
var x4 = isGreater(0, 1) && isLess(0, 1) ? times2(30) : times3(30);
console.log('x4 is ' + x4);
和(&&)场景2

in isGreater
in times2
x1 is 10
in isGreater
in isLess
in times2
x3 is 40
输出:

// 1. isGreater is called and return true (since true so isLess is never called)
// 2. since true, only times2 is called
var x1 = isGreater(1, 0) || isLess(1, 0) ? times2(5) : times3(5);
console.log('x1 is ' + x1);
// 1. isGreater is called, but return false
// 2. so isLess is called and return true
// 3. since true, only times2 is called
var x2 = isGreater(0, 1) || isLess(0, 1) ? times2(10) : times3(10);
console.log('x2 is ' + x2);
// 1. isGreater is called and return true
// 2. because true, isLess is called and return true
// 3. since both are true, only times2 is called
var x3 = isGreater(1, 0) && isLess(0, 1) ? times2(20) : times3(20);
console.log('x3 is ' + x3);
// 1. isGreater is called, but return false (since false, isLess is never called)
// 2. since false, only times3 is called
var x4 = isGreater(0, 1) && isLess(0, 1) ? times2(30) : times3(30);
console.log('x4 is ' + x4);

问:你为什么在这么反常的事情上浪费时间?对于“真实代码”,您希望尽量避免不确定的行为,不是吗?建议:1)将“alert()”替换为“Console.log()”,2)在调试器下逐步执行代码,3)确保尝试几种不同的浏览器。例如,Chrome的行为是否与FF/Firebug不同?IE11和IE8不同?你的代码对我来说很好。确保启用了弹出窗口。这只是因为所有语句都已执行,但只分配了最后一次返回。如果要使用
|
运算符而不是
则它将在第一个值处停止,并带有一个值。但是是的,这似乎是三元运算符的错误用例。