首先看一下其中的正则表达:html
fragmentRE = /^\s*<(\w+|!)[^>]*>/, singleTagRE = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, rootNodeRE = /^(?:body|html)$/i, capitalRE = /([A-Z])/g,
JavaScript的正则表达式要包含在/ /
中间。后面能够跟g
,i
来表示是否进行全局匹配或者不区分大小写匹配。jquery
fragmentRE = /^\s*<(\w+|!)[^>]*>/
^
从句首开始匹配\s
是一个metacharacter
,匹配一个空白字符,包括space, tab, carriage return。 后面跟着*
,表示能够匹配0个或0个以上空白字符<
匹配一个 <
(\w+|!)
, \w
是一个metacharacter
, 匹配0-9a-zA-Z_
, 注意其中包括下划线. \w+
表示匹配一个或者一个以上该字符. |
表示或者. !
匹配!
. 括号的做用是用于捕获(capture), 在匹配文本时,能够输出相对应的字符(characters).[^>]
^
在句首表示从开始匹配, 在[]
这个class中表示 非 的意思, 并且[]
只能表示一个字符。 因此这个表达式的意思是 匹配一个不是>
的字符.后面跟着*
,表示匹配0个或者0个以上不是>
的字符>
匹配一个 >
.singleTagRE = /^<(\w+)\s*\/?>(?:<\/\1>|)$/
^
匹配句首<
匹配 <
(\w+)
匹配一个或者多个0-9a-zA-Z_
的字符, 而且catpure.\s*
匹配0个或0个以上空白字符\/?
匹配0个或1个/
, 其中\
为escape>
匹配 >
(?:<\/\1|)
, ?:
表示不capture, 我用这个括号就是想为了把他圈起来. 后面的\1
是一块的,表示把第一个捕获的内容插入到这来,在这个例子中也就是\w+
因此,它彻底能够写成 (?:>\/\w+|)
. |
表示或者,它后面什么都没有,那么这个表达式的意思就是要么匹配\/\w+
要么啥也不用匹配.$
匹配句尾,若是要匹配的文本超出了前面能够匹配的长度,那这个文本总体就不匹配该表达式因此这个表达式能够匹配<br>
, <br />
, <h3></h3>
. 最后一种状况只捕获<h3>
git
tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
(?!exp)
零宽度负预测先行断言(zero-width negative lookahead assertion), 匹配后面跟的不是exp的位置. 好比\d{3}(?!\d)
匹配三位数字,并且这三位数字后面不能是数字.<
, 可是 <
后面不能跟area, br 等等.(([\w:]+)[^>]*)
做为一个总体来看是一个caputring group. 而后里面有一个小的capturing group 2, 能够匹配\w
或者:
而且能够重复1到无限次. 后面能够跟着不是>
的任意次字符\/>
匹配/>
因此这个表达式能够匹配<abc:sfsf/> 之类的文本,可是不能匹配<img/>github
rootNodeRE = /^(?:body|html)$/i,
这个应该没什么好解释的的了,要么匹配body
,要么匹配html
,不区分大小写正则表达式
capitalRE = /([A-Z])/g,
匹配大写字母api
L49-L50框架
isArray = Array.isArray || function(object){ return object instanceof Array }
用于判断对象是不是array, MDN的推荐作法是spa
if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; }
这里面使用Object.prototype.toString()
来判断参数的类型prototype
用toString
来detect object class. 注意isArray
的polyfill.code