[WT] [Архив]  [Поиск] Главная Управление
[Совместно с Ычаном]
[Назад]
Ответ в нить
Имя
Animapcha image [@] [?]
Тема   ( ответ в 18677)
Сообщение flower
Файл 
Пароль  (для удаления файлов и сообщений)
Параметры   
  • Прежде чем постить, ознакомьтесь с правилами.
  • Поддерживаются файлы типов 7Z, BZ, BZ2, GIF, GZ, JPG, MO, MP3, OGG, PDF, PNG, PSD, RAR, SVG, SWF, TXT, XCF, ZIP размером до 10000 кБ.
  • Ныне 3041 unique user posts. Посмотреть каталог
  • Максимальное количество бампов нити: 500
151607138862.png-(55.23KB, 141×200, .png)
18677
No. 18677 watch    
Привет стив. Я тут потихоньку хочу вкатится в javascript и уже начинаю по чуть-чуть писать код. ИТТ буду кидать код, который не работает и я не могу найти в нем, где же я накосячил. Ну и заодно буду вопросы задавать по сабжу.
Развернуть все изображения
No. 18679    
151607203242.png-(1.90MB, 1200×1700, .png)
18679
Вот значит кусок кода у меня:
var myArray = [];

function ints(myArray) {

if (myArray < 0) {

return myArray;

} else {

for (var i = 0; myArray >= i; i = i + 1) {

myArray.push[i];

`

   
}

return myArray;

 
}

}



Задача у него такая. Есть у нас функция, которая принимает аргумент и из этого начинает заполнять в созданный уже заранее одномерный массив. И заполнять она будет целыми числами его. Их количество равняется номеру аргумента. Но на выходе я получил следующую ошибку:

TypeError: Cannot read property '0' of undefined

Line 7

   
myArray.push[i];

               
^


Stack:


    
ints Line 7 - "myArray.push[i];"

    
testInts (Line 26:19)

`
No. 18681    
151608628013.png-(132.20KB, 520×245, ReLIFE.png)
18681
Похоже на то, что ты собрался по одному имени «myArray» обращаться и к аргументу функции «ints» изнутри этой функции, и к ранее созданному вне её массиву.

Так не получится. Изнутри функции имя аргумента заслонит внешнее имя.

Например, если ты вызвал «ints(17)», то у тебя «myArray.push[i]» будет «17.push[0]» на первом шаге. Это и вызывает ошибку «Cannot read property '0' of undefined», потому что значение «17.push» не определено и никакого свойства 0 (через «17.push[0]» достигаемого) иметь не может.

Также сообщаю, что конструкция «имяМассива.push(значение)» записывается не через квадратные скобки (как обращение к свойству), а через круглые (как вызов функции — в данном случае, вызов метода массива).
No. 18784    
151691611586.jpg-(254.06KB, 1920×1080, .jpg)
18784
>>18681
> Похоже на то, что ты собрался по одному имени «myArray» обращаться и к аргументу функции «ints» изнутри этой функции, и к ранее созданному вне её массиву.
> Так не получится. Изнутри функции имя аргумента заслонит внешнее имя.
А не подскажешь, как тогда в такой ситуации можно поступить? А то я как-то совсем запутался.
Получается параметр функции это тоже в каком-то смысле переменная?
> Также сообщаю, что конструкция «имяМассива.push(значение)» записывается не через квадратные скобки (как обращение к свойству), а через круглые (как вызов функции — в данном случае, вызов метода массива).
Чет не заметил. И правда.
No. 18786    
> буду кидать код
Зачем же так колхозно-то? Полно ведь сервисов для этих целей.
No. 18790    
>>18786
Да понял-понял. Больше так не буду. Я не знал что тут такие проблемы с отображением кода.
No. 18794    
15169888589.png-(103.03KB, 600×640, Конный арбалетчик.png)
18794
>>18784

> Получается параметр функции это тоже в каком-то смысле переменная?

Да.

> А не подскажешь, как тогда в такой ситуации можно поступить? А то я как-то совсем запутался.

Просто дай параметру другое имя.
No. 19011    
151813048450.jpg-(97.76KB, 400×626, Hanako yandere.jpg)
19011
>>18790

> Я не знал что тут такие проблемы с отображением кода.

А нѣтъ никаких особенных проблем с ним.

Просто достаточно одного обратного апострофа в начале кода (содержащего сколько угодно строк) и ещё одного в конце кода.

Выглядит так (на примере приведённого выше некорректного кода):

var myArray = [];


function ints(myArray) {
   if (myArray < 0) {
      return myArray;
   } else {
      for (var i = 0; myArray >= i; i = i + 1) {
         myArray.push[i];
      }
      return myArray;
   }
}

No. 19215    
151912079635.png-(1.03MB, 1280×720, Chūnibyō demo Koi ga Shitai - Guess I&#039;ve go.png)
19215
Это бамп для того, чтобы реплика >>18679 отсеклась в архив и перестала вызывать горизонтальную полосу прокрутки во всём /dev/.

Месяц я терпел эту полосу, но на второй месяц задалбывает.
No. 19216    
151912105787.jpg-(89.22KB, 1280×720, 1505889015007.jpg)
19216
>>19215
Когда нечего написать по теме треда, надо использовать sage.
No. 19226    
151913981055.png-(703.29KB, 1280×720, Code Geass Ep02.png)
19226
>>19216

Ах да.
No. 19311    
Почему эта функцию не хочет делать заглавным первый символ в строке?
https://pastebin.com/gTJ5JjLR

Неужели метод .toUpperCase() не способен работать со строкой, где только есть один символ?
No. 19313    
>>19311
toUpperCase() возвращает новую строку, а не изменяет существующую, и вообще в JS строки относятся к примитивным типам, что значит, что они всегда передаются по значению, а не по ссылке. В отличие от массива, строки не изменяются и с ними нельзя сделать так:
> var a = ['в', 'а', 'с', 'я'];
> a[0] = 'В';
> a // ['В', 'а', 'с', 'я']
Строка:
> var a = 'вася';
> a[0] // "в" - доступ по индексу работает как и в массиве
> a[0] = 'В';
> a // "вася" - нифига не изменилось
Все, что надо сделать в том примере это присвоить переменной firstLetter новое значение, возвращенное функцией toUpperCase():
> var firstLetter = str.charAt(0);
> firstLetter = firstLetter.toUpperCase();
И еще учи матчасть, прочитай хоть что-нибудь, все твои вопросы подробно разжевываются в первой главе любого учебника. Начинать можешь отсюда: https://www.w3schools.com/js/default.asp , https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript , https://webref.ru/dev/learn-javascript
No. 19317    
>>19313
> toUpperCase() возвращает новую строку, а не изменяет существующую, и вообще в JS строки относятся к примитивным типам, что значит, что они всегда передаются по значению, а не по ссылке.
Про это я вкурсе.
> > var firstLetter = str.charAt(0);
> > firstLetter = firstLetter.toUpperCase();
Не втянулся еще просто.
> И еще учи матчасть, прочитай хоть что-нибудь, все твои вопросы подробно разжевываются в первой главе любого учебника. Начинать можешь отсюда: https://www.w3schools.com/js/default.asp , https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript , https://webref.ru/dev/learn-javascript
Спасибо конечно за ссылки, но я уже читаю по learn.javascript.ru
No. 19319    
>>19313
> и вообще в JS строки относятся к примитивным типам, что значит, что они всегда передаются по значению, а не по ссылке.
Как раз таки передаются они всегда по ссылке, а по значению только сравниваются.
No. 19345    
Я сделал функцию, которая определяет, есть ли определенное свойство в объекте, но оно его не видел в функции. Пишет постоянно undefined. Почему?
var shedule = {};

shedule.name = "vasiliy";

function checkParametr(parametr) {

if (shedule.parametr === undefined) {

return true;

}

else {

return false;

}

}

alert(shedule.name);

alert(checkParametr(name));

No. 19347    
Файл
удалён
>>19345

При вызове «checkParametr(name)» в функцию «checkParametr» пытается передаться значение несуществующей переменной «name», которая-то и undefined.

Напрашивающимся выходом из этой ситуации является переписывание функции «checkParametr» таким способом, чтобы она принимала строковое значение.

Кроме того, идентификатор «undefined» не является зарезервированным словом, так что кто-нибудь может создать переменную с таким именем, поэтому на будущее надёжнее не сравнение с undefined напрямую, а сравнение строки «'undefined'» с результатом операции typeof.

С учётом вышеизложенного код принимает такой вид:

var shedule = {};

shedule.name = "vasiliy";

function checkParametr(paramName) {
   return typeof shedule[paramName] === 'undefined';
}

alert(shedule.name);
alert(checkParametr('name'));

No. 19348    
>>19345
1. Твой «checkParameter()» уже есть в языке и называется «Object.hasOwnProperty()» https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty
2. Ты передаешь в функцию необъявленную переменную «name»
3. Функция «checkParamter» у тебя проверяет, имеет ли свойство «parameter» объекта «shedule» значение undefined, она не проверяет ни что-либо еще, переданное ей в аргументы.
4. Аргумент «parameter» в функции ни разу не используется.
5. Ошибочно подразумевается, что «shedule.parametr» вернет «shedule.name», но для доступа к свойствам объекта по ключу из переменной должен использоваться другой синтаксис, через квадратные скобки. См. пост выше.
6. Если условие внутри if выполняется, то функция вернет true, когда свойства нет и false, если нет. Контринтуитивно.
7. Оператор сравнения уже возвращает булево значение, нет необходимости писать if ... else, если все, что оно делает, это возвращает то же самое, что и внутри скобок после if.
8. checkParameter() может проверять только объект «shedule», следовало бы сделать функцию более универсальной, чтобы она могла проверять любой объект, добавив еще один аргумент.
9. Все это не имеет смысла т.к. см. п. 1.
No. 19360    
Дано:
  • фиксированный урл на неподконтрольном домене, например нулевая страница чужой борды
  • регулярное выражение, определяющее нечто, что хочется поискать на этой странице, например все посты, содержащие слово "ОВОЩИ" в верхнем регистре
Задача:
Записать в JS-переменную список матчей этого регэкспа с заданной страницей
No. 19363    
>>19360
https://pastebin.com/k2KCzfTa
No. 19364    
>>19363
Что-то матчер ничего не находит. Такое ощущение, что ответ пустой. См. https://jsfiddle.net/cama387x/5/

Что я делаю не так?
No. 19365    
Файл
удалён
На сáмомъ дѣлѣ такія штуки не работаютъ во браузерѣ.

В конкретной форме https://jsfiddle.net/cama387x/5/ запрос отклоняется браузером по причине, в документе https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content указанной (смешанное активное содержимое), то есть действует запрет вызова HTTPS-сайтами содержимого HTTP-сайтов.

Если адрес http://iichan.hk/b на https://iichan.hk/b переменить, то адрес будет отклонён по другой причине: XMLHttpRequest не работает с одного сайта на другой в том случае, когда на запрашиваемом сайте (на Ычане, в данном случае) не настроены заголовки CORS (способом, в документе https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS указанным), потому что по умолчанию считается, что сайт (Ычан) не разрешал обращаться к себе через XMLHttpRequest снаружи.
No. 19366    
Решить проблему >>19360 можно, однако же, в рамках серверного JavaScript (Node.js).

Шаг 0: ставим Node.js (не только движок Node.js, но и прилагающийся по умолчанию менеджер пакетов npm).

Шаг 1: в некотором пустом тестовом каталоге ставим пакет https://www.npmjs.com/package/request командой «npm install request».

Шаг 2: запускаем REPL движка Node.js командой «node».

Шаг 3: в REPL вводим код «void require('request').get({ uri: 'https://iichan.hk/b'; }, (err, res) => console.log(res.body.includes('ОВОЩИ')))».

Шаг 4: видим, что в консоль вывелось значение «false», то есть слóва «ОВОЩИ» на странице https://iichan.hk/b в настоящее время нѣтъ.
No. 19368    
Движок 410чана, оформляя https://iichan.hk/b как гиперссылку с прилипшим к ней последующим апострофом, вставил в код >>19366 лишнюю точку с запятой перед закрывающей фигурной скобкой; предлагаю игнорировать её.

На всякий случай повторяю тот же код, обрамлённый обратными апострофами (чтобы движок 410чана воспринял его как код) и снабжённый дополнительными отступами (для красоты) и обработкою ошибок (примитивною, через «throw»):

void require('request').get(

   { uri: 'https://iichan.hk/b' },
   (err, res) => {
      if( err ) throw err;
      console.log( res.body.includes('ОВОЩИ') );
   }
);

No. 19369    
Файл
удалён
Соответственно, если вокруг кода >>19368 сочинить вебсервер (на основе http://expressjs.com/ или другого подходящего движка), отвечающий с CORS-заголовками, то через него и во браузере можно будет читать Ычан, а иначе барьеры >>19365 помешают.
No. 19370    
>>19366
Следующий логичный вопрос: есть ли поддержка node.js или другого серверного кода на github.io и аналогичных площадках?
No. 19371    
>>19370
Нет, только jekyll и html. Но с бордами, у которых есть api, и браузерный код будет работать.
No. 19373    
152059329423.png-(10.56KB, 389×285, изображение.png)
19373
Запилил функцию, которая достает строку из свойства объекта и добавляет в конец строку-аргумент, если ее там нет. Только почему-то она не хочет работать. А именно, она стопается на этапе условия "if".
No. 19374    
>>19373
Для начала, не нужно писать велосипед, когда есть https://developer.mozilla.org/ru/docs/Web/API/Element/classList
По коду, в строке
> tempClassName.split(' ');
Допущена та же ошибка, что была описана в >>19313
String.spit() возвращает массив, а не превращает строку в массив и не присваивает переменной, хранящей эту строку новое значение. То, что alert(tempClassName) выдает значение obj.className, а не массив ["open", "menu"], не насторожило?
Ну а далее со строкой работают как с массивом, естественно у строки нет методов push и join.
Советую заиметь привычку использовать const вместо var, чтобы не возникало желания переиспользовать переменные для хранения разных типов и не подразумевать ошибочно, что неизменяемые типы должны изменяться.
https://jsfiddle.net/cgbzmk7u/1/
No. 19375    
>>19370

На странице https://www.heroku.com/pricing предлагают бесплатно до 1000 дино×часов в месяц на 512 мегабайтах памяти и с засыпанием через полчаса неактивности. (Больше и бессоннее — за денежку.)

Можно поискать и найти ещё другие хостинги. Я сообщил только о первом пришедшем на ум.
No. 19376    
Разумѣется, отвѣтъ >>19375 может дополнительно быть расширен упоминанием о том, что для Node.js не обязательно искать спецхостинг, так как можно вписать запуск сервера в автозагрузку у любого VPS, у любого VDS, да даже у домашнего компьютера с выделенным IP-адресом.
No. 19380    
>>19374
> Для начала, не нужно писать велосипед, когда есть https://developer.mozilla.org/ru/docs/Web/API/Element/classList
Да, я до них еще не дошел просто до того. Просто я специально не заглядываю наперед в методах, потому что хочу сделать велосипед из дерева. Ибо так я себе как бы делаю задачу тяжелее, а значит могу развивать мозг. Это как с книгами. Чтобы иметь хоть какую-то креативность, нужно читать книги, но слишком много читать - это вредно,так как все уже поднесено разжеванным и думать не надо. Что-то меня не в ту сторону понесло
> Допущена та же ошибка, что была описана в >>19313
> String.spit() возвращает массив, а не превращает строку в массив и не присваивает переменной, хранящей эту строку новое значение. То, что alert(tempClassName) выдает значение obj.className, а не массив ["open", "menu"], не насторожило?
Ой, я по привычке. Почему-то до сих пор на практике строки воспринимаю как массив. Не знаю, как выработать противоположную привычку.
> Советую заиметь привычку использовать const вместо var, чтобы не возникало желания переиспользовать переменные для хранения разных типов и не подразумевать ошибочно, что неизменяемые типы должны изменяться.
А вот тут детальнее. Что за const? Никогда о ней не слыхал.
No. 19381    
>>19380
const это как var, только const. Вместо переменной будет константа. На практике именно изменяемые переменные нужны довольно редко. Ознакомиться со всеми этими вещами можно в виде нескучных уроков: https://youtu.be/2iLVFyYwyRA
Еще по всем приведенным примерам кода видно очень вольное использование return:
> return alert("Данный класс уже существует")
Вопрос: что вернет эта функция в данном случае? Что она должна возвращать и зачем?
Кроме того, научись пользоваться консолью браузера и отладчиком, кажется весь твой инструментарий сейчас ограничен alert().
Удалить сообщение []
Пароль  
[Mod]