120
и 120.001
, условия не определены и код даст ошибку, т.к. не определится одна из переменных.else if
. Поскольку они перемножаются и по умолчанию единицы, можно сразу определять конечное значение:if (floors.value == 1) {
aF = 1; // по умолчанию, для больше 300
if (area.value <= 120) aF = 1.26;
else if (area.value <= 140) aF = 1.24;
else if (area.value <= 160) aF = 1.23;
else if (area.value <= 200) aF = 1.22;
else if (area.value <= 260) aF = 1.2;
else if (area.value <= 300) aF = 1.19;
console.log(aF);
} else if (floors.value == 2 || floors.value == 3) {
bF = 1; // ? для меньше 100 .. и больше 300
if (area.value >= 100 && area.value <= 130) bF = 1.3;
else if (area.value <= 160) bF = 1.27;
else if (area.value <= 200) bF = 1.24;
else if (area.value <= 300) bF = 1.22;
console.log(bF);
}
const monthNames = 'января февраля марта апреля мая июня июля августа сентября октября ноября декабря'
.split(' '); // получится массив
const D = new Date(); // объект Даты на сейчас
// завтрашний день
D.setDate( D.getDate() + 1); // так месяц "переключится" автомагически
console.log( 'Завтра ' + D.getDate() + ' ' + monthNames[ D.getMonth() ] );
complete
и после него naturalWidth
(или naturalHeight
) через какое-то время после назначения src
– достаточное для загрузки картинки. Проверка того, есть ли картинка, в любом случае немгновенна, асихнонна.const srcs = [
'https://sun6-5.userapi.com/c850632/v850632804/12d149/KnY01pJH16w.jpg'
,'https://sun6-6.userapi.com/c855020/v855020551/59a81/phM3k4nXcrg.jpg'
];
function makeCheck(image) {
return function() {
if (image.complete && image.naturalWidth) {
console.log("картинка загрузилась ОК!");
} else {
console.error("Нет такой картинки: " + image.src);
}
}
}
for(let i = 0;i < srcs.length; i++) {
const src = srcs[i];
const image = new Image();
window.setTimeout( makeCheck(image), 300);
//image.src = "../img/designers/" + index + '.' + id + ".jpg";
image.src = src;
}
indexOf()
в лоб. Костыль только для двух повторов, но, по идее, быстрее регулярок:function haz2ones(str) {
const s = str.toString();
const search = '1';
let i = s.indexOf(search);
if (!~i) return false;
i = s.indexOf(search, i + 1);
if (!i) return false;
if (!!~s.indexOf(search, i + 1)) return false;
return true;
}
const tests = [
[1, false],
[11, true],
[111, false],
['1', false],
['11', true],
['111', false],
['100001', true],
['000011', true],
[12345678901234567890, true],
];
return tests.map(e => haz2ones(e[0]) === e[1] ? '+' : '- ' + e[0]);
// +,+,+,+,+,+,+,+,+
ffmpeg -i source.mp4 -t 1:30:00 -c copy part1.mp4
ffmpeg -ss 1:30:00 -i source.mp4 -c copy part2.mp4
www.youtube.com/get_video_info?video_id=XXXXXX
XXXXXX
подставьте хэш видео, который в ссылке на ролик, типа youtu.be/BWCiWZtrWXU
после слеша.url_encoded_fmt_stream_map
. Его значение опять надо распаковать как URL-параметры. И из результата вытащить параметр url
– это ссылка на единый скачивабельный видеофайл.function getUrlParams(search) {
let hashes = search.slice(search.indexOf('?') + 1).split('&')
let params = {}
hashes.map(hash => {
let [key, val] = hash.split('=')
params[key] = decodeURIComponent(val)
})
return params
}
var s = '------'; // здесь длиннющая строка из ответа /get_video_info
var a = getUrlParams(s);
var b = getUrlParams(a.url_encoded_fmt_stream_map);
console.log(b.url); // эту ссылку открываем в браузере - это скачиваемый видеофайл
$('.parent div:last-child').addClass('div2');
Замыкание — это комбинация функции и лексического окружения, в котором эта функция была определена.
A closure is the combination of a function and the lexical environment within which that function was declared.
function makeCounter() {
// далее ваш код:
let count = 0;
function counter() {
return count += 1;
}
// конец вашего кода.
return counter; // вернули Функцию (с её окружением)
}
var myCounter = makeCounter();
// вот теперь к значению count не добраться - приватность!
// зато
console.log(myCounter()); // 1
console.log(myCounter()); // 2
console.log(myCounter()); // 3