1
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" 

Вопрос: При использовании оператора ternary он оценивает самый правый член правого операнда? Поэтому, если я помещаю запятые, тогда это займет выражение самой правой запятой.Приоритет привязки оператора к переменному

Если бы я вызвал этот процесс, чтобы он каким-то образом оценил второй самый правый член (Q2).

Является ли все ложное предложение назначенным переменной? Если да, то как получается выход только stop.html и не включает Sorry или You are much too young!?

+1

Q: Почему вы тратите время на что-то такое извращенное? Для «реального кода» вы хотите попытаться * избежать неопределенного поведения, не так ли? ПРЕДЛОЖЕНИЕ: 1) замените «Console.log()» на «alert()», 2) выполните код под отладчиком, 3) обязательно попробуйте несколько разных браузеров. Например, работает ли Chrome иначе, чем FF/Firebug? IE11 по-разному от IE8? – paulsm4

+0

Ваш код отлично работает для меня. Убедитесь, что всплывающие окна включены. – dYale

+0

Это просто потому, что все утверждения выполняются, но назначается только последний возврат. Если вы будете использовать оператор '||' вместо ',', то он остановится при первом значении со значением. Но да, это похоже на вариант использования _wrong_ для тройного оператора. – somethinghere

ответ

2

Я пишу этот маленький блок кода, чтобы продемонстрировать теперь тройные работы.

Учитывая код ниже:

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; 
} 

Или (||) Сценарий 1

// 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); 

Выход:

in isGreater 
in times2 
x1 is 10 

Или (||) Сценарий 2

// 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); 

Выход:

in isGreater 
in isLess 
in times2 
x2 is 20 

А (& &) Сценарий 1

// 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); 

Выход:

in isGreater 
in isLess 
in times2 
x3 is 40 

А (& &) Сценарий 2

// 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); 

Выход:

in isGreater 
in times3 
x4 is 90