Есть ли хорошая стенограмма JS там? - PullRequest
29 голосов
/ 10 октября 2010

Я хотел бы включить все методы сокращения, которые есть в моих обычных привычках кодирования, а также иметь возможность читать их, когда вижу их в сжатом коде.Приемы?

Редактировать: Ранее я упоминал минифайеры, и теперь мне ясно, что минимизирующие и эффективные методы JS-типирования - это две почти совершенно разные концепции.

Ответы [ 5 ]

42 голосов
/ 10 октября 2010

Обновлено с ECMAScript 2015 (ES6) вкусности. Смотри внизу.

Наиболее распространенные условные сокращения:

a = a || b     // if a is falsy use b as default
a || (a = b)   // another version of assigning a default value
a = b ? c : d  // if b then c else d
a != null      // same as: (a !== null && a !== undefined) , but `a` has to be defined

Буквенное обозначение объекта для создания объектов и массивов:

obj = {
   prop1: 5,
   prop2: function () { ... },
   ...
}
arr = [1, 2, 3, "four", ...]

a = {}     // instead of new Object()
b = []     // instead of new Array()
c = /.../  // instead of new RegExp()

Встроенные типы (числа, строки, даты, логические значения)

// Increment/Decrement/Multiply/Divide
a += 5  // same as: a = a + 5
a++     // same as: a = a + 1

// Number and Date
a = 15e4        // 150000
a = ~~b         // Math.floor(b) if b is always positive
a = +new Date   // new Date().getTime()

// toString, toNumber, toBoolean
a = +"5"        // a will be the number five (toNumber)
a = "" + 5 + 6  // "56" (toString)
a = !!"exists"  // true (toBoolean)

Объявление переменной:

var a, b, c // instead of var a; var b; var c;

Символ строки в индексе:

"some text"[1] // instead of "some text".charAt(1);

Стандартные сокращения ECMAScript 2015 (ES6)

Это относительно новые дополнения, поэтому не ожидайте широкой поддержки среди браузеров. Они могут поддерживаться современными средами (например, более новыми node.js) или с помощью транспортеров. «Старые» версии, конечно же, продолжат работать.

Функции стрелок

a.map(s => s.length)                    // new
a.map(function(s) { return s.length })  // old

Параметры покоя

// new 
function(a, b, ...args) {
  // ... use args as an array
}

// old
function f(a, b){
  var args = Array.prototype.slice.call(arguments, f.length)
  // ... use args as an array
}

Значения параметров по умолчанию

function f(a, opts={}) { ... }                   // new
function f(a, opts) { opts = opts || {}; ... }   // old

деструктурирующие

var bag = [1, 2, 3]
var [a, b, c] = bag                     // new  
var a = bag[0], b = bag[1], c = bag[2]  // old  

Определение метода внутри литералов объекта

// new                  |        // old
var obj = {             |        var obj = {
    method() { ... }    |            method: function() { ... }
};                      |        };

Вычисляемое свойство Имена Внутри литералов объекта

// new                               |      // old
var obj = {                          |      var obj = { 
    key1: 1,                         |          key1: 5  
    ['key' + 2]() { return 42 }      |      };
};                                   |      obj['key' + 2] = function () { return 42 } 

Бонус: новые методы для встроенных объектов

// convert from array-like to real array
Array.from(document.querySelectorAll('*'))                   // new
Array.prototype.slice.call(document.querySelectorAll('*'))   // old

'crazy'.includes('az')         // new
'crazy'.indexOf('az') != -1    // old

'crazy'.startsWith('cr')       // new (there's also endsWith)
'crazy'.indexOf('az') == 0     // old

'*'.repeat(n)                  // new
Array(n+1).join('*')           // old 

Бонус 2: функции стрелок также делают self = this захват ненужным

// new (notice the arrow)
function Timer(){
    this.state = 0;
    setInterval(() => this.state++, 1000); // `this` properly refers to our timer
}

// old
function Timer() {
    var self = this; // needed to save a reference to capture `this`
    self.state = 0;
    setInterval(function () { self.state++ }, 1000); // used captured value in functions
}
17 голосов
/ 10 октября 2010

Если в JavaScript вы также включаете версии, более новые, чем версия 1.5, вы также можете увидеть следующее:


Закрытие выражений:

JavaScript 1.7 иболее старый:

var square = function(x) { return x * x; }

JavaScript 1.8 добавил сокращение Лямбда-нотацию для написания простых функций с закрытиями выражений :

