Skip to content

Commit 95f57a7

Browse files
author
Lukasz Kufel
committed
Polish translation of types section.
1 parent 33efc05 commit 95f57a7

File tree

6 files changed

+283
-3
lines changed

6 files changed

+283
-3
lines changed

doc/pl/index.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,16 @@
4343
"general",
4444
"constructor"
4545
]
46+
},
47+
{
48+
"title": "Typy",
49+
"dir": "types",
50+
"articles": [
51+
"equality",
52+
"typeof",
53+
"instanceof",
54+
"casting"
55+
]
4656
}
4757
]
4858
}

doc/pl/intro/translators.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
## Tłumaczenie
22

3-
- [Łukasz Kufel][1] ([qfel13.pl][2])
3+
- [Łukasz Kufel][1]
44

5-
[1]: https://github.com/qfel13
6-
[2]: http://qfel13.pl
5+
[1]: http://qfel13.pl

doc/pl/types/casting.md

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
## Rzutowanie typów
2+
3+
JavaScript jest językiem słabo typowanym, co za tym idzie będzie stosować koercję
4+
typów **gdziekolwiek** jest to możliwe.
5+
6+
// These are true
7+
new Number(10) == 10; // Number.toString() zostanie przekształcone
8+
// z powrotem do liczby
9+
10+
10 == '10'; // Stringi zostaną przekształcone do typu Number
11+
10 == '+10 '; // Kolejne wariacje
12+
10 == '010'; // i następne
13+
isNaN(null) == false; // null zostanie przekształcony do 0
14+
// który oczywiście nie jest NaN
15+
16+
// Poniższe zwracają false
17+
10 == 010;
18+
10 == '-10';
19+
20+
> **Uwaga ES5: Literały licznowe zaczynające sie od `0` są interpretowane jako
21+
> liczby w systemie ósemkowym. W trybie strict mode w ECMAScript 5 wsparcie dla
22+
> liczb ósemkowych zostało porzucone.
23+
24+
Aby uniknąć powyższych problemów, należy **koniecznie** skorzystać ze
25+
[ściełego operatora równości](#types.equality). Mimo, że pozwala to uniknąć wiele
26+
typowych problemów to nadal istnieje wiele innych, które powstają na bazie słabego
27+
typowania języka JavaScript.
28+
29+
### Konstruktory typów wbudowanych
30+
31+
Konstruktory typów wbudowanych takich, jak `Number` lub `String` zachowują się
32+
inaczej jeżeli są poprzedzone słowem kluczowym `new` a inaczej jeżeli nie są.
33+
34+
new Number(10) === 10; // False, Object i Number
35+
Number(10) === 10; // True, Number i Number
36+
new Number(10) + 0 === 10; // True, ponieważ dokonana została jawna konwersja
37+
38+
Korzystanie z wbudowanych typów jak `Number` jako konstruktor utworzy nowy obiekt
39+
typu `Number`, natomiast opuszczenie słowa kluczowego `new` spowoduje, że funkcja
40+
`Number` zachowa się jak konwerter.
41+
42+
Ponadto, użycie literałów lub wartości nieobiektowych zaowocuje jeszcze większą
43+
ilością rzutowań (koercją) typów.
44+
45+
Najlepszym rozwiązaniem jest **jawne** rzutowanie do jednego z trzech typów.
46+
47+
### Rzutowanie do typu String
48+
49+
'' + 10 === '10'; // true
50+
51+
Konkatenacja pustego stringu i wartości powoduje rzutowanie do typu String.
52+
53+
### Rzutowanie do typu Number
54+
55+
+'10' === 10; // true
56+
57+
Zastosowanie **unarnego** operatora + spowoduje rzutowanie do typu Number.
58+
59+
### Rzutowanie do typu Boolean
60+
61+
Używając dwukrotnie operatora **negacji** dowolna wartość może zostać zrzutowana
62+
do typu Boolean
63+
64+
!!'foo'; // true
65+
!!''; // false
66+
!!'0'; // true
67+
!!'1'; // true
68+
!!'-1' // true
69+
!!{}; // true
70+
!!true; // true
71+
72+

doc/pl/types/equality.md

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
## Równość i porównania
2+
3+
JavaScript posiada dwa różne sposoby równościowego porównywania obiektów.
4+
5+
### Operator równości
6+
7+
Operator równości składa się z dwóch znaków "równa się": `==`
8+
9+
JavaScript jest słabo typowanym językiem. Oznacza to, że operator równości
10+
**konwertuje** typy (dokonuje **koercji**), aby wykonać porównanie.
11+
12+
"" == "0" // false
13+
0 == "" // true
14+
0 == "0" // true
15+
false == "false" // false
16+
false == "0" // true
17+
false == undefined // false
18+
false == null // false
19+
null == undefined // true
20+
" \t\r\n" == 0 // true
21+
22+
Powyższa tabela przedstawia wyniki koercji typów. Nieprzewidywalne wyniki
23+
porównania są głównym powodem, że stosowanie `==` jest powszechnie uważane za złą
24+
praktykę. Skomplikowane reguły konwersji są powodem trudnych do wyśledzenia błędy.
25+
26+
Ponadto koercja ma również wpływ na wydajność na przykład gdy typ String musi zostać
27+
przekształcony na typ Number przed porównaniem z drugą liczbą.
28+
29+
### Operator ścisłej równości
30+
31+
Operator ścisłej równości składa się z **trzech** znaków "równa się": `===`
32+
33+
Działa on dokładnie tak jak normalny operator równości, z jednym wyjątkiem nie
34+
dokonuje koercji typów przed porównaniem.
35+
36+
"" === "0" // false
37+
0 === "" // false
38+
0 === "0" // false
39+
false === "false" // false
40+
false === "0" // false
41+
false === undefined // false
42+
false === null // false
43+
null === undefined // false
44+
" \t\r\n" === 0 // false
45+
46+
Powyższe rezultaty są o wiele bardziej przejrzyste. Powoduje to "ustatycznienie"
47+
języka do pewnego stopnia oraz pozwala na wprowadzenie optymalizacji porównań
48+
obiektów o różnych typach.
49+
50+
### Porównywanie obiektów
51+
52+
Mimo, że oba operatory `==` i `===` nazywane są operatorami **równościowymi**,
53+
to zachowują się różnie gdy jednym z operandów jest obiekt typu `Object`.
54+
55+
{} === {}; // false
56+
new String('foo') === 'foo'; // false
57+
new Number(10) === 10; // false
58+
var foo = {};
59+
foo === foo; // true
60+
61+
Oba operatory porównują **toższmość** a **nie** równość, czyli będą porównywać czy
62+
jeden i drugi operand jest tą samą **instancją** obiektu, podobnie jak operator
63+
`is` w Pythonie i porównanie wskaźników w C.
64+
65+
### Wnioski
66+
67+
Zaleca się aby używać tylko operatora **ścisłej równości**. W sytuacjach gdy
68+
potrzebna jest koercja (porównanie obiektów różnych typów), konwersja powinna
69+
być dokonana [jawnie](#types.casting) a nie pozostawiona trudnym regułom koercji
70+
obowiązującym w języku.
71+

doc/pl/types/instanceof.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
## Operator `instanceof`
2+
3+
Operator `instanceof` porównuje konstruktory obiektów przekazanych jako operendy.
4+
Jest on jedynie użyteczny do porównywania obiektów utworzonych klas. Stosowanie
5+
go na wbudowanych typach jest praktycznie tak samo bezużyteczne jak operatora
6+
[typeof](#types.typeof).
7+
8+
### Porównywanie obiektów utworzonych klas
9+
10+
function Foo() {}
11+
function Bar() {}
12+
Bar.prototype = new Foo();
13+
14+
new Bar() instanceof Bar; // true
15+
new Bar() instanceof Foo; // true
16+
17+
// Poniżej kod który przypisuje do Bar.prototype obiekt funkcji Foo
18+
// a nie faktyczną instancję Foo
19+
Bar.prototype = Foo;
20+
new Bar() instanceof Foo; // false
21+
22+
### Stosowanie `instanceof` na natywnych typach
23+
24+
new String('foo') instanceof String; // true
25+
new String('foo') instanceof Object; // true
26+
27+
'foo' instanceof String; // false
28+
'foo' instanceof Object; // false
29+
30+
Jedną ważną rzeczą, którą należy zauważyć jest to, że `instanceof` nie zadziała
31+
na obiektach, które pochodzą z różnych kontekstów JavaScript (np. z różnych
32+
dokumentów wewnątrz przeglądarki), ponieważ ich konstruktory nie będą tymi
33+
samymi obiektami.
34+
35+
### Wnioski
36+
37+
Operator `instanceof` powinien być **tylko** używany podczas korzystania z obiektów
38+
klas utworzonych, które były zdefiniowane w tym samym kontekscie JavaScriptowym.
39+
Podobnie jak operator [`typeof`](#types.typeof), należy **unikać** korzystania
40+
z tego operatora w innych sytuacjach.
41+

doc/pl/types/typeof.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
## Operator `typeof`
2+
3+
Operator `typeof` (razem z operatorem [`instanceof`](#types.instanceof)) jest
4+
prawdopodobnie najwiekszą wadą konstrukcji języka JavaScript, jest on praktycznie
5+
**całkowicie wadliwy**.
6+
7+
Mimo, że `instanceof` ma swoje wady to nadal ma ograniczone zastosowanie w praktyce,
8+
natomiast `typeof` ma tylko jeden praktyczny przypadek użycia, który na dodatek
9+
**nie** jest związany z sprawdzaniem typu obiektu.
10+
11+
> **Uwaga:** Do wywołania operatora `typeof` może zostać użyta składnia funkcyjna np.
12+
> `typeof(obj)`, ale nie jest to wywołanie funkcji. Dwa nawiasy zwrócą obiekt
13+
> znajdujący się wewnątrz i zwrócona wartość stanie się operandem operatora
14+
> `typeof`. **Nie istnieje** funkcja `typeof`.
15+
16+
### Tablica typów JavaScript
17+
18+
Wartość Klasa Typ
19+
-------------------------------------
20+
"foo" String string
21+
new String("foo") String object
22+
1.2 Number number
23+
new Number(1.2) Number object
24+
true Boolean boolean
25+
new Boolean(true) Boolean object
26+
new Date() Date object
27+
new Error() Error object
28+
[1,2,3] Array object
29+
new Array(1, 2, 3) Array object
30+
new Function("") Function function
31+
/abc/g RegExp object (function w Nitro i V8)
32+
new RegExp("meow") RegExp object (function w Nitro i V8)
33+
{} Object object
34+
new Object() Object object
35+
36+
W powyższej tabeli *Typ* odnosi się do wartości zwracanej przez operator `typeof`.
37+
Wyraźnie widać, że zwracane wartości w ogóle nie są spójne.
38+
39+
*Klasa* odnosi sie do wartości wewnętrznej właściwości `[[Class]]` obiektu.
40+
41+
> **Fragment Specyfikacji:** Wartość `[[Class]]` może być jednym z poniższych
42+
> stringów. `Arguments`, `Array`, `Boolean`, `Date`, `Error`,
43+
> `Function`, `JSON`, `Math`, `Number`, `Object`, `RegExp`, `String`.
44+
45+
W celu uzyskania wartości właściwości `[[Class]]` trzeba skorzystać z metody
46+
`toString` z `Object.prototype`.
47+
48+
### Klasa obiektu
49+
50+
Specyfikacja zawiera dokładnie jeden sposób dostepu do wartości `[[Class]]`,
51+
wykorzystując `Object.prototype.toString`.
52+
53+
function is(type, obj) {
54+
var clas = Object.prototype.toString.call(obj).slice(8, -1);
55+
return obj !== undefined && obj !== null && clas === type;
56+
}
57+
58+
is('String', 'test'); // true
59+
is('String', new String('test')); // true
60+
61+
Powyższy przykład wywołuje `Object.prototype.toString` z wartością
62+
[this](#function.this) ustawioną na obiekt, dla której wartość właściwości
63+
`[[Class]]` ma zostać odczytana.
64+
65+
> **Uwaga ES5:** Dla zwiększenia wygody wartość zwracana przez
66+
> `Object.prototype.toString` dla `null` i `undefined` została zmieniona
67+
> z `Object` na `Null` i `Undefined` w ECMAScript 5.
68+
69+
### Testowanie niezdefiniowania zmiennej
70+
71+
typeof foo !== 'undefined'
72+
73+
Powyższy kod sprawdza czy `foo` została faktycznie zadeklarowana czy też nie.
74+
Próba odwołania się do zmiennej spowodowała by wyrzucenie błędu `ReferenceError`.
75+
Jest to jedyne praktyczne wykorzystanie operatora `typeof`.
76+
77+
### Wnioski
78+
79+
W celu sprawdzenia typu obiektu zalecane jest skorzystanie z
80+
`Object.prototype.toString`, ponieważ jest to jedyny wiarygodny sposób. Jak
81+
pokazano w powyższej tabeli typów, niektóre wartości zwracane przez `typeof` nie
82+
są zdefiniowane w specyfikacji, co za tym idzie mogą się różnić w różnych
83+
implementacjach.
84+
85+
O ile nie operator `typeof` nie jest użyty do sprawdzania czy zmienna została
86+
zdefiniowana, powinien być unikany **o ile to tylko możliwe**.
87+

0 commit comments

Comments
 (0)