开发者

Can anyone explain this JavaScript grammar(syntax) please?

I'm reading a js file at here, on the very top of this js file you can find the following lines:

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,
gbIs开发者_StackOverflow社区Mac=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"];

Now my question is what does it mean by RegExp["$1"], I can't find this syntax on the js documentation, but it's somewhat like Ruby's regex syntax. Can anyone explain it please? Great thanks.

PS: Thanks S.Mark, now I know I can use it like this:

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

But where can I find the documentation of this syntax? Even the famous book JavaScript the definitive guide has not mentioned that RegExp can be used like this.


Its a browser user agent detection script and

RegExp["$1"] is Regular Expression Group 1, which would be

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

For example

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

UPDATE:

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

Above codes mean, if there is numbers in the string, extract those and parse it to Integer


regexp.test() method populates the global RegExp object with what it has found, see the full list

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

this way is deprecated, much better is to use exec() (and its string counterpart match())

var matches = /(\d+)(.+)/.exec("123abc");
alert(matches[1]) // "123"


MDC site was down, so the best I can offer is MSDN's documentation for the RegExp object. In short $1, $2, $3, ...$9 are properties of the RegExp object, containing the matches in order of appearance in the last executed regular expression.

Example (taken from 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);
}

The use of square braces in your example is just another way of accessing properties on an object - RegExp.$1 is functionally the same as RegExp["$1"] (in this case). This allows you to retrieve matching groups without using the match method.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