2017-02-02 11 views
2

Я пришел в этот код, но я не очень хорошо понимаю, что он делает ..Что возвращает void 0 === i && (i = 3), 0 === i? (..A ..): (..B ..) делаю?

test.update = function(i) 
{ 
return void 0 === i && (i = 3), 0 === i ? (..A..) : (..B..) 
} 

(..A ..) и (..B ..) просто другие строки кода, который я гавань 'т.

Предположим, что если i будет иметь значение 0, то функция вернется?

Что означает «void 0 === i & & (i = 3)« делать? Специально (i = 3). Означает ли это, что if (void 0 === i) является истинным и i может получить 3, i будет 3? А как насчет запятой? Я проверил это question, но я все еще не понимаю.

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

Спасибо

+1

Я думаю, он просто выполняет '(..B ..)' блок операторов независимо от 'проходится i' значение. – pttsky

+0

'void 0 === i' похоже, проверяет,' '' '' undefined'. 'i = 3' устанавливает' i' в число 3, когда 'i' не определено. – evolutionxbox

+0

'0 === i' проверяет,' '' '' 0', а затем выполняет либо '(..A ..)', либо '(..B ..)'. В этом возврате используется [запятая] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator) и [тройные операции] (https://developer.mozilla.org/ ан/Docs/Web/JavaScript/Справочник/Операторы/Conditional_Operator). – evolutionxbox

ответ

5

Хорошо, давайте сначала установить кронштейны в соответствии с operator precedence:

return (((void 0) === i) && (i = 3)), ((0 === i) ? A : B) 

Теперь одиночных операций

void 0 

просто возвращает undefined. Мы также могли бы написать так:

undefined === i 

, который, очевидно, проверяет ли i неопределен.

i = 3 

выглядит как сравнение первого, но на самом деле это задание, которое возвращает 3. Пока линия смотрит, не определена ли i, и в этом случае ей присваивается значение 3.

Теперь следующая запятая является оператором самостоятельно. Он оценивает все выражения слева направо и возвращает последний (самый правый). В этом случае последнее выражение представляет собой сравнение 0 и i. Значит, если i равно 0, то в этом случае возвращаемое значение всего выражения равно true.

В качестве последнего приходит условный оператор, который представляет собой короткий способ написать if .. else ...

Пока линия может быть также записана как:

if (i === undefined) { 
    i = 3; 
} 
if (i === 0) { 
    // return (A) 
} 
else { 
    // return (B) 
} 
1

Остальное важно, потому что void operator вычисляет выражение и возвращает undefined.

Например, если выражение является вызов функции, как

return void func(); 

то функция называется и void возвращает undefined, даже если func возвращается что-то другое.

2

Просто запустите его и видим, что первое, что не возвращается неопределенными, независимо от того, что остальные делает

если я === 0, запустить, еще запустить B, и если я == «», я = 3 -> бег б

var test= {} 
 
test.update = function(i) { 
 
    return void 0 === i && (i = 3), 0 === i ? (console.log(i,"a")) : (console.log(i,"b")) 
 
} 
 

 
console.log("i is null, res:"+test.update(null)); 
 
console.log("no i, res:"+test.update()); 
 
console.log("i blank, res:"+test.update("")); 
 
console.log("i=0,res:"+test.update(0)); 
 
console.log("i=1,res:"+test.update(1)); 
 
console.log("i=2,res:"+test.update(2)); 
 
console.log("i=3,res:"+test.update(3));

1

Я предполагаю, что это просто выполняет (..B ..) блок операторов независимо ценю пройдена.

  • void Оператор оценивает свой операнд, а затем возвращает undefined не в зависимости от результата оценки;
  • comma оператор просто оценивает одно, то другое, слева направо (как в var i = 0, j = 0;)
  • 0 === i && (i = 3) множеств i к 3 если i равен 0
  • 0 === i ? (..A..) : (..B..) выполняет A или B блок операторов, но, как было сказано выше, в настоящий момент гарантируется, что i не равен 0.

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

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