2016-11-04 6 views
2

Недавно наткнулся на оценку короткого замыкания и был немного смущен этим, так как я только начал программировать на прошлой неделе. Из того, что я понимаю, если что-либо произойдет до того, как первый двойной канал станет истинным, тогда он остановится и не оценит, что произойдет после двойной трубы. Например:Разница между использованием тернарного оператора или просто оценкой короткого замыкания?

Пример 1:

var a = true; 
var b = a || {}; 

Так я предположу, если существует, то назначить б в противном случае б равно объект. Что я не понимаю, где я буду использовать это и как она отличается в тройном оператора, не оценка короткого замыкания такой же, как:

Пример 2:

var a = true; 
var b = (a) ? a : {}; 

Почему бы один используйте пример 1 над примером 2, поскольку он не является более медленным для записи или есть ли преимущество в скорости использования одного над другим? или это просто глупый вопрос, и, возможно, я чего-то не хватает. Если бы кто-то мог прояснить это для меня, это было бы здорово.

+2

это приводит лишь к вопросам, когда второй операнд имеет побочные эффекты. – Ergwun

+0

Используйте тот, который вы хотите. Время, которое вы уже потратили на размышления об этом, будет больше, чем любая совокупная разница в типизации или исполнении. –

+0

Kinda несвязанный, но в качестве эксперимента попробуйте сделать 'b = a && {};' и посмотреть, что происходит, и попытаться понять, почему это происходит. –

ответ

2

Существует несколько способов, позволяющих операторам короткого замыкания влиять на правильность и производительность.

Критическая вещь - избегать побочных эффектов или хитов производительности второго операнда.

Короткое замыкание может избежать ошибок лишь оценок второй операнда, когда это безопасно:

var a = a && someFunctionThatWillThrowIfAIsNull(a); 

Медленная функцию можно избежать, поместив его вторым, если результат ускоренной функции может сделать второй операнд излишним:

var a = someFastFunction() || someSlowFunction(); 
+0

Спасибо, дал мне больше понимания, чем раньше. –

0

Ниже приведен пример различных способов использования (в зависимости от первого параметра). Проверьте консоль для каждого из них, чтобы понять, как они работают.

console.log("'' || {}:", '' || {}); 
 
console.log("1 || {}:", 1 || {}); 
 
console.log("0 || {}:", 0 || {}); 
 
console.log("true || {}:", true || {}); 
 
console.log("false || {}:", false || {}); 
 
console.log("[] || {}:", [] || {}); 
 

 
console.log(''); 
 

 
console.log("('') ? '' : {}:", ('') ? '' : {}); 
 
console.log("(1) ? 1 : {}:", (1) ? 1 : {}); 
 
console.log("(0) ? 0 : {}:", (0) ? 0 : {}); 
 
console.log("(true) ? true : {}:", (true) ? true : {}); 
 
console.log("(false) ? false : {}:", (false) ? false : {}); 
 
console.log("([]) ? '' : {}:", ([]) ? [] : {}); 
 

 
console.log(''); 
 

 
console.log("'' && {}:", '' && {}); 
 
console.log("1 && {}:", 1 && {}); 
 
console.log("0 && {}:", 0 && {}); 
 
console.log("true && {}:", true && {}); 
 
console.log("false && {}:", false && {}); 
 
console.log("[] && {}:", [] && {});

+0

Спасибо за визуальную демонстрацию, я думаю, я просто не совсем понял, как работает короткое замыкание, но у меня есть лучшая идея, спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^