• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JScript #3 - gra wisielec, zbyt duża wartość w zmiennej "miejsce"

Object Storage Arubacloud
0 głosów
251 wizyt
pytanie zadane 26 września 2017 w JavaScript przez morvind94 Nowicjusz (120 p.)

Witam!

Mam pytanie odnośnie dosyć starego odcinka (jak w temacie). Chodzi mianowicie o ten kawałek kodu:

String.prototype.ustawZnak = function(miejsce, znak)
{
	if (miejsce > this.length - 1) return this.toString();
	 return this.substr(0, miejsce) + znak + this.substr(miejsce + 1);
}

Omawianego w tym momencie filmu: https://youtu.be/9FVtiJHFCSU?t=1h9m26s

Zaznaczam, że jestem totalnie początkujący i być może coś przegapiłem, ewentualnie nie potrafię tego zrozumieć. Dobra, przejdźmy do kornetów. Chodzi o sprawdzanie gdy wartość "miejsce" będzie zbyt duża w stosunku do naszego hasła. Czy ten zapis w tym kodzie jest konieczny? Z tego co rozumiem do "miejsce" przypisywana jest pozycja znaku w zmiennej "haslo", gdy zostanie odnaleziona w tym napisie konkretna litera, którą wybierze użytkownik.Odnoszę się konkretnie do tego zapisu:

function sprawdz(nr)
{
	var trafiona = false;
	
	for(i=0; i<dlugosc; i++)
	{
		if (haslo.charAt(i) == litery[nr])
		{
			haslo1 = haslo1.ustawZnak(i, litery[nr]);
			trafiona = true;
		}
        }

Jeżeli w pętli for mamy zdeklarowane, że "i<dlugosc" a długość haslo i haslo1 jest taka sama, więc czy to zabezpieczenie jest konieczne? Z góry dzięki za odpowiedź i pozdrawiam!

1 odpowiedź

+1 głos
odpowiedź 27 września 2017 przez ScriptyChris Mędrzec (190,190 p.)

Tak, jest konieczne z uwagi na to, że metoda ta została podpięta pod łańcuch dziedziczenia globalnego obiektu StringOznacza to, że metodę ustawZnak możesz użyć na każdej zmiennej typu string (a więc również poza pętlą). Zabezpieczenie uniemożliwia podanie jako parametr miejsce wartości, która przekracza długość napisu, w którym chcesz wstawić jakiś znak.

Metoda String.prototype.substr() - zwróć uwagę, że jest ona również dostępna w prototypie obiektu String - jako drugi parametr przyjmuje ilość znaków do wycięcia. W momencie, gdy podasz wartość, która jest równa lub większa długości napisu - otrzymasz cały napis. Wówczas wstawianie znaku do napisu nie będzie miało sensu.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr

Ważne w tym przypadku jest, aby zdać sobie sprawę, że modyfikowanie prototype globalnych obiektów (np. Number, String, Object, Array, Function) spowoduje, że każda nowo utworzona instancja będzie mieć dostęp do pola/metody, którą pod prototype podepniesz - dlatego istotne jest, żeby taka metoda posiadała swoje zabezpieczenia.

O prototypach możesz poczytać tutaj: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

komentarz 28 września 2017 przez morvind94 Nowicjusz (120 p.)

Zapoznałem się z artykułami. Przyznam, że przy obecnym stanie mojej wiedzy, jest to dla mnie troche czarna magia :P. Natomiast rozumiem to w ten sposób, że bez tej linii:

	if (miejsce > this.length - 1) return this.toString();

jeżeli gdzieś w kodzie będę potrzebował użyć metody ustawZnak, a przypadkowo do "miejsce" zostanie przypisana wartość większa niż ilość znaków to spowoduje to problemy z poprawnym działaniem strony. Natomiast jeżeli przyjmiemy, że używam ustawZnak, konretnie tylko w tej pętli "for" z kodu pana Zelenta (tak z czystej ciekawości) to nawet bez tej linijki będzie działało (sprawdzałem), bo gwarantuje nam to warunek "i < dlugosc". Zgadza się?

komentarz 28 września 2017 przez ScriptyChris Mędrzec (190,190 p.)

jeżeli gdzieś w kodzie będę potrzebował użyć metody ustawZnak, a przypadkowo do "miejsce" zostanie przypisana wartość większa niż ilość znaków to spowoduje to problemy z poprawnym działaniem strony

W przypadku tej konkretnej metody nie stanie się nic złego, bo po prostu znak zostanie dopisany na końcu stringa. To, czy strona będzie działać dalej, czy nie zależy od tego jak działa dana metoda. Jedne zwracają undefinednull, -1 (np. String.prototype.indexOf, Array.prototype.IndexOf, Array.prototype.findIndex) inne mogą Ci zwrócić wartość wejściową (czyli możliwe, że nic się nie zmieni), a może się zdarzyć że otrzymasz błąd - co jest w sumie najmniej pożądane. Warto wiedzieć co dana metoda zwraca lub jak reaguje na przypadki, gdy jakaś wartość/pole/funkcja nie została znaleziona. Zawsze można użyć try..catch, choć mądre rozpisanie instrukcji if w większości przypadków wystarcza.

Co do metody ustawZnak z tutoriala - poeksperymentuj. Użyj jej w innym miejscu, przekaż różne parametry - obserwuj konsolę przeglądarki, to Twój podstawowy informator jeśli coś pójdzie nie tak, ale również możesz tam wypisywać przydatne dla Ciebie informacje.

Podobne pytania

0 głosów
3 odpowiedzi 2,624 wizyt
0 głosów
1 odpowiedź 1,191 wizyt
pytanie zadane 24 sierpnia 2016 w JavaScript przez niezalogowany
0 głosów
2 odpowiedzi 344 wizyt
pytanie zadane 13 kwietnia 2021 w Python przez qwert 100 Obywatel (1,250 p.)

92,573 zapytań

141,423 odpowiedzi

319,647 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...