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?

Author: Yansky, 2010-01-24

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:

Więc zaczyna się od pustej tablicy [], następnie slice jest używany do przekonwertuj wynik wywołania na nową tablicę tak?

To nie w porządku. [].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.
 131
Author: Max Shawabkeh,
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.

 96
Author: slebetman,
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.

 24
Author: Brian Campbell,
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 () .

 18
Author: Gras Double,
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') z NodeList 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, poza thisArg, reszta argumentów zostanie dołączona do listy argumentów.
  • teraz funkcja slice zostanie wywołana przez powiązanie jej wartości this jako thisArg (array like object pochodzi z document.querySelector) i z argumentem lista. tj. argument start zawierający 0

Krok: 2 wykonanie slice funkcji wywołanej wewnątrz call

  • start zostanie przypisana do zmiennej s jako 0
  • ponieważ end jest undefined, this.length będą przechowywane w e
  • 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.

 10
Author: Rajaprabhu Aravindasamy,
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>
 2
Author: Ankit Parmar,
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})

 0
Author: Мони,
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