Логика обратной импликации с использованием оператора возведения в степень в ES7?

По этой ссылке мы знаем

console.log(false ** false == true);  // true
console.log(false ** true == false);  // true
console.log(true ** false == true);  // true
console.log(true ** true == true);  // true

Я думаю, что мы можем реализовать обратную импликацию через exponentiation operator в ES7.

Учитывая возвращаемое значение функции f() и g() равно boolean. Итак, мы можем использовать эти простые коды

if (g() ** f()) { 
   // 
}

заменить

if ((g() && f()) || !f()) {
    //
}

Некоторые тестовые коды находятся здесь. Это действительно или нет под ES7?


comment
Даже если это действительно, какой смысл использовать это? Я не вижу, чтобы это сделало выражение более эффективным или более ясным.   -  person fuyushimoya    schedule 23.11.2015
comment
Вместо этого используйте g() || !f(), это намного читабельнее. Попробуйте: [[false, false], [false, true], [true, false], [true, true]].map(function(a) { return a[0] || !a[1]; })   -  person Amit    schedule 23.11.2015


Ответы (2)


Заявление:

if ((g() && f()) || !f()) {

Имеет несколько потенциально плохих последствий, связанных с механизмом короткого замыкания:

  1. если g() ложно, f() оценивается один раз, и отрицательный результат используется для ветвления.
  2. если g() соответствует действительности и первое f() также соответствует действительности, оценивается содержимое блока if.
  3. если g() истинно, а первое f() ложно, f() оценивается снова, что может быть дорогостоящей операцией и может возвращать совершенно другое значение, которое затем инвертируется и используется для ветвления.

Заявление:

if (g() ** f())

результаты в обеих функциях оцениваются ровно один раз, а затем результаты логически объединяются в ветвь.

В зависимости от требуемых побочных эффектов и / или порядка оценки вы должны использовать:

let gVal = g(), fVal = f();
if(gVal || !fVal) { ... }

Or

if(g() || !f()) { ... }

Сказав все это, чтобы ответить на сам вопрос... ECMAScript 2016 еще не доработан, но ваши предположения кажутся правильными.

person Amit    schedule 23.11.2015

Да, возведение в степень можно использовать для обратной импликации в ES6.

Вы можете проверить это здесь

person zahreelay    schedule 23.11.2015