2013-03-08 3 views
0

Я не понимаю, как это работает стенографии:Смущенный этим Javascript обсчитывать

nodes.forEach(function(o, i) { 
    o.y += i & 1 ? k : -k; 
    o.x += i & 2 ? k : -k; 
}); 

Я никогда не видел, оператор инкремента в сокращенном, как это.

Благодаря

+0

Какая часть это хлопотно? Это 'a? b: c' (тройной оператор)? Или это '&' (побитовое и)? – mwcz

+0

@mwcz: Это [условный оператор] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Conditional_Operator). –

+0

@MarcelKorpel Ответ Guffa объясняет это :) – mwcz

ответ

1

1 является 0000...0001

2 является 0000...0010

i вероятно хранит набор флагов, установленных в качестве битов на в междунар.

i & 1 просто проверяет, что последний бит установлен, и i & 2 проверяет, установлен ли один из них. См. the MDN on bitwise operators.

Вы можете хранить около 52 флагов в яваскрипте числа, используя эту систему:

i = 0; // no flag 
i |= 4; // sets a flag 
i |= 1<<2; // sets the same flag but is more readable 
var bool = i & 4; // truish if the flag is set 

Так что ваш код делает это:

if i has flag 1 then o.y += k else o.y += -k 
if i has flag 2 then o.x += k else o.x += -k 
+0

Это может быть тест для четного/нечетного? (Я не говорю, что это хороший тест), если я нечетный, а затем увеличиваю oy на k else, уменьшаю oy на k –

+0

Нет, второй тест не имеет ничего общего с странностью, он действительно выглядит как хранилище флагов (что было очень распространено в С). –

2

Выражение i & 1 ? k : -k оценивает либо k или -k в зависимости от того, i & 1 - true или нет.

Оператор & выполняет побитовое «и» между операторами, поэтому первое условие проверяет, установлен ли младший значащий бит, а второе условие проверяет, установлен ли второй младший значащий бит.

код делает то же самое, как:

nodes.forEach(function(o, i) { 
    if (i & 1) { 
    o.y += k; 
    } else { 
    o.y -= k; 
    } 
    if (i & 2) { 
    o.x += k; 
    } else { 
    o.x -= k; 
    } 
}); 
Смежные вопросы