var square = function(x) x * x;

метод Reduce ():

JavaScript 1.8 также вводит метод уменьшение () для массивов:

var total = [0, 1, 2, 3].reduce(function(a, b){ return a + b; });  
// total == 6 

Деструктурирующее назначение:

В JavaScript 1.7 вы можете использовать деструктурирующее назначение , например, для обмена значениями, избегая временных переменных:

var a = 1;  
var b = 3;  

[a, b] = [b, a]; 

Понимания массива и метод filter ():

Понимания массива были введены в JavaScript 1.7, который может уменьшить следующий код:

var numbers = [1, 2, 3, 21, 22, 30];  
var evens = [];

for (var i = 0; i < numbers.length; i++) {
  if (numbers[i] % 2 === 0) {
    evens.push(numbers[i]);
  }
}

Примерно так:

var numbers = [1, 2, 3, 21, 22, 30];
var evens = [i for each(i in numbers) if (i % 2 === 0)];

Или используя метод filter() in Массивы, которые были представлены в JavaScript 1.6:

var numbers = [1, 2, 3, 21, 22, 30];
var evens = numbers.filter(function(i) { return i % 2 === 0; });  
3 голосов
/ 10 октября 2010

Вы ищете идиомы языка JavaScript.

Конечно, интересно посмотреть на что нового в JavaScript 1.6 + , но вы не сможете использовать языковые функции (например, списки или yield ключевое слово) в дикой природе из-за отсутствия массовой поддержки.Однако стоит узнать о новых функциях стандартной библиотеки, если вы еще не знакомы с Lisp или Scheme.Многие типичные части функционального программирования, такие как map , limit и filter , хорошо знать и часто появляются в библиотеках JavaScript, таких как jQuery;Еще одна полезная функция - bind (в некоторой степени proxy в jQuery), которая полезна при указании методов в качестве обратных вызовов.

1 голос
/ 04 января 2016

Этот репозиторий github посвящен методам сохранения байтов для Javascript.Мне это очень удобно!

https://github.com/jed/140bytes/wiki/Byte-saving-techniques

1 голос
/ 29 декабря 2013

Получение последнего значения массива

Это на самом деле не сокращение, а скорее более короткая альтернативная техника, чем метод, который большинство людей используют

Когда мне нужно получить последнее значениеиз массива я обычно использую следующую технику:

var str = 'Example string you actually only need the last word of FooBar';
var lastWord = str.split(' ').slice(-1)[0];

Часть .slice(-1)[0], являющаяся сокращенной техникой.Это короче по сравнению с методом, который я видел почти все остальные:

var str = 'Example string you actually only need the last word of FooBar';
var lastWord = str.split(' ');
    lastWord = lastWord[lastWord.length-1];

Тестирование относительной скорости вычисления этого сокращения

Чтобы проверить это, я сделал следующее:

var str = 'Example string you actually only need the last word of FooBar';
var start = +new Date();
for (var i=0;i<1000000;i++) {var x=str.split(' ').slice(-1)[0];}
console.log('The first script took',+new Date() - start,'milliseconds');

И затем отдельно (для предотвращения возможного синхронного запуска):

var start2 = +new Date();
for (var j=0;j<1000000;j++) {var x=str.split(' ');x=x[x.length-1];}
console.log('The second script took',+new Date() - start,'milliseconds');

Результаты:

The first script took 2231 milliseconds
The second script took 8565 milliseconds

Вывод: нет недостатков в использовании этого сокращения.

Отладка сокращений

Большинство браузеров поддерживают скрытые глобальные переменные для каждого элемента с идентификатором.Поэтому, если мне нужно что-то отладить, я обычно просто добавляю простой элемент к элементу и затем использую консоль для доступа к нему через глобальную переменную.Вы можете проверить это самостоятельно: просто откройте консоль прямо здесь, введите footer и нажмите Enter.Скорее всего, он вернет <div id="footer>, если у вас нет того редкого браузера, у которого его нет (я его не нашел).

Если глобальная переменная уже занята другой переменнойЯ обычно использую ужасный document.all['idName'] или document.all.idName.Я, конечно, знаю, что это ужасно устарело, и я не использую его ни в одном из моих реальных сценариев, но я использую его, когда на самом деле не хочу набирать полный document.getElementById('idName'), так как большинство браузеров все равно его поддерживаютДа, я действительно очень ленивый.

...