Почему while (i) – более краткий вариант while (i != 0)?
Внутри скобок while( ) выражение приводится к одному из двух: true или false.  Цикл крутится, пока в скобках всё ещё получается true.

Например:var i = 5;

i != 0            // true, вальсируем дальше
5                 // любое ненулевое число становится true
"yes"             // непустая строка тоже true
{a: "A", b: "B"}  // объекты всегда true

0                 // false
""                // пустая строка, false
undefined         // false
null              // false
NaN               // false

Насчёт чисел ещё раз: только 0 даёт false, остальные числа true.
Именно поэтому там, где интересует сравнение числа с нулём, удобно-коротко писать прямо число.

ЕщёЕщё откройте для себя логические операторы &&, ||, ! их можно использовать не только для проверки двойных условий, но и, например, задавать значение на случай нуля:var a = 0;

var b = a || 42; // если a пустое. то в b попадёт запасное значение 42.

А вот короткий способ привести любое значение к true или false, как внутри скобок while(): дописать перед ним два восклицательных знака!!expressionТут дважды применяется ! – логическое НЕ, которое уже при первом применении сделает из выражения true или false, только зеркально наоборот, и нужен ещё один перевёртыш, чтобы получить задуманное значение.
while проверяет условие, которое является типом boolean со значениями true или false. При этом while продолжает крутить цикл пока это значение истинно. Если значение становится false, цикл прекращается. В JS false значение представлено в том числе нулём. Другими словами, когда while обращается к вычислению значения выражения i!=0, он получает false, т.е. 0, если i==0. В случае же обращения к i напрямую while получает false или 0 сразу как значение переменной i.