Статьи

Сила String.prototype.split ()… почти

Если вы чувствуете, что не получаете достаточного уважения как веб-разработчик, вот хороший пирог [предупреждение ненормативной лексики — не нажимайте, если вы легко обижаетесь], чтобы бросать на людей.

На самом деле думаю, что сегмент «время, потраченное на то, чтобы желать медленной мучительной смерти Биллу Гейтсу» нуждается в расширении — Билл не виноват. На самом деле было бы замечательно, если бы команда разработчиков IE была более откровенной и присваивала названия функциям, поэтому мы точно знаем , на кого ругаться: «Привет, я [вставить имя] и я парень, который поставил неопределенное значение в конце вашего массива, каждый раз, когда вы оставляете запятую, заканчивающуюся ошибками, которые будут вас удивлять часами 🙂 ».

Немного горький в тот момент, после того, как меня ужалило это специальное предложение , играя с этой версией Javascript Несмотря на все вещи AJAXy, написание кросс-браузерного кода все равно кажется слепым. Позвольте мне немного пожаловаться …

Из спецификации (p103 / 104);

Если разделитель является регулярным выражением, содержащим вводные скобки, то каждый раз разделитель
совпавшие результаты (включая любые неопределенные результаты) захватывающих скобок, сгруппированных в
выходной массив. […]

На самом деле это поведение не является чем-то особенным для Javascript.

Например, Perl…

use Data::Dumper; print Dumper(split(/(:)/, 'a:b:c')); 

…выход…

 $ VAR1 = 'a';
 $ VAR2 = ':';
 $ VAR3 = 'b';
 $ VAR4 = ':';
 $ VAR5 = 'c';

… и PHP …

print_r(preg_split('/(:)/', 'a:b:c', -1, PREG_SPLIT_DELIM_CAPTURE));
print_r(preg_split('/(:)/', 'a:b:c', -1, PREG_SPLIT_DELIM_CAPTURE)); 

…выход…

 массив
 (
     [0] => а
     [1] =>:
     [2] => б
     [3] =>:
     [4] => с
 )

… и Python …

import re print re.compile('(:)').split('a:b:c')
import re print re.compile('(:)').split('a:b:c') 

…выход…

 ['a', ':', 'b', ':', 'c']

В Javascript это могло бы быть так просто, как …

alert( "a:b:c".split(/(:)/) );
alert( "a:b:c".split(/(:)/) ); 

… что в Firefox (с помощью Firebug ) дает мне;

 [ "А", ":", "б", ":", "с"]

Аналогично Opera 9 делает это правильно. Но в IE (6) …

 а, б, в

Где я мой захваченный сепаратор! ,

Как сказал Саймон ;

Почему это так важно? Потому что это вдруг делает написание простых парсеров и токенизаторов намного проще.

На самом деле обвинение в команде IE, вероятно, несправедливо — это, кажется, «особенность», предоставленная командой JScript, и, похоже, она также split.js , например, с помощью скрипта, подобного split.js содержащего;

import System.Windows.Forms; MessageBox.Show("a:b:c".split(/(:)/));
import System.Windows.Forms; MessageBox.Show("a:b:c".split(/(:)/)); 

Я могу скомпилировать его с помощью компилятора jsc в DOS, например, D:js> C:WINDOWSMicrosoft.NETFrameworkv2.0.50727jsc.exe /nologo split.js затем запустить файл split.exe чтобы получить точно такой же split.exea,b,c . Вздох.

В любом случае — подробнее об этом лексере в другой раз (со временем удалось обойти это). Кстати, если вам нужно что-то для серьезного анализа в Javascript (хотя только в Moz), взгляните на этот генератор компилятора в Javascript .