cross browser matchesSelector [duplicate]

Чтобы ответить на этот вопрос Мэттом Коннолли, это более безопасный способ обновить локальные ссылки, которые можно быстро перенаправить, не проверяя ветвь. Он не обновляет ветви, которые не могут быть быстро перенаправлены (т. Е. Расходились), и не обновляет ветвь, которая в настоящее время проверена (потому что тогда рабочая копия также должна быть обновлена).

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
269
задан Bergi 22 October 2015 в 09:15
поделиться

12 ответов

Для объяснения см. оценку короткого замыкания . Это общий способ реализации этих операторов; он не уникален для JavaScript.

171
ответ дан Lightness Races in Orbit 23 August 2018 в 01:21
поделиться
  • 1
    Просто помните о «gotcha», который является последним, который всегда будет назначен, даже если они все неопределенные, null или false. Установка того, что вы знаете, не является ложной, нулевой или неопределенной в конце цепочки, является хорошим способом оповестить, что ничего не найдено. – Erik Reppen 29 August 2011 в 17:51
  • 2
    Я видел эту технику в течение многих лет, но то, что нападало на меня именно тогда, когда я хотел ее использовать, заключается в том, что результат выражения не переводится в boolean. Вы не можете выполнить if( true == f ). Если целое число было сохранено в f, то этот тест всегда будет возвращать false. – user 1 August 2013 в 03:11
  • 3
    На самом деле вы можете сделать if(true == f), что совпадает с if(f): тест пройдет. Если вы хотите также протестировать type f, используйте строгое сравнение: if(true === f), что действительно не удастся. – Alsciende 6 June 2016 в 09:44
  • 4
    Да, оценка короткого замыкания является общей. Но различие здесь заключается в том, как JavaScript возвращает последнее значение, которое остановило выполнение. Ответ Анурага намного лучше объясняет это. – Ben.12 1 December 2017 в 22:58

Согласно сообщению Биг Хиггинс ; Идиальная логика логического ИЛИ Javascript (февраль 2007 г.), это поведение истинно с v1.2 (по крайней мере)

. Он также предлагает другое использование для него (цитируется): «легкая нормализация различий между браузерами»

// determine upon which element a Javascript event (e) occurred
var target = /*w3c*/ e.target || /*IE*/ e.srcElement;
0
ответ дан Alon Brontman 23 August 2018 в 01:21
поделиться

Переменные Javascript не печатаются, поэтому f может быть назначено целочисленное значение, даже если оно было назначено с помощью логических операторов.

f присваивается ближайшее значение, которое не эквивалентно false . Итак, 0, false, null, undefined, все переданы:

alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4'
41
ответ дан Alsciende 23 August 2018 в 01:21
поделиться
  • 1
    Не забывайте, что в этом случае значение '' также равно false. – FakeRainBrigand 4 April 2013 в 18:07
  • 2
    Upvote для указания на то, что f is assigned the NEAREST value, что является довольно важным моментом здесь. – steviejay 6 June 2016 в 03:45
  • 3
    & Quot; Ближайший & Quot; не совсем верно, хотя у этого и есть этот внешний вид. Оператор boolean ||, являющийся булевым оператором, имеет два операнда: левую и правую. Если левая сторона || правка , операция разрешается с левой стороны, а правая сторона игнорируется. Если левая сторона falsy , она переходит в правую сторону. Таким образом, 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.

1
ответ дан Andris 23 August 2018 в 01:21
поделиться
  • 1
    это не верно! если (x) {z = x; } else {z = y;}, если первое значение ложно, второе значение всегда назначается не зависящим от фактического значения. – evilpie 21 June 2010 в 21:13
  • 2
    За исключением того, что я думаю, что он просто назначает y в z, если x является false . Это то, как это работает для меня в FF, конечно, это тоже зависит от реализации. – tvanfosson 21 June 2010 в 21:15
  • 3
    Последняя часть о возврате false неверна (каламбур не предназначен). Если первое значение ложно, оператор || просто возвращает второе значение, независимо от того, является ли оно правдивым или нет. – Matthew Crumley 21 June 2010 в 21:15
  • 4
    -1. Ваш эквивалентный фрагмент кода является точным, но важно то, что z получает значение x, если это значение правдиво . В противном случае он будет установлен в значение y. Это означает, что если x установлен, например, 0 или пустая строка "", это не делает то, что вы говорите, поскольку эти значения falsy . – Daniel Cassidy 27 September 2010 в 17:56

