Добавить новость





160*600

Новости сегодня на DirectAdvert

Новости сегодня от Adwile

Актуальные новости сегодня от ValueImpression.com


Опубликовать свою новость бесплатно - сейчас


Javascript простой! Кто сказал?

Старший аспирант "Нетологии" Алена Батицкая перевела статью Aurelien Herve о том, с какими неочевидными вещами придется столкнуться новичку на пути изучения javascript.

В этой статье собраны несколько ловушек и подводных камней javascript, о которых должен знать новичок. Экспертов прошу отнестись к этому тексту с пониманием.

Javascript всего лишь еще один язык программирования. Что может пойти не так?

1. Вы когда-нибудь пытались отсортировать массив чисел?

sort() в Javascript по умолчанию использует буквенно-цифровой порядок сортировки.

Так [1,2,5,10].sort() вернет [1, 10, 2, 5] .

Чтобы получить ожидаемый результат при сортировке массива вы можете использовать следующую конструкцию [1,2,5,10].sort((a, b) = a - b)

Простое решение для заранее известной проблемы :)

2. new Date() просто прекрасна

new Date() работает следующим образом:

без аргументов: возвращает текущую дату.

один аргумент x : возвращает 1 января 1970 + x миллисекунд. Люди со знанием Unix знают причину.

new Date(1, 1, 1) возвращает 1 февраля 1901 года. Все потому что первая цифра означает 1 год после 1900, вторая цифра это месяц в году, в нашем случае второй месяц - февраль. Действительно, кто в своем уме начнет нумерацию с цифры 1? :) И третья цифра означает первый день месяца - потому что иногда индексы все же начинаются с 1.

Запись new Date(2016, 1, 1) не прибавит 2016 лет к 1900, а просто вернет 2016 год.

3. Replace не заменяет

Мне кажется, что это хорошо, поскольку я не люблю функции, которые мутируют вводные данные. Вам так же стоит знать, что replace заменит только первое совпадение:

 
let s = "bob";  
const replaced = s.replace("b", "l");  
console.log(replaced); // lob - заменено только первое совпадение  
console.log(s); // bob - изначальная переменная осталась прежней

Если вы хотите изменить все вхождения, то можете использовать регулярное выражение /g :

 
"bob".replace(/b/g, 'l') === 'lol' // заменены все вхождения

4. Аккуратнее со сравнениями

 
Тут все хорошо: 
'abc' === 'abc';  
// true 1 === 1; // true
 
А вот тут уже нет, не хорошо: 
[1, 2, 3] === [1, 2, 3]; // false  
{a: 1} === {a: 1}; // false  
{} === {}; // false

Причина: [1, 2, 3] и [1, 2, 3] являются двумя отдельными массивами. Просто по счастливому стечению обстоятельств они содержат одинаковые данные. Оба массива имеют разные ссылки и не могут сравниваться при помощи === .

5. Массив не является примитивным типом

 
typeof {} === 'object'; // true  
typeof 'a' === 'string'; // true  
typeof 1 === number; // true //  
Но учтите: typeof [] === 'object'; // true

Для того, чтобы узнать является ли ваша переменная массивом вы можете использовать Array.isArray(myVar) .

6. Замыкания

Есть один вопрос по javascript, который очень любят задавать на собеседовании:

 
const Greeters = [];  
for (var i = 0; i  10; i++) {  
  Greeters.push(function () {  
    return console.log(i)  
  })  
}  
 
Greeters[0]() // 10  
Greeters[1]() // 10  
Greeters[2]() // 10

Уверен, вы ожидали, что выведется 0, 1, 2 Но вы понимаете, почему этого не произошло? И как бы вы исправили это?

Рассмотрим два из возможных решений этой проблемы:

  • Используйте let вместо var . Бум! И всё решено.
Разница [между let и var ] заключается в области видимости. Область видимости var ограничена ближайшим блоком функции. А область видимости let ограничена ближайшей областью использования, которая может быть гораздо меньше блока функции. (Обе являются глобальными если объявлены за пределами какого-либо блока).
Источник
  • Альтернатива: используйте bind

Greeters.push(console.log.bind(null, i));

Это только мой топ-2 из огромного количества решений.

7. Поговорим о bind

Как вы думаете, что получится на выходе?

class Foo {
constructor (name) {
this.name = name;
}

greet () {
console.log('hello, this is ', this.name);
}

someThingAsync () {
return Promise.resolve();
}

asyncGreet () {
this.someThingAsync()
.this(this.greet)
}
}

new Foo('dog').asyncGreet();

Одно очко в вашу пользу, если вы думаете, что все сломается и выведется ошибка Cannot read property 'name' of undefined

Причина: greet выполняется вне надлежащего контекста. И опять же есть есть множество решений этой проблемы.

  • Лично мне нравится
 
asyncGreet () { 
 this.someThingAsync() 
 .this(this.greet.bind(this)) }

Таким образом вы убедитесь, что Greet вызывается в вашем экземпляре класса в качестве контента.

  • Если вы понимаете, что greet никогда не должен вызываться за пределами контекста, то вы можете забиндить его в конструкторе класса:
 
class Foo { 
 constructor (name) { 
  this.name = name; 
  this.greet = this.greet.bind(this); 
 }  
}
  • Вам так же стоит знать, что стрелки (=) могут быть использованы для проброса контекста. Это так же будет работать:
 
asyncGreet () { 
  this.someThingAsync() 
  .this(() = { this.greet() 
  }) 
}

Хотя я считаю, что последний пример менее элегантент в данном случае.


Я рад, что мы решили эту проблему.

Заключение

Мои поздравления, теперь вы умеете делать крутые вещи. Наверное.

Иногда даже избегая глобальных поломок (хотя обычно без них не обходится).

Cheers \o/


Мнение автора и редакции может не совпадать. Хотите написать колонку для "Нетологии"? Читайте наши условия публикации.

Читайте на сайте

Другие проекты от 123ru.net








































Другие популярные новости дня сегодня


123ru.net — быстрее, чем Я..., самые свежие и актуальные новости Вашего города — каждый день, каждый час с ежеминутным обновлением! Мгновенная публикация на языке оригинала, без модерации и без купюр в разделе Пользователи сайта 123ru.net.

Как добавить свои новости в наши трансляции? Очень просто. Достаточно отправить заявку на наш электронный адрес mail@29ru.net с указанием адреса Вашей ленты новостей в формате RSS или подать заявку на включение Вашего сайта в наш каталог через форму. После модерации заявки в течении 24 часов Ваша лента новостей начнёт транслироваться в разделе Вашего города. Все новости в нашей ленте новостей отсортированы поминутно по времени публикации, которое указано напротив каждой новости справа также как и прямая ссылка на источник информации. Если у Вас есть интересные фото Вашего города или других населённых пунктов Вашего региона мы также готовы опубликовать их в разделе Вашего города в нашем каталоге региональных сайтов, который на сегодняшний день является самым большим региональным ресурсом, охватывающим все города не только России и Украины, но ещё и Белоруссии и Абхазии. Прислать фото можно здесь. Оперативно разместить свою новость в Вашем городе можно самостоятельно через форму.



Новости 24/7 Все города России




Загрузка...


Топ 10 новостей последнего часа






Персональные новости

123ru.net — ежедневник главных новостей Вашего города и Вашего региона. 123ru.net - новости в деталях, свежий, незамыленный образ событий дня, аналитика минувших событий, прогнозы на будущее и непредвзятый взгляд на настоящее, как всегда, оперативно, честно, без купюр и цензуры каждый час, семь дней в неделю, 24 часа в сутки. Ещё больше местных городских новостей Вашего города — на порталах News-Life.pro и News24.pro. Полная лента региональных новостей на этот час — здесь. Самые свежие и популярные публикации событий в России и в мире сегодня - в ТОП-100 и на сайте Russia24.pro. С 2017 года проект 123ru.net стал мультиязычным и расширил свою аудиторию в мировом пространстве. Теперь нас читает не только русскоязычная аудитория и жители бывшего СССР, но и весь современный мир. 123ru.net - мир новостей без границ и цензуры в режиме реального времени. Каждую минуту - 123 самые горячие новости из городов и регионов. С нами Вы никогда не пропустите главное. А самым главным во все века остаётся "время" - наше и Ваше (у каждого - оно своё). Время - бесценно! Берегите и цените время. Здесь и сейчас — знакомства на 123ru.net. . Разместить свою новость локально в любом городе (и даже, на любом языке мира) можно ежесекундно (совершенно бесплатно) с мгновенной публикацией (без цензуры и модерации) самостоятельно - здесь.



Загрузка...

Загрузка...

Экология в России и мире




Путин в России и мире

Лукашенко в Беларуси и мире



123ru.netмеждународная интерактивная информационная сеть (ежеминутные новости с ежедневным интелектуальным архивом). Только у нас — все главные новости дня без политической цензуры. "123 Новости" — абсолютно все точки зрения, трезвая аналитика, цивилизованные споры и обсуждения без взаимных обвинений и оскорблений. Помните, что не у всех точка зрения совпадает с Вашей. Уважайте мнение других, даже если Вы отстаиваете свой взгляд и свою позицию. Smi24.net — облегчённая версия старейшего обозревателя новостей 123ru.net.

Мы не навязываем Вам своё видение, мы даём Вам объективный срез событий дня без цензуры и без купюр. Новости, какие они есть — онлайн (с поминутным архивом по всем городам и регионам России, Украины, Белоруссии и Абхазии).

123ru.net — живые новости в прямом эфире!

В любую минуту Вы можете добавить свою новость мгновенно — здесь.






Здоровье в России и мире


Частные объявления в Вашем городе, в Вашем регионе и в России






Загрузка...

Загрузка...





Друзья 123ru.net


Информационные партнёры 123ru.net



Спонсоры 123ru.net