denis_alekss
User-
Posts
35 -
Joined
-
Last visited
Content Type
Profiles
Forums
Calendar
Store
Everything posted by denis_alekss
-
get/set и его использование в Javascript
denis_alekss replied to denis_alekss's question in JavaScript
Когда нужно его вообще использовать get/set? -
Решил понять смысл get/set, написал небольшой код, правильно ли в нем используется метод get/set или нужно по-другому, если по-другому, напишите пож. как лучше в моем коде. <script> class Beverage{ constructor(options){ this.name = options.name; } returnName() {console.log(this.name)} } class Price extends Beverage { constructor(options){ super(options) this.price = options.price; this.bos = options.bos; } result() {console.log("Напиток " + this.name + " Цена" + this.price + "Директор - " + this.bos)} get Bos(){ {return result()} } set Bos(newBos){ const newbos = newBos.split(' '); this.bos = newbos[0]; this.bos = newbos[1] } } const bev = new Beverage({name: 'Coca-cola'}) bev.returnName() const price = new Price({name: 'Fanta',price: " - 200 евро ",bos: "Стивен"}) price.result() price.bos = "Майкл Джексон" price.result() </script>
-
fetch(url) возвращает объект промис, response это объект промис, который мы создаем в then и через него получаем доступ в json() чтобы вытащить этот url и в дальнейшем вывести ссылку https://jsonplaceholder.typicode.com/todos через консоль?
-
Спасибо, хорошая ссылка с примерами. Я читал что первый параметр resolve если успешно второй если не успешно rejected. Тут просто используется вроде объекты первого класса тема? Глянем на этот код: function (r) { setTimeout((function () { r() } ) Я попробовал простой пример который не относится вообще к асинхронным функциям, вот ниже написал, просто этот подход используется в том коде. ((n)=>n)(console.log(5)) Здесь делается похожее. n изначально было просто параметром, а потом превратилось в функцию с именем n. Перепишем обычным кодом: (function (n) {return n})(console.log(5)) Вызывается сразу функция n которую я даже не объявлял, я объявил просто параметр n в анонимной функции. Как кстати переписать эти 2 строчки чтобы вызвать отдельно а не сразу после объявления? Понял, вот так можно через ссылку. let d = (function (n) {return n}) console.log(d(5)) Или сокращенно: let d = (n=>n) console.log(d(5)) Вернемся к коду. Не совсем понял вот эту строку: return fetch(url) }).then(response => response.json()) Что происходит здесь? fetch это встроенный метод Обещаний в который мы передаем в качестве параметра url а затем в обещание через тот же подход через функцию response вызываем метод json, он вытягивает эту ссылку или что?
-
Как мы можем вызвать функцию r не объявляя ее? Интересует вторая строка после конст. const delay = function(ms) { return new Promise(function (r) { setTimeout((function () { r() } ),ms) } ) Вначале создается анонимная функция с параметром r, а в теле этой анонимной функции вызывается функция r внутри функции setTimeout, , откуда взялся вызов функции r? Я ведь ее не объявлял, у меня только был параметр с именем r в анонимной, функции r нигде не объявлена как функция. Я про этот вызов r() в анонимной функции. <script> const delay = function(ms) { return new Promise(function (r){ setTimeout((function () {r()}),ms)}) } const url = 'https://jsonplaceholder.typicode.com/todos' function fetchTodos(){ console.log('Fetch todo started') return delay(2000).then(()=>{ return fetch(url) }).then(response => response.json()) } fetchTodos() .then(data =>{ console.log('Data', data)}) .catch(e=>console.error(e)) </script>
-
Скажите, а целесообразно переписать мой код с использованием асинхронных функций? Сейчас начал изучать асинхронные функции читать, скоро создам следующий пост если что будет не ясно, пока не совсем понимаю смысл написания async function и можно ли ее применить к коду моему. const fib = [1,2,3,5,8,13] for(var i = 0; i < fib.length; i++){ (function(j){ setTimeout(function() { console.log(`fib[${j}] = ${fib[j]}`) },1500) })(i) }
-
тренировочная let fib = [ 1, 2, 3, 5, 8, 13 ]; var xfib = []; let x = 0; for( i of fib ) { (( j ) => { void setTimeout(() => { xfib[ x++ ] = j; }, 1500); })( i ); } Стрелочная функция здесь анонимная с параметром j в который попадает значение i за каждой итерацией? Эта строка нужна чисто чтобы заполнить пустой массив, создав клон массива?
-
Вместо анонимной вы сделали запись короче стрелочной функцией.. for...of вы перебрали элементы массива fib.. и записали все в новый пустой массив xfib, а void в этом коде какую роль играет? Вот так без void также работает: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <script> let fib = [ 1, 2, 3, 5, 8, 13 ]; var xfib = []; let x = 0; for( i of fib ) { (( s) => { setTimeout(() => { xfib[ x++ ] = s; console.log(xfib) }, 1500); })( i ); } </script> </body> </html>
-
При var i = 0 при проверке условия цикла тело цикла вообще выполняется? Или 5 раз проверяется условие но тело не выполняется? 5 раз как проверяется условие выводы почему не происходят?
-
Почему код срабатывает только тогда когда var i = 0; поменять на let i = 0;? Если оставить код как есть вывод: fib[6] = undefined Сам код <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <script> const fib = [1,2,3,5,8,13] for(var i = 0; i < fib.length; i++){ setTimeout(function() { console.log(`fib[${i}] = ${fib[i]}`) },1500) } </script> </body> </html> Вот такой код: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <script> const fib = [1,2,3,5,8,13] for(var i = 0; i < fib.length; i++){ (function(j){ setTimeout(function() { console.log(`fib[${i}] = ${fib[i]}`) },1500) })(i) } </script> </body> </html> выдаст также fib[6] = undefined
-
Вот еще вариант один: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <script> let Person = function Pers(name, age, gender) { // Имя будет Pers this.name = name; this.age = age; this.gender = gender; }; Person.prototype.greet = function () { console.log("My name is " + this.name); } let Person2 = Person; Person2.prototype.goodbye = function () { console.log("Goodbye, " + this.name); } let Son = function (age, skils) { // Имя будет Son // Родительский конструктор вызывается до дочернего конструктора, // чтобы не было перезаписывания новых полей. Person.call(this, undefined, age, undefined); this.skils = skils || []; this.gender; } let Sunny = Son; Sunny.prototype = Object.create(Person.prototype); Sunny.prototype.constructor = Sunny; // Имя будет Son let a = new Person("Петя", 25, "female"); console.log(a); console.log(a.constructor.name); let b = new Son(18, ["рисует", "поет", "водит"]); console.log(b); console.log(b.name); </script> </body> </html> Задался еще таким вопросом. Я передал аргументы конструктору Person создав объект а, let a = new Person("Петя", 25, "female"); а как получить эти значения объекту b и вывести? Если написать так: console.log(b.name); получим undefined при выводе, а мне к примеру нужно унаследовать от родителя эти значения name, age, gender и вывести через потомка. Метод call дал возможность greet вызвать саму себя?
-
Метод call дал возможность greet вызвать саму себя? очему во втором console.log не происходит вывод 18? Ведь я передал через конструктор аргумент 18. Здесь решил попробовать наследование. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> </head> <body> <p id="result"></p> <script> let Person =function(name,age,gender){ this.name = name; this.age = age; this.gender = gender; // return this; }; Person.prototype.greet= function(){ console.log("My name is " + this.name); }; let Son = function(age,skils){ this.skils = skils || []; Person.apply(this,arguments) } Son.prototype = Object.create(Person.prototype); Son.prototype.constructor = Son; let a = new Person("Петя",25,"female"); let b = new Son(18,["рисует","поет","водит"]); console.log(a.age); console.log(b.age + b.skils); </script> </body> </html>
-
Не вызывается почему то конструктор, пишет что не определенный конструктор хотя я ему определяю список аргументов при вызове. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> </head> <body> <p id="result"></p> <script> let Person = { constructor:function(name,age,gender){ this.name = name; this.age = age; this.gender = gender; return this; }, greet: function(){ console.log("My name is " + this.name); } }; var tom = new Person.constructor("Вася",18,"female"); tom.greet(); </script> </body> </html> Почему я не могу использовать просто new для создания объекта, а обязательно нужно использовать Object.create.. Почему нельзя обойтись просто new для вызова конструктора?
-
Зачем нужен prototype в JavaScript? При создании любого объекта в JavaScript создается новый объект __proto__ в системе который ссылается на функцию(класс) с помощью которого этот объект создан. При объявлении функции или класса создается также объект с именем prototype. Он создается для того чтобы потомки функции-классы могли унаследовать его свойства или для того чтобы сделать чисто инициализацию конструктора, которая происходит после new когда объявляется любая функция или класс?
-
Элементов 12, а индекс максимальный 11. lastIndexOf(20, -2) ищет с 10 по 0 indexOf(20, -2) ищет с 10 по 12
-
Вот массив с которым мы работаем: var scores = [10,300, 500, 10, 70, 20, 100, 30, 100, 40, 20, 10]; scores.indexOf(20, -2) - со второго элемента с конца массива, это число 20 идет поиск первого совпадения? Ищет со второго элемента с конца включая его, верно? Второй элемент с конца массива является предпоследним, под индексом 10. scores.lastIndexOf(20,-2) стратегия такая же самая, начинается поиск со второго элемента с конца, включая его? Ведь результат такой же, также выводит индекс 10. Если написать такую строку: scores.lastIndexOf(10,-5) правильно я понимаю, что 5 элемент с конца, это цифра 30, включая ее, с нее стартует поиск к началу массива? И что первое на пути с конца вначало совпадет с цифрой 30, тот и индекс выведется? Даже если эти цифр 30 будет 8 раз на пути к началу массива? Получается отрицательный второй -2 не важно стоит в indexOf или lastIndexOf ищется с конца массива к началу? Такое дело и со строками, не только с числами? indexOf с конца идет вправо, а lastIndexOf c конца идет влево искать элемент..
-
Непонятно каким образом происходит поиск через indexOf и lastIndexOf если присутствует второй отрицательный элемент массива. Написал для примера код: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> </head> <body> <p id="result"></p> <script> var scores = [10,300, 500, 10, 70, 20, 100, 30, 100, 40, 20, 10]; const arrNames = ["Вася","Петя","Коля","Джулия", "Ефросинья","Степан","Борис","Антон","Остап"]; //Ищет с нулевого элемента по конец, первая цифра 20 встречается на 5 индексе result.innerHTML += (scores.indexOf(20)) + ' <br>'; //Ищет с последнего элемента по начало, первую цифру 20 встречается на 10 индексе result.innerHTML += (scores.lastIndexOf(20)) + ' <br>'; result.innerHTML += (scores.indexOf(20, -2)) + ' <br>'; result.innerHTML += (scores.lastIndexOf(20,-2)) + ' <br>'; </script> </body> </html> Интересует вывод последних 2-ух строк со вторым отрицательным параметром в indexOf и lastIndexOf. Откуда идет отсчет и как он идет если есть второй отрицательный элемент в параметре, я про цифру -2.
-
Прочитал статью по ссылке как создать собственный цикл foreach. Вот код: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> </head> <body> <p id="result"></p> <script> const array1 = ['a', 'b', 'c']; const array2 = ['d', 'e', 'f']; const array3 = array1.concat(array2,5,7); //Собсвенный цикл forEach var each = function(arr, callback,thisArg) { var i, length = arr.length; for (i = 0; i < length; i = i + 1) { callback.call(thisArg,arr[i], i, arr); } }; each(array3,(rez,d,array3)=>{ result.innerHTML+= d + ' - ' + rez + '<br> ';} ) </script> </body> </html> Зачем нужен все-таки thisArg? Как увидеть в этом коде что он дает?
-
Работа с массивами в Javascript, не правильно работает метод slice
denis_alekss replied to denis_alekss's question in JavaScript
Я выводил не новый массив, а старый, в этом был залет. Поменял на строку result.innerHTML += i + " - " + rez[i] + '<br>'} Вроде как заработал вывод. Только есть момент. Если к написать вот так: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> </head> <body> <p id="result"></p> <script> let arr = ["Я", "изучаю", "JavaScript", "прямо", "сейчас", "помни", "это"]; let rez = arr.slice(-3); for(let i = 0; i<rez.length; i++){ result.innerHTML += i + " - " + rez[i] + '<br>'} </script> </body> </html> Вывод правильный, с конца массива стартует вывод с третьего элемента по последний: 0 - сейчас 1 - помни 2 - это Ели поменять эту строку: let rez = arr.slice(-3); на let rez = arr.slice(2,5); Вывод такой: 0 - JavaScript 1 - прямо 2 - сейчас Но должен произойти вывод со 2-го элемента по 5, но происходит вывод со второго по 4-ый элемент, почему? 2 элемент массива: "JavaScript", 3 элемент массива: "прямо", 4 элемент массива: "сейчас", 5 элемент массива: "помни", 5 -ый элемент, слово помни не выводит. -
Работа с массивами в Javascript, не правильно работает метод slice
denis_alekss posted a question in JavaScript
Прочитал про метод slice на сайте Javascript https://learn.javascript.ru/array-methods. Не правильно выводит массив. Вот код: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> </head> <body> <p id="result"></p> <script> let arr = ["Я", "изучаю", "JavaScript", "прямо", "сейчас", "помни", "это"]; arr.slice(-4); for(let i = 0; i<arr.length; i++){ result.innerHTML += i + " - " + arr[i] + '<br>'} </script> </body> </html> Строка arr.slice(-4); Должна с 4-го элемента, считаем с конца массива, так как там минус 4. Это элемент прямо. Должно вывести со слова прямо до конца все элементы. А выводит все элементы полностью. Если изменить код на такой: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> </head> <body> <p id="result"></p> <script> let arr = ["Я", "изучаю", "JavaScript", "прямо", "сейчас", "помни", "это"]; let rez = arr.slice(-4); for(let i = 0; i<rez.length; i++){ result.innerHTML += i + " - " + arr[i] + '<br>'} </script> </body> </html> произойдет вывод только первых 4-х элементов, но правило гласит если -4, с конца считаем 4 -ый элемент и выводим все элементы до конца, но выводится почему-то элементы сначала, 0 - Я 1 - изучаю 2 - JavaScript 3 - прямо вместо такого вывода: "прямо", "сейчас", "помни", "это" Второй пример: Если я захочу скопировать с какого-то элемента массива по какой-то. Например со 2-го элемента по 5. И напишу такой код: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> </head> <body> <p id="result"></p> <script> let arr = ["Я", "изучаю", "JavaScript", "прямо", "сейчас", "помни", "это"]; let rez = arr.slice(2,5); for(let i = 0; i<rez.length; i++){ result.innerHTML += i + " - " + arr[i] + '<br>'} </script> </body> </html> arr.slice(2,5); Не приосходит копирования, происходит вывод непонятно чего, а вывод такой в итоге: 0 - Я 1 - изучаю 2 - JavaScript хотя я эти элементы не выбирал вообще, а выбирал эти: "изучаю", "JavaScript", "прямо", "сейчас", -
Прочитал информацию по ссылке, я так понял такая фишка только с формами работает вывод, если вывод например в span, div или р сделать не получиться. Вот например: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> </head> <body> <form name="my"> <input name="one" value="1"> <input name="two" value="2"> </form> <script> document.forms.my.elements.one.value = "Фэнтэзи"; </script> </body> </html> Стартует с объекта документ, заходит в форм, затем выбирает объект my одной из форм, которіе вообще есть с єтим именем, а затем в объект one, а затем свойство value или метод value. для div, span, p никак не поиграешься
-
Работает и такой вариант: document.getElementById('result').innerHTML += i + ' ' + arr[i] + '<br> ';} и такой: document.getElementById('result'). Какой из этих 2-ух вариантов лучше? Если по простому, то да. Если это так, тогда построим цепочку document.forms.result.innerHTML += i + ' ' + arr[i] + '<br> ';} Тогда получаю ошибку:
-
Вот так сработало,спасибо <input type="submit" onClick="fanta(); return false;" value="Жми"> Что делает текст return false? Возвращает ложь при отправке формы, из-за этого происходит выввод? result - это объект объекта FORM, а форм объект объекта document? document.form.result? Вот так намного лучше с result.innerHTML = " "; function fanta(){ result.innerHTML = " "; let rez = one.elements.number.value; nextPrime: for(let i = 2; i<=rez; i++){ for( let j = 2; j < i; j++){ if(i%j ==0) continue nextPrime; } result.innerHTML += i + '<br>'; } } Кстати если ввести 50 000 в текстовое поле, браузер подвисает Еще важный момент. Вы говорили что document.write переписывает весь документ при выводе и его лучше не использовать. Если дело обстоит с формой, можно использовать result.innerHTML, а если там просто <p id="result"></p> Как правильней чтобы не переписывался документ производить вывод? К примеру вот такой код не сработает: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> <script> let arr = ["Я", "изучаю", "JavaScript", "прямо", "сейчас", "помни", "это"]; arr.splice(-5,1); for(let i = 0; i<arr.length; i++){ result.innerHTML = arr[i];} </script> </head> <body> <p id="result"></p> </body> </html> и такой тоже не сработает: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> <script> let arr = ["Я", "изучаю", "JavaScript", "прямо", "сейчас", "помни", "это"]; arr.splice(-5,1); for(let i = 0; i<arr.length; i++){ document.getElementById("result").innerHTML = arr[i];} </script> </head> <body> <p id="result"></p> </body> </html> Сработало только так <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> </head> <body> <p id="result"></p> <script> let arr = ["Я", "изучаю", "JavaScript", "прямо", "сейчас", "помни", "это"]; let output = document.getElementById('result'); let str = ' '; arr.splice(-5,1); for(let i = 0; i<arr.length; i++){ str += i + " - " + arr[i] + '<br>'} output.innerHTML = str; </script> </body> </html> Но вы говорите что innerHTML равносильно document.write и так и так код переписывает документ, какая же альтернатива? Как вывести массив не перезаписуя документ? Как сделать подобие того как мы выводили двой цикл for строкой result.innerHTML += i + '<br>';
-
Разобрался, отладчик Мозила за каждым шагом выводит на экран лучше чем ХРОМ, спасибо. Последний момент с выводом через документ.врайт. Вы предложили альтернативу. Я попробовал вывести весь результат в <p id='result'></p> и вместо строки document.write(i+"<br>"); указал result.innerHTML += i + '<br>'; Запускаю программу, ввожу в текстовое поле 10, нажимаю на кнопку, происходит мгновенный вывод всего результата за 1 сек и сразу вывод исчезает. Почему результат не остается на экране? Как лампочка загорелась и выключилась. Вот полный код. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> <script> function fanta(){ let rez = one.elements.number.value; nextPrime: for(let i = 2; i<=rez; i++){ for( let j = 2; j < i; j++){ if(i%j ==0) continue nextPrime; } result.innerHTML += i + '<br>'; } } </script> </head> <body> <form id="one"> <input type="text" name="number" > <input type="submit" onClick="fanta()" value="Жми"> </form> <p id='result'></p> </body> </html> Если написать такую строку result.getElementById('result').innerHTML += i + '<br>'; Тогда вообще вывода не будет, даже мгновенного
-
Вот выделил как у вас, нажимаю в Хроме F9, пробую даже F10, не срабатывает ничего, просто выделен этот код как на скрине внизу и больше ничего не происходит.