Вернуть выходное истинное значение.

Если все ложные, верните последнее ложное значение.

Пример: -

  null || undefined || false || 0 || 'apple'  // Return apple
4
ответ дан Arshid KV 23 August 2018 в 01:21
поделиться

Это делается для присвоения значения по умолчанию , в этом случае значение y, если переменная x является falsy .

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

Логический оператор OR (||) возвращает значение своего второго операнда, если первый один является ложным, в противном случае возвращается значение первого операнда.

Например:

"foo" || "bar"; // returns "foo"
false || "bar"; // returns "bar"

Значения Falsy - это те, кто принуждает false при использовании в булевом контексте, и они 0, null, undefined, пустая строка, NaN и, конечно, false.

148
ответ дан CMS 23 August 2018 в 01:21
поделиться
  • 1
    +1 Есть ли еще такой оператор? Или || исключение. – OscarRyz 21 June 2010 в 22:13
  • 2
    @Support (@Oscar): оператор Logical && имеет аналогичное поведение, он возвращает значение первого операнда, если он сам по себе falsy и возвращает значение второго операнда, только если первый является правдой , например ("foo" && "bar") == "bar" и (0 && "bar") == 0 – CMS 21 June 2010 в 22:18
  • 3
    Falsy на самом деле является техническим термином. – ChaosPandion 22 June 2010 в 03:36
  • 4
    Итак, мы узнали о ||, & amp; & amp ;, "Falsy" и "Поистине" в этом посте. Лучший ответ с "скрытым" дары. – Alex 20 August 2015 в 12:36
  • 5
    @Alex NB: "Truthy" (& Quot;! Действительно & Quot;) – Bumpy 3 December 2016 в 07:20

В этом нет волшебства. Булевы выражения, такие как a || b || c || d, оцениваются лениво. Interpeter ищет значение a, он не определен, поэтому он является ложным, поэтому он перемещается, а затем видит b, который является нулевым, что по-прежнему дает ложный результат, поэтому он перемещается, а затем видит c - ту же историю. Наконец, он видит d и говорит: «Да, это не null, поэтому у меня есть результат», и он присваивает его конечной переменной.

Этот трюк будет работать на всех динамических языках, схема оценки булевых выражений. В статических языках он не будет компилироваться (ошибка типа). В языках, которые стремятся оценить булевы выражения, оно вернет логическое значение (т. Е. True в этом случае).

30
ответ дан Marcin 23 August 2018 в 01:21
поделиться
  • 1
    В довольно статическом языке C # можно использовать оператор á la: объект f = a ?? b ?? c ?? d ?? е; – herzmeister 20 January 2010 в 12:14
  • 2
    herzmeister - спасибо! Я этого не знал ??? оператор может быть скован в C # и использоваться в ленивых методах оценки – Marek 8 March 2012 в 10:49
  • 3
    Как уже упоминалось в другом месте, последний d будет назначен независимо от того, был ли он null / undefined или нет. – BlackVegetable 2 July 2013 в 18:17
  • 4
    Одна небольшая коррекция: оператор || всегда разрешает весь правый операнд, когда левая сторона является ложной. Будучи булевым оператором, он видит только два входа: левую и правую. Парсер не видит их как ряд терминов, поэтому фактически не останавливается, когда находит первое значение правды , если это значение также является левым операндом другого ||. – devios1 16 October 2017 в 16:38

Javacript использует оценку короткого замыкания для логических операторов || и &&. Однако он отличается от других языков тем, что возвращает результат последнего значения, которое остановило выполнение, вместо значения true или false.

Следующие значения считаются ложными в JavaScript .

  • false
  • null
  • "" (пустая строка)
  • 0
  • Nan
  • undefined

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

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.".

96
ответ дан Marjan Venema 23 August 2018 в 01:21
поделиться
  • 1
    Это лучший ответ, на мой взгляд, из-за следующего объяснения: 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
  • 2
    @mastazi Да, это должно получиться жирным шрифтом IMHO. – noober 25 January 2016 в 00:51
  • 3
    Должен быть ответ, он показывает значения, выбранные в тестовых случаях. – 707 14 September 2016 в 10:15

