function checkSpam(str) {
var lowerStr = str.toLowerCase();
return !!(~lowerStr.indexOf('viagra') || ~lowerStr.indexOf('xxx'));
}
console.log(checkSpam('buy ViAgRA now'));
console.log(checkSpam('free xxxxx'));
console.log(checkSpam("innocent rabbit"));
~lowerStr.indexOf('viagra')
// Если подстрока найдена, то вернется ее индекс начальной позиции. ~lowerStr.indexOf('xxx')
.!!
- это двойное отрицание. Костыльный прием перевести что угодно в булевый тип, true
или false
.||
- это побитовое ИЛИ.// В итоге при передачи строки "buy ViAgRA now":
// ~lowerStr.indexOf('viagra') = -5
// ~lowerStr.indexOf('xxx') = 0
// (~lowerStr.indexOf('viagra') || ~lowerStr.indexOf('xxx')) = -5
// !!(~lowerStr.indexOf('viagra') || ~lowerStr.indexOf('xxx')) = true
// Возвращается true
let checkSpam = string => {
let lowerCaseString = string.toLowerCase(); // "Преобразовать" строку в строку с нижним регистром
if (lowerCaseString.indexOf(`viagra`) != -1 || lowerCaseString.indexOf(`xxx`) != -1) { // Если найдена хотя бы одна из подстрок, то вернуть true
return true;
} else { // иначе вернуть false
return false;
}
}
console.log(checkSpam('buy ViAgRA now')); // true
console.log(checkSpam('free xxxxx')); // true
console.log(checkSpam("innocent rabbit")); // false
getDecimal(12.345); // 0.345
getDecimal(1.2); // 0.2
getDecimal(-1.2); // 0.2
getDecimal(5); // 0
getDecimal(1.3); // 0.3
function getDecimal(a) {
var b = Math.abs(a);
console.log("Значение b: " + b);
var returnValue = +(b - Math.floor(b)).toFixed(10);
console.log("Значение(returnValue) которое возвращается при значении a = " + a + ": " + returnValue);
return returnValue;
}
// Значение b: 12.345
// Значение(returnValue) которое возвращается при значении a = 12.345: 0.345
// Значение b: 1.2
// Значение(returnValue) которое возвращается при значении a = 1.2: 0.2
// Значение b: 1.2
// Значение(returnValue) которое возвращается при значении a = -1.2: 0.2
// Значение b: 5
// Значение(returnValue) которое возвращается при значении a = 5: 0
// Значение b: 1.3
// Значение(returnValue) которое возвращается при значении a = 1.3: 0.3
Лучше все таки проверить что передана именно строка.
let ucFirst = string => {
if (typeof string === "string") { // Проверка на тип
return !string ? string : string[0].toUpperCase() + string.slice(1); // Если строка пустая, то вернуть эту строку, т.е пустую стоку. Если строка не пустая, то вернуть новую строку у которой первый символ будет заглавным.
} else {
throw new Error(); // Если передана не строка, то выкинуть исключение
}
}
console.log(ucFirst("string")); // return String
console.log(ucFirst(12)); // Error
// Новый синтаксис добавлен для перебора итерируемых коллекций. Можете написать свою коллекцию с реализацией итератора и использовать for..of для ее перебора.
let arr = [`a`, `b`, `c`, `d`, `e`];
for (elem in arr) {
console.log(elem); // 0 1 2 3 4
}
for (elem of arr) {
console.log(elem); // a b c d e
}
for (let iter = arr[Symbol.iterator]; iter.done;) {
console.log(iter.next()); // a b c d e
}
// Количество заполненных полей в форме делишь на общее количество полей и умножаешь на 100 и передаешь в метод отображения прогресс бара
// Например в форме 7 полей. Заполнил 3. Получается (3 / 7) * 100 = примерно 43%
// Передаешь в метод и отображаешь 43%
//
// Твой же способ как по мне, то неправильный. Поле же не имеет определенного размера. Человек может ввести например имя "Оля" (3 символа) и имя "Светлана" (8 символов). И считывать процент заполнения по символьно в таком случае не получится
let box = {
locked: true,
unlock: function() {
this.locked = false;
},
lock: function() {
this.locked = true;
},
_content: [],
getContent: function() {
return this.locked ? new Error("locked") : this._content;
}
};
let withBoxUnlocked = function(box, callback) {
if (box.locked) {
box.unlock();
callback(box);
box.lock();
} else {
callback(box);
}
}
withBoxUnlocked(box, function(box) {
box.getContent().push("gold");
});
box.unlock();
console.log(box.getContent()); // [gold]
box.lock();
console.log(box.locked); // true