предисловие
Однажды я взял на себя код большого парня, который был переполнен различными «дерзкими операциями», без каких-либо комментариев, и мне потребовалось много времени, чтобы понять функции всего в нескольких строках.
В этом мире "с магией может бороться только магия", поэтому позже, начитавшись разных читов "черной магии", я подытожил еще несколько практических "дерзких операций", давайте установим 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.._
а также0[0]
-
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-- 后面的分号别漏了
конец
Хотя приведенные выше операции могут в определенной степени сделать код более кратким, это снизит читабельность. В текущей среде потеря производительности машины намного меньше, чем потеря рабочей силы, потому что стоимость обновления конфигурации машины намного ниже, чем стоимость поддержки неясного кода, поэтому, пожалуйста, используйте эту «черную магию» с осторожностью. Даже если вы хотите использовать его, добавьте примечание, в конце концов, в этом мире еще много «маглов», которым нужно выжить.
Есть и другие показательные операции, вы можете обратиться к сводке этого великого бога.《Методы экономии байтов》, некоторые из них очень распространены, а некоторые используются в суровых условиях, поэтому я не буду перечислять их здесь по отдельности.
Наконец, подойдите к пасхалке и введите в консоли:
(!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]]*~+[]]
Если кто-то спамит ваш код позже, вы можете отправить ему этот код.