Он устанавливает новую переменную (z) как значение x, если оно «правдиво» (отличное от нуля, действительный объект / массив / функция / что бы это ни было) или y в противном случае. Это относительно распространенный способ предоставления значения по умолчанию в случае, если x не существует.

Например, если у вас есть функция, которая принимает необязательный параметр обратного вызова, вы можете предоставить обратный вызов по умолчанию, который не работает ничего не делать:

function doSomething(data, callback) {
    callback = callback || function() {};
    // do stuff with data
    callback(); // callback will always exist
}
4
ответ дан Matthew Crumley 23 August 2018 в 01:21
поделиться

Он будет оценивать X и, если X не является нулевым, пустая строка или 0 (логическая ложь), то она назначит ее z. Если X является нулевым, пустая строка или 0 (логическая ложь), то она назначит y для z.

var x = '';
var y = 'bob';
var z = x || y;
alert(z);

Выведет 'bob';

0
ответ дан tvanfosson 23 August 2018 в 01:21
поделиться
  • 1
    Вы должны уточнить, что вы подразумеваете под «пустым». Пустые строки принуждают к false, но пустые массивы или объекты принуждают к true. – Daniel Cassidy 27 September 2010 в 17:58
  • 2
    @Daniel "null, empty или 0" - null применительно к массивам и объектам. Но точка взята. – tvanfosson 27 September 2010 в 18:01

Его называют оператором короткого замыкания.

. Оценка короткого замыкания говорит, что второй аргумент выполняется или оценивается только в том случае, если первый аргумент недостаточен для определения значения выражения. когда первый аргумент функции 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`
1
ответ дан Vijay 23 August 2018 в 01:21
поделиться

Этот вопрос уже получил несколько хороших ответов.

Таким образом, этот метод использует преимущества того, как язык компилируется. То есть JavaScript «коротких замыканий» оценивает булевы операторы и возвращает значение, связанное либо с первым значением не-ложной переменной, либо с любой последней переменной. См. Объяснение Анурага этих значений, которые будут оцениваться как ложные.

Использование этого метода не является хорошей практикой по нескольким причинам;

  1. Чтение кода: это использование булевых операторов, и если поведение того, как эти компиляции не поняты, ожидаемым результатом будет логическое значение.
  2. Стабильность: это использование функции того, как язык компилируется, который несовместим на нескольких языках, и из-за этого это потенциально может быть нацелено на изменения в будущем.
  3. Документированные функции: существует существующую альтернативу, которая удовлетворяет эту потребность и согласуется с другими языками. Это был бы тернарный оператор: ()? Значение 1: Значение 2.

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

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
8
ответ дан WSimpson 23 August 2018 в 01:21
поделиться
  • 1
    potentially be targeted for change in the future. да, но я не применим для javascript. – 707 14 September 2016 в 10:17
  • 2
    Пришел сюда и увидел все вышеприведенные ответы и подумал про себя, что что-то просто отключилось от задания. Я только что читал «Чистый код» Роберта С Мартина, и этот тип задания определенно нарушает «Не имеют побочных эффектов». правило ... хотя сам автор утверждает, что его книга является лишь одним из многих методов создания хорошего кода, я все еще удивлялся, что никто другой не возражал против такого рода присвоений. +1 – Albert Rothman 20 September 2016 в 23:50
  • 3
    Спасибо за ответ. Я думаю, что больше людей должны учитывать побочные эффекты при написании кода, но пока кто-то потратил много времени на поддержание кода других людей. Они часто не считают это. – WSimpson 27 September 2016 в 13:53
  • 4
    Вы действительно думаете, что чудовище яснее, чем a || b || c || d || e? – devios1 16 October 2017 в 16:41
  • 5
    @AlbertRothman Я не вижу никаких побочных эффектов. Ничто не мутируется. Это просто сокращение нулевого коалесценции, что является довольно распространенной функцией на многих языках. – devios1 16 October 2017 в 16:43
Другие вопросы по тегам:

Похожие вопросы: