Производительность split () по сравнению с substr () - PullRequest
1 голос
/ 10 января 2012

В руководстве по созданию механизма выбора CSS в JavaScript (видимом для Tuts + members здесь ) автор использует следующий код для удаления всего в строке перед хеш-символом:

// sel = "div#main li"
if (sel.indexOf("#") > 0) {
    sel = sel.split("#");
    sel = "#" + sel[sel.length -1];
}

Хотя я новичок в JavaScript, я не начинающий программист.И это кажется такой огромной операцией, как убийство муравья пушкой.Я бы использовал что-то вроде:

sel.substr(sel.indexOf("#"));

Возможно, даже не заключенный в оператор if, который уже использует indexof().Итак, поскольку автор даже написал книгу по JavaScript, должен быть какой-то секрет, о котором я не знаю: есть ли преимущества использования предыдущего кода?По производительности может быть?

Ответы [ 3 ]

3 голосов
/ 10 января 2012

В разных реализациях обычно наблюдается широкий разброс производительности, поэтому необходимо тестирование. Но если производительность действительно важна, я бы поспорил, что .split() медленнее.

"Может быть, даже не заключен в оператор if ..."

Но я бы сказал, что у вас не должно быть встроенного, как у вас. .indexOf() вернет -1, если совпадений не найдено, что приведет к тому, что .substr выдаст вам последний символ строки.

var sel = 'tester';
sel.substr(sel.indexOf("#")); // "r"

Так что держите заявление if ...

var sel = 'tester',
    idx = sel.indexOf("#"),
    sub;

if( idx !== -1 ) {
    sub = sel.substr("#");
}
0 голосов
/ 10 января 2012

Реальные движки селектора CSS используют регулярные выражения для всего, и это, кажется, лучший способ.Язык предоставляет нам специальный мощный инструмент для работы со строками, так почему бы не использовать его.В вашем случае:

 sub = sel.replace(/^.+?#/, "#")

делает работу быстро и без лишних помех.

Производительность?В javascript нам обычно наплевать, потому что наши приложения не критичны по времени.Никого не волнует, требуется ли 0,1 или 0,01 сек для подтверждения формы или исчезновения в делении.

0 голосов
/ 10 января 2012

Я не уверен, что учебник пытается сделать, но sel="div#main li#first" является допустимым CSS, и их код вернет #first, а sel.substr(sel.indexOf("#")); вернет #main li#firstЯ предполагаю, но это может работать в цикле, когда вы работаете в обратном направлении с помощью селекторов CSS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...