Если я читаю это право, то вы должны знать, что вы можете получить доступ к свойствам объекта, используя аналогичные обозначения скобок для массивов, что позволяет вам использовать переменную строку для ключа. Так, например, в вашем случае вы могли бы сделать:
let keyName = 'wiki';
games[i][keyName] = table[i][keyName];
Это дало бы (предполагая, что games[i]
существовало раньше) тот же результат, что и games[i].wiki = table[i].wiki'
, за исключением того, что теперь очевидно, что вы всегда можете изменить значение keyName динамически создавать и читать различные свойства.
Вы на самом деле обращаетесь к функции языка, названной, "закорачивая логические выражения":
То, что это означает, является этим: Когда результат логического выражения не может изменяться больше, например, когда ясно, что выражение оценит к "истинному" или "ложному" независимо от того, что, не будут оценены остающиеся части выражения.
Например, C#, Java или JavaScript делают это, и можно полагаться на него на тех языках (для ответа на вопрос).
В Вашем случае, если MyClass не является пустым:
MyClass == null
оценивает ко лжиmyClass.Property > 0
определяет конечный результатесли MyClass является пустым:
MyClass == null
оценивает к истинномуСуществуют языки, которые не закорачивают логические выражения. Классический VB является примером, здесь "myClass. Свойство> 0 дюймов были бы оценены и произвели бы ошибку, если бы MyClass был пустым ("Ничего" не назвал в VB).
Но будьте осторожны:
если у Вас есть что-то как
sprintf (buf, "%s %s", func1 (&var), func2 (&var));
с sideeffects на var это не определяется (в C, я не уверен, определяется ли порядок оценки на других языках), в котором порядок func1 () и func2 () выполняется (он зависит, в том, какой порядок (левый или правый), аргументы помещены на стек и оценены оттуда.
Замыкание накоротко описано в разделе 7.11 из спецификации C# 3.0:
Операция x || y соответствует операции x | y, за исключением того, что y оценен, только если x не верен.
Таким образом да, Вы в порядке.
Что касается других языков - мне никогда не нравится говорить за все языки. В VB.NET можно использовать OrElse и AndAlso, которые закорачиваются, но плоскость Или и И не.
Порядок оценки зависит от оператора, в этом случае булевская переменная или (||
) определяется, чтобы быть тем, что обычно называют, закорачивая, для создания конструкций как эта работа.
И/или операторы на языках как Ada, Visual Basic и Паскаль не закорачивают. Они действительно обеспечивают дополнительные операторы для разрешения той функциональности, такой как "и затем" и "или иначе" в Ada.
Я не уверен, Вы действительно интересуются порядком или оценкой короткого замыкания?
Я не на 100% уверен, но насколько я знаю, что порядок оценки всегда будет тем же в C# (и я принимаю больше всего если не все языки .NET). Оценка короткого замыкания работает, как объяснено в предыдущих ответах.
Однако в C# можно принять решение не сорвать использующие простые операторы (и вместо &&). Обычно Вы хотите закоротить, но это может быть случай, в котором Вы хотите выполнить все оценки.
В Java и Haskell && и || закорачивают также.
Интересный в стороне: в Haskell это прибывает естественно с языком (можно определить собственные операторы, которые делают это), в то время как в Java и C# это специфично для тех двух операторов.
На самом деле короткое замыкание является частью, но вам также необходимо знать, гарантирует ли язык их оценку слева направо. Например, C (ANSI, ISO, C99) НЕ гарантирует оценку слева направо. В примере кода можно было бы проверить значение Property перед проверкой на NULL или сделать и то, и другое одновременно ... большинство компиляторов этого не делают, но ничто не мешает ему сделать это и полностью соответствовать спецификации. Он даже говорит вам НЕ писать такой код из-за этого.