Кто-нибудь может объяснить эту грамматику JavaScript (синтаксис), пожалуйста? - PullRequest
1 голос
/ 08 марта 2010

Я читаю js-файл на здесь , в самом верху этого js-файла вы можете найти следующие строки:

var 
gsAgent=navigator.userAgent.toLowerCase(),
gsAppVer=navigator.appVersion.toLowerCase(),
gsAppName=navigator.appName.toLowerCase(),
gbIsOpera=gsAgent.indexOf("opera")>-1,
gbIsKHTML=gsAgent.indexOf("khtml")>-1
||gsAgent.indexOf("konqueror")>-1||gsAgent.indexOf("applewebkit")>-1,
gbIsSafari=gsAgent.indexOf("applewebkit")>-1,
gbIsIE=(gsAgent.indexOf("compatible")>-1&&!gbIsOpera)
||gsAgent.indexOf("msie")>-1,
gbIsTT=gbIsIE?(gsAppVer.indexOf("tencenttraveler")!=-1?1:0):0,
gbIsFF=gsAgent.indexOf("gecko")>-1&&!gbIsKHTML,
gbIsNS=!gbIsIE&&!gbIsOpera&&!gbIsKHTML&&(gsAgent.indexOf("mozilla")==0)
&&(gsAppName=="netscape"),
gbIsAgentErr=!(gbIsOpera||gbIsKHTML||gbIsSafari||gbIsIE||gbIsTT
||gbIsFF||gbIsNS),
gbIsWin=gsAgent.indexOf("windows")>-1||gsAgent.indexOf("win32")>-1,
gbIsVista=gbIsWin&&(gsAgent.indexOf("nt 6.0")>-1||gsAgent.indexOf("windows vista")>-1),
gbIsWin7=gbIsWin&&gsAgent.indexOf("nt 6.1")>-1,
gbIsMac=gsAgent.indexOf("macintosh")>-1||gsAgent.indexOf("mac os x")>-1,
gbIsLinux=gsAgent.indexOf("linux")>-1,
gbIsAir=gsAgent.indexOf("adobeair")>-1,
gnIEVer=/MSIE (\d+.\d+);/i.test(gsAgent)&&parseFloat(RegExp["$1"]),
gsFFVer=/firefox\/((\d|\.)+)/i.test(gsAgent)&&RegExp["$1"],
gsSafariVer=/version\/((\d|\.)+)/i.test(gsAgent)&&RegExp["$1"],
gsChromeVer=/chrome\/((\d|\.)+)/i.test(gsAgent)&&RegExp["$1"];

Теперь мой вопрос: что это значит под RegExp ["$ 1"] , я не могу найти этот синтаксис в документации js, но он чем-то похож на Ruby * Синтаксис регулярных выражений 1013 *. Кто-нибудь может объяснить это, пожалуйста? Большое спасибо.

PS: Спасибо С.Марк, теперь я знаю, что могу использовать это так:

var a="abc23de";
alert(/(\d+)/.test(a)&&parseInt(RegExp["$1"]));

Но где я могу найти документацию по этому синтаксису? Даже в знаменитой книге JavaScript, окончательном руководстве не упоминается, что RegExp можно использовать таким образом.

Ответы [ 3 ]

3 голосов
/ 08 марта 2010

Это скрипт обнаружения агента пользователя браузера и

RegExp["$1"] - это группа регулярных выражений 1, которая будет

(\d+.\d+) в /MSIE (\d+.\d+);/

Например

  • 6.0 в MSIE 6.0
  • 20091126 в Firefox/20091126
  • 0.2.153.1 в Chrome/0.2.153.1

UPDATE

var a="abc23de";
alert(/(\d+)/.test(a)&&parseInt(RegExp["$1"]));

Приведенные выше коды означают, что если в строке есть числа, извлеките их и проанализируйте в Integer

2 голосов
/ 08 марта 2010

Метод regexp.test () заполняет глобальный объект RegExp тем, что он нашел, см. полный список

/(\d+)(.+)/.test("123abc");
alert(RegExp["$1"]) // "123"

этот способ устарел, гораздо лучше использовать exec () (и его аналог строки ())

var matches = /(\d+)(.+)/.exec("123abc");
alert(matches[1]) // "123"
2 голосов
/ 08 марта 2010

Сайт MDC не работает, поэтому лучшее, что я могу предложить, - это Документация MSDN для объекта RegExp. Вкратце $1, $2, $3, ...$9 - это свойства объекта RegExp, содержащие совпадения в порядке появления в последнем выполненном регулярном выражении.

Пример (взят из MSDN):

function matchDemo(){
   var s;
   var re = new RegExp("d(b+)(d)","ig");
   var str = "cdbBdbsbdbdz";
   var arr = re.exec(str);
   s = "$1 contains: " + RegExp.$1 + "\n";
   s += "$2 contains: " + RegExp.$2 + "\n";
   s += "$3 contains: " + RegExp.$3;
   return(s);
}

Использование квадратных скобок в вашем примере - это просто еще один способ доступа к свойствам объекта - RegExp.$1 функционально аналогичен RegExp["$1"] (в данном случае). Это позволяет извлекать совпадающие группы без использования метода match.

...