Почему в результате получается 1?

194
01 февраля 2019, 07:00
function one(foo) { return 1 + foo || 1 }
function minus(bar) { return - bar}
console.log(one(minus(one())));
Answer 1

Чтобы понять результат конечного выражения, нужно выполнить его по шагам и посмотреть результат на каждом шаге.

Выражение one(minus(one())) можно представить в следующем виде:

var a = one();
var b = minus(a);
var c = one(b);

Посмотрим результат на каждом шаге:

  1. var a = one(). так как параметр one - undefined - (1 + undefined) || 1 -> NaN || 1 -> 1
  2. var b = minus(1). Результат -1
  3. var c = one(-1) -> (1 + (-1)) || 1 -> 0 || 1 -> 1

Почему так происходит?

Все это из-за того, что приоритет операции || меньше чем приоритет сложения.

ожидалось, что результат будет 0

Для этого необходимо поправить функцию one.

Вместо foo||1 нужно писать foo||0. Чтобы в случае отсутствия аргумента функция возвращала 1, а не 2 как сейчас:

function one(foo) { 
  return 1 + (foo || 0) 
} 
 
function minus(bar) { 
  return -bar 
} 
 
console.log(one(minus(one())));

Answer 2

Возьмите foo || 1 в скобки

function one(foo) { 
  return 1 + (foo || 1); 
} 
 
function minus(bar) { 
  return 0 - bar; 
} 
console.log(one(minus(one())));

Answer 3

У вас выполняется второе выражение, потому что внутренняя функция one() ничего не принимает. foo ничему не равен и, соответственно выполняется второе выражение. Просто надо подумать.

READ ALSO
Можно ли как-то воспроизвести JS из iframe на top window?

Можно ли как-то воспроизвести JS из iframe на top window?

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

194