Wyjaśnienie [].plaster.wywołanie w javascript?
Natknąłem się na ten zgrabny skrót do konwersji DOM NodeList do zwykłej tablicy, ale muszę przyznać, że nie do końca rozumiem, jak to działa:
[].slice.call(document.querySelectorAll('a'), 0)
Więc zaczyna się od pustej tablicy []
, następnie {[2] } jest używany do konwersji wyniku call
do nowej tablicy tak?
Bit, którego nie rozumiem, to call
. W jaki sposób konwertuje document.querySelectorAll('a')
z NodeList do zwykłej tablicy?
7 answers
Dzieje się tak, że wywołujesz slice()
tak, jakby była to funkcja NodeList
używając call()
. To, co slice()
robi w tym przypadku, to tworzenie pustej tablicy, następnie iteracja przez obiekt, na którym jest uruchomiony (pierwotnie tablica, teraz NodeList
) i dodawanie elementów tego obiektu do pustej tablicy, która jest zwracana. Oto artykuł na ten temat .
EDIT:
To nie w porządku.Więc zaczyna się od pustej tablicy [], następnie slice jest używany do przekonwertuj wynik wywołania na nową tablicę tak?
[].slice
zwraca obiekt funkcji. Obiekt funkcji ma funkcję call()
, która wywołuje funkcję przypisującą pierwszy parametr call()
do this
; innymi słowy, sprawia, że funkcja myśli, że jest wywoływana z parametru (NodeList
zwracanego przez document.querySelectorAll('a')
), a nie z tablicy.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-24 03:00:46
W javascript metody obiektu mogą być powiązane z innym obiektem w czasie wykonywania. W skrócie, javascript pozwala obiektowi "pożyczyć" metodę innego obiektu:
object1 = {
name:'frank',
greet:function(){
alert('hello '+this.name)
}
};
object2 = {
name:'andy'
};
// Note that object2 has no greet method.
// But we may "borrow" from object1:
object1.greet.call(object2); // will show an alert with 'hello andy'
Metody call
i apply
obiektów funkcyjnych (w javascript funkcje są również obiektami) pozwalają na to. Więc w kodzie można powiedzieć, że Nodelist zapożycza metodę slice tablicy. Konwersja polega na tym, że slice zwraca inną tablicę jako wynik.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-05 23:37:49
Pobiera funkcję slice
z Array
. Następnie wywołuje tę funkcję, ale używając wyniku {[2] } jako obiektu this
zamiast rzeczywistej tablicy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-18 14:10:11
Jest to technika konwertowania obiektów podobnych do tablic na rzeczywiste tablice.
Niektóre z tych obiektów to:
-
arguments
w funkcjach - NodeList (pamiętaj, że ich zawartość może ulec zmianie po pobraniu! tak więc konwersja ich do tablicy jest sposobem na ich zamrożenie)
- jQuery collections, aka jQuery objects (some doc: API, Typ, learn )
Służy to wielu celom, na przykład obiekty są przekazywane przez reference, natomiast tablice są przekazywane przez wartość.
Zauważ również, że pierwszy argument 0
można pominąć, dokładne wyjaśnienie tutaj .
I dla kompletności istnieje również jQuery.makeArray () .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:24
Jak to konwertuje
document.querySelectorAll('a')
zNodeList
do regularnej tablicy?
To jest kod, który mamy,
[].slice.call(document.querySelectorAll('a'), 0)
Najpierw go zdemontujmy,
[] // Array object
.slice // Accessing the function 'slice' present in the prototype of Array
.call // Accessing the function 'call' present in the prototype of function object(slice)
(document.querySelectorAll('a'),0)
// 'call' can have arguments like, (thisArg, arg1,arg2...n).
// So here we are passing the 'thisArg' as an array like object,
// that is a 'nodeList'. It will be served as 'this' object inside of slice function.
// And finally setting 'start' argument of slice as '0' and leaving the 'end'
// argument as 'undefined'
Krok: 1 wykonanie call
funkcji
- Wewnątrz
call
, pozathisArg
, reszta argumentów zostanie dołączona do listy argumentów. - teraz funkcja
slice
zostanie wywołana przez powiązanie jej wartościthis
jakothisArg
(array like object pochodzi zdocument.querySelector
) i z argumentem lista. tj. argumentstart
zawierający0
Krok: 2 wykonanie slice
funkcji wywołanej wewnątrz call
-
start
zostanie przypisana do zmiennejs
jako0
- ponieważ
end
jestundefined
,this.length
będą przechowywane we
- pusta tablica będzie przechowywana w zmiennej
a
-
Po wykonaniu powyższych ustawień nastąpi następująca iteracja
while(s < e) { a.push(this[s]); s++; }
- wypełniona tablica
a
będzie zwrócony jako wynik.
P. S dla lepszego zrozumienia naszego scenariusza niektóre kroki niezbędne dla naszego kontekstu zostały zignorowane z oryginalnego algorytmu call i slice.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-15 17:45:11
[].slice.call(document.querySelectorAll('.slide'));
1. The querySelectorAll() method returns all elements in the document that matches a specified selector(s).
2. The call() method calls a function with a given this value and arguments provided individually.
3. The slice() method returns the selected elements in an array, as a new array object.
so this line return the array of [object HTMLDivElement]. Here is the six div with classname "slide" so array length will be 6.
<div class="slideshow">
<div class="slide">
first slider1
</div>
<div class="slide">
first slider2
</div>
<div class="slide">
first slider3
</div>
<div class="slide">
first slider4
</div>
<div class="slide">
first slider5
</div>
<div class="slide">
first slider6
</div>
</div>
<script type="text/javascript">
var arraylist = [].slice.call(document.querySelectorAll('.slide'));
alert(arraylist);
</script>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-17 10:21:02
Z ES6: po prostu utwórz tablicę za pomocą tablicy .from (żywioł.dzieci) lub Array.from ({długość: 5})
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-30 21:58:42