В JavaScript это цепное назначение хорошо?

Javadoc из Files.createFile(…) , часть java.nio.file , доступная с Java 7, повторяет обещание атомарности, но ничего не упоминает о блокировке на основе файлов.


Мое рассуждение:

  • На один или более новый метод (из java.nio.file.Files) влияют те же (или похожие) проблемы, что и более старые (из java.io.File), и Javadoc просто пропускает эту информацию ...
  • ... или более новый метод действительно ведет себя более предсказуемо и корректно.

Учитывая обработку ошибок и спецификации в java.nio.file, как правило, был улучшен по сравнению с классом File (существующим с JDK 1.2), я предполагаю, что вторая альтернатива верна.


Мой вывод: использование Files.createFile(…) отлично подходит для этого использования случай.

32
задан Daniel Vassallo 2 August 2010 в 11:35
поделиться

4 ответа

Да, они не такие. var a = b = [] эквивалентно

var a;
b = [];
a = b;

Не только a и b получают одно и то же значение (ссылка на один и тот же пустой array), b вообще не объявляется. В строгом режиме в ECMAScript 5 и более поздних версиях это вызовет ошибку ReferenceError ; в противном случае, если в области видимости уже не существует переменная b , b автоматически создается как свойство глобального объекта и действует аналогично глобальной переменной, где бы ни находился код, даже внутри функция. Что нехорошо.

Вы можете легко это увидеть:

(function() {
    var a = b = [];
})();

console.log(b); // Shows []
41
ответ дан 27 November 2019 в 16:47
поделиться

Ваш коллега прав. Первый оператор создает новый пустой массив. Затем ссылка на этот массив присваивается b. Затем та же ссылка (которая является результатом выражения присваивания) присваивается объекту. Итак, a и b относятся к одному и тому же массиву.

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

Между прочим: это поведение довольно распространено и одинаково для всех языков программирования на основе C. Так что это не относится к JavaScript.

4
ответ дан 27 November 2019 в 16:47
поделиться

В первом примере b является ссылкой на a, а b становится глобальной переменной, доступной из любого места (и заменяет любую переменную b, которая уже может существовать в глобальной области видимости).

3
ответ дан 27 November 2019 в 16:47
поделиться

Ваш коллега прав:

var a = b = [];
a.push('something');
console.log(b);          // outputs ["something"]

но:

var a = [], b = [];
a.push('something');
console.log(b);          // outputs []
10
ответ дан 27 November 2019 в 16:47
поделиться
Другие вопросы по тегам:

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