Чтобы ответить на этот вопрос Мэттом Коннолли, это более безопасный способ обновить локальные ссылки, которые можно быстро перенаправить, не проверяя ветвь. Он не обновляет ветви, которые не могут быть быстро перенаправлены (т. Е. Расходились), и не обновляет ветвь, которая в настоящее время проверена (потому что тогда рабочая копия также должна быть обновлена).
git fetch
head="$(git symbolic-ref HEAD)"
git for-each-ref --format="%(refname) %(upstream)" refs/heads | while read ref up; do
if [ -n "$up" -a "$ref" != "$head" ]; then
mine="$(git rev-parse "$ref")"
theirs="$(git rev-parse "$up")"
base="$(git merge-base "$ref" "$up")"
if [ "$mine" != "$theirs" -a "$mine" == "$base" ]; then
git update-ref "$ref" "$theirs"
fi
fi
done
Для объяснения см. оценку короткого замыкания . Это общий способ реализации этих операторов; он не уникален для JavaScript.
Согласно сообщению Биг Хиггинс ; Идиальная логика логического ИЛИ Javascript (февраль 2007 г.), это поведение истинно с v1.2 (по крайней мере)
. Он также предлагает другое использование для него (цитируется): «легкая нормализация различий между браузерами»
// determine upon which element a Javascript event (e) occurred
var target = /*w3c*/ e.target || /*IE*/ e.srcElement;
Переменные Javascript не печатаются, поэтому f может быть назначено целочисленное значение, даже если оно было назначено с помощью логических операторов.
f присваивается ближайшее значение, которое не эквивалентно false . Итак, 0, false, null, undefined, все переданы:
alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4'
''
также равно false.
– FakeRainBrigand
4 April 2013 в 18:07
f is assigned the NEAREST value
, что является довольно важным моментом здесь.
– steviejay
6 June 2016 в 03:45
||
, являющийся булевым оператором, имеет два операнда: левую и правую. Если левая сторона ||
правка i>, операция разрешается с левой стороны, а правая сторона игнорируется. Если левая сторона falsy i>, она переходит в правую сторону. Таким образом, null || undefined || 4 || 0
фактически разрешает undefined || 4 || 0
, который разрешает 4 || 0
, который разрешает 4
.
– devios1
16 October 2017 в 16:26
Это означает, что если x
установлено, значение для z
будет x
, в противном случае, если y
установлено, тогда его значение будет установлено как значение z
.
это то же самое, что и
if(x)
z = x;
else
z = y;
. Это возможно, потому что логические операторы в JavaScript не возвращают логические значения, а значение последнего элемента, необходимого для завершения операции (в предложении OR это первое недопустимое значение, в предложении AND это будет последнее). Если операция завершается с ошибкой, возвращается false
.
||
просто возвращает второе значение, независимо от того, является ли оно правдивым или нет.
– Matthew Crumley
21 June 2010 в 21:15
z
получает значение x
, если это значение правдиво i>. В противном случае он будет установлен в значение y
. Это означает, что если x
установлен, например, 0
или пустая строка ""
, это не делает то, что вы говорите, поскольку эти значения falsy i>.
– Daniel Cassidy
27 September 2010 в 17:56
Вернуть выходное истинное значение.
Если все ложные, верните последнее ложное значение.
Пример: -
null || undefined || false || 0 || 'apple' // Return apple
Это делается для присвоения значения по умолчанию , в этом случае значение y
, если переменная x
является falsy .
Логические операторы в JavaScript могут возвращать операнд, а не всегда логический результат, как и на других языках.
Логический оператор OR (||
) возвращает значение своего второго операнда, если первый один является ложным, в противном случае возвращается значение первого операнда.
Например:
"foo" || "bar"; // returns "foo"
false || "bar"; // returns "bar"
Значения Falsy - это те, кто принуждает false
при использовании в булевом контексте, и они 0
, null
, undefined
, пустая строка, NaN
и, конечно, false
.
&&
имеет аналогичное поведение, он возвращает значение первого операнда, если он сам по себе falsy i> и возвращает значение второго операнда, только если первый является правдой i>, например ("foo" && "bar") == "bar"
и (0 && "bar") == 0
– CMS
21 June 2010 в 22:18
В этом нет волшебства. Булевы выражения, такие как a || b || c || d
, оцениваются лениво. Interpeter ищет значение a
, он не определен, поэтому он является ложным, поэтому он перемещается, а затем видит b
, который является нулевым, что по-прежнему дает ложный результат, поэтому он перемещается, а затем видит c
- ту же историю. Наконец, он видит d
и говорит: «Да, это не null, поэтому у меня есть результат», и он присваивает его конечной переменной.
Этот трюк будет работать на всех динамических языках, схема оценки булевых выражений. В статических языках он не будет компилироваться (ошибка типа). В языках, которые стремятся оценить булевы выражения, оно вернет логическое значение (т. Е. True в этом случае).
d
будет назначен независимо от того, был ли он null / undefined или нет.
– BlackVegetable
2 July 2013 в 18:17
||
всегда разрешает весь правый операнд, когда левая сторона является ложной. Будучи булевым оператором, он видит только два входа: левую и правую. Парсер не видит их как ряд терминов, поэтому фактически не останавливается, когда находит первое значение правды , если i> это значение также является левым операндом другого ||
.
– devios1
16 October 2017 в 16:38
Javacript использует оценку короткого замыкания для логических операторов ||
и &&
. Однако он отличается от других языков тем, что возвращает результат последнего значения, которое остановило выполнение, вместо значения true
или false
.
Следующие значения считаются ложными в JavaScript .
""
(пустая строка) Игнорируя правила приоритета оператора и сохраняя простые вещи, следующие примеры показывают, какое значение остановило оценку и возвращается в результате.
false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"
Первые 5 значений до NaN
являются ложными, поэтому все они оцениваются слева направо, пока не встретит первое правное значение - "Hello"
, которое делает все выражение true, поэтому ничего дальше не будет оцениваться, а "Hello"
возвращается в результате выражения. Аналогично, в этом случае:
1 && [] && {} && true && "World" && null && 2010 // null
Первые 5 значений являются правдивыми и оцениваются до тех пор, пока они не удовлетворяют первому значению фальши (null
), которое делает выражение ложным, поэтому 2010
isn ' t больше, и null
возвращается в результате выражения.
Приведенный вами пример использует это свойство JavaScript для выполнения задания. Его можно использовать везде, где вам нужно получить первое значение правды или ложности среди набора значений. Этот код ниже присваивает значение "Hello"
b
, поскольку он упрощает назначение значения по умолчанию вместо выполнения проверок if-else.
var a = false;
var b = a || "Hello";
Вы можете вызвать приведенный ниже пример использование этой функции, и я считаю, что это делает код более трудным для чтения.
var messages = 0;
var newMessagesText = "You have " + messages + " messages.";
var noNewMessagesText = "Sorry, you have no new messages.";
alert((messages && newMessagesText) || noNewMessagesText);
Внутри предупреждения мы проверяем, является ли messages
ложным, и если да, то оцените и верните noNewMessagesText
, иначе оцените и верните newMessagesText
. Поскольку в этом примере это ложь, мы останавливаемся на noNewMessagesText и предупреждаем "Sorry, you have no new messages."
.
However, it's different to other languages in that it returns the result of the last value that halted the execution, instead of a true, or false value.
– mastazi
28 December 2015 в 04:48
Он устанавливает новую переменную (z
) как значение x
, если оно «правдиво» (отличное от нуля, действительный объект / массив / функция / что бы это ни было) или y
в противном случае. Это относительно распространенный способ предоставления значения по умолчанию в случае, если x
не существует.
Например, если у вас есть функция, которая принимает необязательный параметр обратного вызова, вы можете предоставить обратный вызов по умолчанию, который не работает ничего не делать:
function doSomething(data, callback) {
callback = callback || function() {};
// do stuff with data
callback(); // callback will always exist
}
Он будет оценивать X и, если X не является нулевым, пустая строка или 0 (логическая ложь), то она назначит ее z. Если X является нулевым, пустая строка или 0 (логическая ложь), то она назначит y для z.
var x = '';
var y = 'bob';
var z = x || y;
alert(z);
Выведет 'bob';
false
, но пустые массивы или объекты принуждают к true
.
– Daniel Cassidy
27 September 2010 в 17:58
Его называют оператором короткого замыкания.
. Оценка короткого замыкания говорит, что второй аргумент выполняется или оценивается только в том случае, если первый аргумент недостаточен для определения значения выражения. когда первый аргумент функции OR (||) имеет значение true, общее значение должно быть истинным.
Его также можно использовать для установки значения по умолчанию для аргумента функции. `
function theSameOldFoo(name){
name = name || 'Bar' ;
console.log("My best friend's name is " + name);
}
theSameOldFoo(); // My best friend's name is Bar
theSameOldFoo('Bhaskar'); // My best friend's name is Bhaskar`
Этот вопрос уже получил несколько хороших ответов.
Таким образом, этот метод использует преимущества того, как язык компилируется. То есть JavaScript «коротких замыканий» оценивает булевы операторы и возвращает значение, связанное либо с первым значением не-ложной переменной, либо с любой последней переменной. См. Объяснение Анурага этих значений, которые будут оцениваться как ложные.
Использование этого метода не является хорошей практикой по нескольким причинам;
Использование тернарного оператора требует немного большего набора текста, но оно четко различает вычисляемое булево выражение и назначаемое значение. Кроме того, он может быть закодирован, поэтому типы выполнения по умолчанию, выполняемые выше, могут быть воссозданы.
var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';
var f = ( a ) ? a :
( b ) ? b :
( c ) ? c :
( d ) ? d :
e;
alert(f); // 4
potentially be targeted for change in the future.
да, но я не применим для javascript.
– 707
14 September 2016 в 10:17
a || b || c || d || e
?
– devios1
16 October 2017 в 16:41
if( true == f )
. Если целое число было сохранено в f, то этот тест всегда будет возвращать false. – user 1 August 2013 в 03:11if(true == f)
, что совпадает сif(f)
: тест пройдет. Если вы хотите также протестировать type i>f
, используйте строгое сравнение:if(true === f)
, что действительно не удастся. – Alsciende 6 June 2016 в 09:44