Я хотел сделать визуализацию: в частности, я хотел создать гистограмму некоторых данных. При этом я впервые за долгое время снова использовал JavaScript и усвоил несколько интересных новых уроков.

[1, 2, 3, 4, 5, 10, 11, 12]. sort() равно [1, 10, 11, 12, 2, 3, 4, 5]

Оказывается, если вы прочитаете документы, вы обнаружите, что JavaScript, по сравнению с Python, дает неожиданный результат, когда вы вызываете .sort() для массива ints: вы будете сортировать эти элементы по их эквиваленту Unicode. MDN Sort Docs рассказал мне об этом просто и понятно. Мне нужно было минимальное и максимальное значение массива, и (хорошо, да, это плохо) я просто отсортировал все и взял первый и последний элемент. Да, я понимаю, это плохо, но было действительно странно, что я получил другое значение от var m = d3.min(arrayThing), чем от x.sort(); var m = x[0], что привело меня к тому, что я узнал об этом.

Примечание. Сортировка массива для получения минимума и максимума — это плохо, потому что вы переназначаете так много переменных в путешествии, чтобы просто назначить два элемента, которые вам действительно нужны: минимум и максимум.

JavaScript передает объекты по ссылке на копирование

Одна из моих функций брала большой массив из другой функции, затем нарезала его, а иногда и затирала случайную запись в этом массиве. Представьте мое смятение, когда я понял, что если я вызову эту функцию во второй раз или снова воспользуюсь массивом после того, как эта функция исказила его, данные изменятся!

Сначала я проверил этот ответ StackOverflow. Примитивы по копии, объекты по копии ссылки. Мой вывод из этого — надеюсь, неплохой — что вам нужно клонировать объект, если вы хотите изменить его в своей функции.

Здесь, безусловно, есть что обсудить: объем, аргументы и т. д. Если у вас есть комментарии, я весь внимателен. Свяжитесь со мной в Twitter или здесь, на Medium.

Копирование объектов путем сериализации и десериализации в JSON — плохая идея™

После того, как я обнаружил, что передача по ссылке повлияет на мой код, я решил клонировать объект. Это чувствовалось не очень хорошо, но я увидел этот ответ StackOverflow на тему Эффективное клонирование объектов JS и должен был понять, что Эффективность не была главной целью, к которой я стремился. Одна важная вещь, которую я упустил из виду до второго чтения, заключалась в том, что автор этого комментария упоминает, что Date преобразования не будут работать в этом случае.

В общем, мне не нравилась эта практика, потому что даже если вы не используете объекты Date, что я и делал, это ограничивает вас тем, что вы не будете использовать объекты Date в будущем, и, кроме того, я чувствую (но не имею убедительных доказательств в поддержку), что это может не быть добрым в других крайних случаях. Вот один из них, вы сами решаете, будете ли вы когда-либо делать это:

undefined не твой друг

В какой-то момент мой код содержал что-то вроде этого: if (blah.lengt === 0), который каким-то образом прошел через несколько итераций запуска скрипта и проверки вывода. JavaScript гибок в том смысле, что он не сходит с ума, если вы пытаетесь получить доступ к вещам, которых не существует — он просто мягко возвращает undefined и продолжает заниматься своими делами.

Это то, на что мне нужно обратить внимание, сейчас я включил линтинг в свой рабочий процесс, но читайте дальше, чтобы найти реальное решение…

Большинство этих проблем можно было бы решить с помощью модульных тестов.

Иногда, когда мы начинаем проект, мы думаем, что завершить его будет так быстро и легко, что мы можем просто написать несколько функций, связать их вместе и увидеть наши результаты. В данном случае ничто не могло быть дальше от истины.

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

  • Если бы я написал модульный тест для расчета домена моего графика, я бы обнаружил эту неприятную ошибку min/max раньше.
  • Если бы я написал модульный тест для разбиения сегментов, то обнаружил бы, что переставил числитель и знаменатель отношения очень быстро.
  • Действительно, я бы обнаружил, что вывод ряда функций был отключен или неверен в ряде ситуаций, и по этой причине я сожалею, что не написал модульные тесты для кода.

В течение следующей недели поищите в моем проекте больше юнит-тестов, скорее всего, с MochaJS.

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

Вот ссылка на репозиторий — вы можете вносить PR для всего, что пожелаете (даже для форматирования!), И если что-то не имеет смысла, пожалуйста, свяжитесь со мной.