import
.export
по-другому пишется const greeting = (name) => console.log(`Hello, ${name}`);
export default greeting;
/* или */
export { greeting };
Причем import'ы
будут разные для обоих случаев. Для первого import greeting from './file.js';
, а во втором import { greeting } from './file.js';
/********************************
* Подготовка
********************************/
const formData = new FormData();
formData.append('name', 'John Doe');
formData.append('email', 'john.doe@example.com');
formData.append('phone', '88005553535');
/********************************
* Сборка параметров
********************************/
const searchParams = new URLSearchParams();
for (let [key, value] of formData.entries()) {
searchParams.set(key, encodeURIComponent(value));
}
console.log(searchParams.toString()); // name=John%2520Doe&email=john.doe%2540example.com&phone=88005553535
request.send(searchParams.toString());
. А ещё можно делать так: new FormData(DOM_ЭЛЕМЕНТ_ФОРМЫ);
gulp.src(...)
надо return gulp.src(...)
gulp.task('webserver', function () {
browserSync(config);
});
надо сделать так gulp.task('webserver', function (cb) {
browserSync(config);
cb();
});
const gulp = require('gulp');
const pipeIf = require('gulp-if');
const order = require('gulp-order');
const nunjucks = require('gulp-nunjucks');
const pretty = require('gulp-pretty-html');
const minify = require('gulp-htmlmin');
const replace = require('gulp-replace');
const sass = require('gulp-sass');
const sourcemaps = require('gulp-sourcemaps');
const autoprefixer = require('gulp-autoprefixer');
const clean = require('gulp-clean-css');
const babel = require('gulp-babel');
const concat = require('gulp-concat');
const uglify = require('gulp-uglify');
const image = require('gulp-image');
const clear = require('gulp-clean');
const browser = require('browser-sync').create();
const { argv } = require('yargs');
sass.compiler = require('node-sass');
gulp.task('server', (callback) => {
browser.init({
server: {
baseDir: 'Build'
},
ui: {
port: 8080
},
notify: false
});
callback();
});
gulp.task('reload', (callback) => {
browser.reload();
callback();
});
gulp.task('clear', () => {
return gulp.src('Build', { allowEmpty: true })
.pipe(clear({
force: true
}));
});
gulp.task('build:html', (callback) => {
return gulp.src('Sources/**/*.html')
.pipe(nunjucks.compile())
.pipe(replace(/(\r\n|\r|\n)(\s+)?(\r\n|\r|\n)/gm, '\n'))
.pipe(pipeIf(argv.development, pretty()))
.pipe(pipeIf(argv.production, minify({ collapseWhitespace: true })))
.pipe(gulp.dest(`Build/`));
});
gulp.task('build:sass', () => {
return gulp.src(['Sources/Styles/*.sass', 'Sources/Styles/*.scss'])
.pipe(pipeIf(argv.development, sourcemaps.init()))
.pipe(sass())
.pipe(autoprefixer({
cascade: false
}))
.pipe(pipeIf(argv.production, clean()))
.pipe(pipeIf(argv.development, sourcemaps.write('.')))
.pipe(gulp.dest('Build/Styles/'));
});
gulp.task('build:js', () => {
return gulp.src('Sources/Scripts/**/*.js')
.pipe(pipeIf(argv.development, sourcemaps.init()))
.pipe(order([
// Order for JS files
'*.js'
]))
.pipe(concat('main.js'))
.pipe(babel({
presets: ['@babel/env']
}))
.pipe(pipeIf(argv.production, uglify()))
.pipe(pipeIf(argv.development, sourcemaps.write('.')))
.pipe(gulp.dest('Build/Scripts/'));
});
gulp.task('build:images', () => {
return gulp.src(['Sources/Images/**/*.png', 'Sources/Images/**/*.jpg', 'Sources/Images/**/*.svg'])
.pipe(pipeIf(argv.production, image()))
.pipe(gulp.dest('Build/Images/'));
});
gulp.task('watch:html', () => {
gulp.watch(['Sources/**/*.html', 'Sources/**/*.njk'], gulp.series('build:html', 'reload'));
});
gulp.task('watch:sass', () => {
gulp.watch(['Sources/Styles/**/*.sass', 'Sources/Styles/**/*.scss'], gulp.series('build:sass', 'reload'));
});
gulp.task('watch:js', () => {
gulp.watch('Sources/Scripts/**/*.js', gulp.series('build:js', 'reload'));
});
gulp.task('watch:images', () => {
gulp.watch(['Sources/Images/**/*.png', 'Sources/Images/**/*.jpg', 'Sources/Images/**/*.svg'], gulp.series('build:images'));
});
gulp.task('build', gulp.parallel('build:html', 'build:sass', 'build:js', 'build:images'));
gulp.task('watch', gulp.parallel('watch:html', 'watch:sass', 'watch:js', 'watch:images'));
gulp.task('default', gulp.series('clear', 'build', 'server', 'watch'));
topSalary({
'John': 10000,
'Emily': 11000,
'Bob': 9200,
'Alice': 11010
}); // Alice
. Далее, max
для цифры, maxName
для ключа в объекте. Object.entries(salaries)
этот код из объекта делает массив массивов, такой: [['John', 10000], ['Emily', 11000], ['Bob', 9200], ['Alice', 11010]]
. Часть const [name, salary] of ...
это деструктурирующее присваивание, т. е. в name
попадает ключ, а в salary
число (в данном случае). Ну а дальше обычный алгоритм поиска максимального числа и возврат ключа (maxName
). const key = 'length';
localStorage[key] = 100;
console.log(localStorage[key]); // 0
console.log(localStorage.getItem(key)); // null
const key = 'length';
localStorage.setItem(key, 100);
console.log(localStorage[key]); // 1
console.log(localStorage.getItem(key)); // 100 (строкой)
if (window.userInfo && !window.userInfo.isInAccount) { // или window.userInfo.isInAccount === false
// Как-то так
}
reduce
обрабатывает массив (почти как map
), причем, вторым аргументов передается аккумулятор (acc
), или то, куда будем складывать. Итак: на каждой итерации у нас есть индекс текущего элемента, и количество частей. Благодаря mod
оператору (i % chunks
), мы получаем индекс «части». Далее, (acc[i % chunks] = acc[i % chunks] || [])
эта часть позволяет создавать пустой массив, если по текущей «части» ничего нет. А если не понятно, почему стоит , acc
, то можно функцию представить в другом виде: arr.reduce((acc, n, i) => {
(acc[i % chunks] = acc[i % chunks] || []).push(n);
/* Или
if (!acc[i % chunks]) {
acc[i % chunks] = [];
}
acc[i % chunks].push(n);
*/
return acc;
}, []);
window.addEventListener('resize', function () {
if (window.innerWidth <= 768) {
// 0...768
element.classList.add('class-name');
} else {
// 769...Inf
element.classList.remove('class-name');
}
});
const createCycle = (...callbacks) => {
const generator = (function* () {
let index = 0;
while (true) {
yield callbacks[index++];
index %= callbacks.length;
}
})();
return generator;
};
const cycledCallbacks = createCycle(
(name) => console.log(`Hello, ${name}`),
(name) => console.log(`Bye, ${name}`)
);
const button = document.querySelector('button');
button.addEventListener('click', event => {
event.preventDefault();
const { value: callback } = cycledCallbacks.next();
callback('John');
});
const
, то всегда let
. Потому как let
используется в уникальном scope
. А вообще неплохо рассказано тут (в новой редакции).var
:{
var value = 1;
}
console.log(value); // 1
let
(const
):{
let value = 1;
}
console.log(value); // ReferenceError: value is not defined