(JavaScript) slice() vs. splice()

Discussion in 'PHP' started by |qbz|, 8 May 2012.

  1. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Сейчас задумался над этими функциями.

    Слайс возвращает энное количество элементов массива начиная с какой-то позиции.
    Пример:

    Code:
    alert([1,2,3].slice(1, 3)); // выведет [2,3]
    Сплайс, по идее, должен делать тоже самое, только наоборот, то есть он удаляет выделенные элементы (ну или заменяет их) и возвращать должен именно измененный таким образом массив. Но возвращает он то же, что и слайс (да, он модифицирует массив, с которым работает, но почему-то возвращет не его, а срез).

    Пример:

    Code:
    alert([1,2,3].splice(1,2)); // выведет [2,3]
    Нафига так задумано? Зачем в ретурнах у них прописано у обоих функционал слайса? Какие-то костыли...


    UPD:

    И еще вопрос в догонку, как алиасить документ правильнее?

    Code:
    $ = function(){return document;}();
    или просто

    Code:
    $ = document;
    Мне кажется второй вариант нельзя юзать.
     
    #1 |qbz|, 8 May 2012
    Last edited: 8 May 2012
  2. astrologer

    astrologer Elder - Старейшина

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Нет.
    Code:
    15.4.4.10 Array.prototype.slice(start, [B]end[/B])
    15.4.4.12 Array.prototype.splice(start, [B]deleteCount[/B] ... )
    Оба варианта вредны, первый избыточен.
    Code:
    ~function ($)
    {
      // your code
    }(document);
     
  3. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Ни нет, а да, сам протестируй. Слайс и сплайс отличаются между собой как субстр и субстринг - один вырезает по оффсету, другой с нулевой позиции. Но вопрос не в этом. Как я понимаю, функционал должен быть "вырезанием" из массива. То бишь возвращать, как можно логично предположить, должен именно обработанный массив. Но возвращает именно вырезанный кусок.

    Насчет алиасов понял, но не совсем. Зачем там побитовое отрицание перед функцией (~)?
     
    #3 |qbz|, 9 May 2012
    Last edited: 9 May 2012
  4. astrologer

    astrologer Elder - Старейшина

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Они работают так, как в спецификации указано.
    У функции slice второй параметр индекс. У splice - энное количество.

    Один из способов объявить FunctionExpression с целью сразу же вызвать. Выражение в JS не может начинаться с ключевого слова function.
     
  5. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    astrologer, спасибо, конечно, за ответ, но ты не понимаешь сути вопроса моего - я просто непонимаю почему сплайс возвращает не модифицированный массив, а вырезанную часть этого массива. Ну да ладно, забили. А насчет ~ для меня это новое, просто всегда юзал (функция)(); и все... Ну типа:

    (function(){alert(1);})();
     
  6. astrologer

    astrologer Elder - Старейшина

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Наверное, потому что это срезы, полученные разными способами. И именно потому, что исходный массив модифицируется. Он обычно и так в переменной лежит, зачем дублировать, возвращая его же. Лучше срез.

    Так тоже можно, разумеется - исключительно вопрос удобства.
     
    1 person likes this.
  7. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Если есть желание пообщаться на тему яваскрипта, оставь свою асю тут или в ПМ, есть еще пара вопросов.
     
    1 person likes this.