JavaScript те хитрые операции, которые коллеги обыграют, когда они будут написаны

JavaScript

предисловие

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

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

текст

битовая операция

Самая известная ошибка в JavaScript0.1 + 0.2 !== 0.3, все операции с плавающей запятой небезопасны из-за проблем с точностью."0,1+0,2 не равно 0,3? Почему в JavaScript такая «дерзкая» операция? 》.

Поэтому некоторые большие коровы ранее предлагали не использовать побитовые операции в JS:

Javascript полностью реализует побитовые операторы Java, включая побитовое И.&, побитовое ИЛИ|, побитовое исключающее ИЛИ^, побитовое НЕ~, осталось<<, подписанный правый сдвиг>>и использовать0Дополнительный сдвиг вправо>>>. Этот набор операторов работает с целыми числами, поэтому он совершенно бесполезен для JavaScript, поскольку внутри все числа хранятся как числа с плавающей запятой двойной точности. Если бы они использовались, JavaScript должен был бы преобразовывать операнды в целые числа перед выполнением операций, что замедляло бы работу. И "побитовый оператор И"&То же, что и "логический оператор И"&&, легко спутать.

Но на мой взгляд, если приложение JS достигнет уровня совершенства и сможет избежать всевозможных «фич», то не беда, если вы изредка будете использовать побитовые операторы, и это тоже может повысить производительность вычислений. прямая операция — наиболее привычный компьютеру двоичный файл.

Принцип битовой операции можно посмотреть в этой статье«Волшебное использование побитовых операторов в JS»

1. Используйте оператор сдвига влево<<Быстро добраться до степени 2

1 << 2  // 4, 即 2的2次方
1 << 10 // 1024, 即 2的10次方

// 但是要注意使用场景
a = 2e9;   // 2000000000
a << 1;    // -294967296

2. Используйте^переключить переменную 0 или 1

// --- before ---
// if 判断
if (toggle) {
    toggle = 0;
} else {
    toggle = 1;
}
// 三目运算符
togle = toggle ? 0 : 1;

// --- after ---
toggle ^= 1;

3. Используйте&Судейский паритет

даже & 1 = 0
Нечетное & 1 = 1

console.log(7 & 1);    // 1
console.log(8 & 1) ;   // 0

4. Используйте!!преобразовать число в логическое

все非0Значенияtrue, включая отрицательные числа и числа с плавающей запятой:

console.log(!!7);       // true
console.log(!!0);       // false
console.log(!!-1);      // true
console.log(!!0.71);    // true

5. Используйте~,>>,<<,>>>,|округлить

Эквивалентно использованию Math.floor()

console.log(~~11.71)     // 11
console.log(11.71 >> 0)  // 11
console.log(11.71 << 0)  // 11
console.log(11.71 | 0)   // 11
console.log(11.71 >>> 0) // 11

Примечание >>> нельзя округлять отрицательные числа

6. Используйте^завершить обмен ценностями

Использование этой нотации было упомянуто ранее, но вот некоторые расширенные способы использования, которые быстрее (но должны быть целыми числами) до назначений деструктурирования ES6:

// --- before ---
let temp = a; a = b; b = temp; // 传统,但需要借助临时变量
b = [a, a = b][0] // 借助数组

// --- after ---
let a = 7
let b = 1
a ^= b
b ^= a
a ^= b
console.log(a)   // 1
console.log(b)   // 7

[a, b] = [b, a]; // ES6,解构赋值

7. Используйте^Проверьте, совпадают ли символы

(a ^ b) >= 0; //  true 相同; false 不相同 

8. Используйте^чтобы проверить, если числа не равны

// --- before ---
if (a !== 1171) {...};

// --- after ---
if (a ^ 1171) {...}; 

9. n & (n - 1), если 0, это означает, что n является целой степенью числа 2

10. ИспользованиеA + 0.5 | 0вместо Math.round()

Если он отрицательный, просто нужно-0.5

String

1. ИспользуйтеtoString(16)взять случайную строку

Math.random().toString(16).substring(2, 15);

Второй параметр .substring() определяет количество используемых битов (до 13 бит).

2. Используйте разделение (0)

Использование чисел в качестве разделителя для разделения экономит 2 байта.

// --- before ---
"alpha,bravo,charlie".split(",");

// --- after ---
"alpha0bravo0charlie".split(0);

3. Используйте.link()Создать ссылку

Малоизвестный способ быстрого создания тега

// --- before ---
let b = `<a herf="www.google.com">google</a>`;

// --- after ---
let b = 'google'.link('www.google.com');

3. ИспользуйтеArrayповторять символы

// --- before ---
for (let a = "", i = 7; i--;) a+= 0;

// --- after ---
let b = Array(7).join(0); // "000000"
let c = Array(7).join('La') // "LaLaLaLaLaLa"

// ES6
let d = "0".repeat(7); // "0000000"

некоторые другие навороты

1. Создайте случайное число, используя текущее время

// --- before ---
let b = 0 | Math.random() * 100

// --- after ---
let a;
a = new Date % 100; // 两位随机数
a = new Date % 1000; // 三位随机数
a = new Date % 10000; // 四位随机数...依次类推
// 不要在快速循环中使用,因为毫秒可能没有变化;

2. Некоторые альтернативыundefinedоперация

  1. ""._, 1.._а также0[0]

  1. void 0было бы лучше, чем писатьundefinedбыть быстрее
let d = void 0;
console.log(d); // undefined

3. Используйте1/0заменитьInfinity

// --- before ---
[Infinity, -Infinity]

// --- after ---
[1/0, -1/0]

4. ИспользуйтеArray.length = 0чтобы очистить массив

5. ИспользуйтеArray.slice(0)Реализация неглубокой копии массива

6. Используйте!+"\v1"Быстро определить браузеры ниже IE8

Гугл Хром:

ИЭ 9 (10, 11):

ИЭ 8 (7, 6, 5):

7. Сокращение условия цикла for

// --- before ---
for(let i = 0; i < arr.length; i++) {...}

// --- after ---
for(let i = arr.length; i--;) {...} // 注意 i-- 后面的分号别漏了

конец

Хотя приведенные выше операции могут в определенной степени сделать код более кратким, это снизит читабельность. В текущей среде потеря производительности машины намного меньше, чем потеря рабочей силы, потому что стоимость обновления конфигурации машины намного ниже, чем стоимость поддержки неясного кода, поэтому, пожалуйста, используйте эту «черную магию» с осторожностью. Даже если вы хотите использовать его, добавьте примечание, в конце концов, в этом мире еще много «маглов», которым нужно выжить.

Есть и другие показательные операции, вы можете обратиться к сводке этого великого бога.《Методы экономии байтов》, некоторые из них очень распространены, а некоторые используются в суровых условиях, поэтому я не буду перечислять их здесь по отдельности.

Наконец, подойдите к пасхалке и введите в консоли:

(!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]]*~+[]]

Если кто-то спамит ваш код позже, вы можете отправить ему этот код.