А так же о всякой фигне
Частенько джбаскриптеры любят называть крестовиков байтоёбами. Типа трахаются они со своими memalloc, байтовыми операция, а нам оно и нахуй не нужно, у нас всё супер высокоуровневенько.
На самом же деле, юные джабаскриптеры просто ещё не подозревают, что в js, этого самого байтоёбства хватает с головой.
new Uint8Array(); new Uint16Array(); new Uint32Array(); new Int8Array(); new Int16Array(); new Int32Array(); new Float32Array(); new Float64Array();
И тут уже во всю лезут родные фишки с переполнением и ошибками типизации:
let test1 = new Uint8Array(1); test1[ 0 ] = 256; console.log(test1[ 0 ]); // выведет 0, а не 256 let test2 = new Int8Array(1); test2[ 0 ] = 255; console.log(test2[ 0 ]); // выведет -1, а не 255
У нас есть все те же самые побитовые операции, что и в ц++
XOR - ^ AND - & OR - | NOT - ~ RSHIFT - >> LSHIFT - << Bitwise RSHIFT - >>>
В дополнение к ним, можем в хексах задавать значения:
console.log(0xff << 8 | 0xff); // 65535
Зная побитовые операции, можно на собеседовании удивить будущих коллег жабаскриптеров:
let a = 10; let b = 20; a = a ^ b; b = b ^ a; a = b ^ a; console.log(a, b); // 20 10
Сишники, конечно, тихо посмеются, но щито поделать, мало кто из юных вкатывальщиков понимает что тут происходит.
Да, и она то же есть, в нашем родном, буфере:
Buffer.alloc() Buffer.allocUnsafe() Buffer.allocUnsafeSlow() ... ИТД
Бонусом идёт НЕвозможность автоматического расширения:
let buf = Buffer.alloc(1); buf[ 0 ] = 10; buf[ 1 ] = 20; console.log(buf); // <Buffer 0a> - один элемент, как и запросили в alloc
А ещё, увидили в консольке Buffer 0a? Так вот 0a - это ж наши любимые(без сарказма) хексики!
Байтоёбство начинается тогда, когда Вы спускаетесь с небес HTTP и модных фреймворков поближе к железу. И это не зависит от используемого языка программирования.
Например, если начнёте писать что-нить под Bluetooth/BLE, то обнаружите, что пакетик в BLE совсем маленький, и закодировать что-то в json не получится, придётся упаковывать всё в байтики.
Или, если нужно работать с UDP/TCP, например, получать данные с ких-нить iot девайсиков, то придётся окунуться в мир бинари пакетов, битовых флагов и вот этого всего.
Или чтение каких-нить НЕ текстовых файлов, то же видео/картинки/архивы итд.
Мне почему-то везёт на UDP серваки. Например, пришлось писать upd сервер, для iot девайсиков. Эти девайсики упаковывают всё в маленькие бинари пакеты, чтобы экономить батарейку, обмазывает всё битавыми флагами, а я с этим потом как-то живу.
Ещё приходилось писать UDP прослойку между openresty и redis, чтобы съэкономить на tcp коннектах. И надо сказать очень хорошо съэкономили.
И да, с вышеупомянутым BLE тоже пришлось потрахаться, хоть и не на ноде, а на GO, но не исключено, что и на ноде скоро то же придётся.
Недавно адблок начал блокировать виджет социальных сетей, на этом, моём сайте. Проблема в том, что я не использую скрипты соц сетей, а каждая кнопка- это олдскульная ссылка и ничего более.
Обмен значений двух переменных, не все способы одинаково полезны
На всяких курсах по программированию и на собеседованиях есть стандартная задача: есть 2 переменных a и b, нужно поменять местами их значения, подразумевается, что мы должны выпендриться и вместо использования буфера заюзать XOR или математику: