1'use strict'; 2 3var anObject = require('./_an-object'); 4var toLength = require('./_to-length'); 5var advanceStringIndex = require('./_advance-string-index'); 6var regExpExec = require('./_regexp-exec-abstract'); 7 8// @@match logic 9require('./_fix-re-wks')('match', 1, function (defined, MATCH, $match, maybeCallNative) { 10 return [ 11 // `String.prototype.match` method 12 // https://tc39.github.io/ecma262/#sec-string.prototype.match 13 function match(regexp) { 14 var O = defined(this); 15 var fn = regexp == undefined ? undefined : regexp[MATCH]; 16 return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O)); 17 }, 18 // `RegExp.prototype[@@match]` method 19 // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match 20 function (regexp) { 21 var res = maybeCallNative($match, regexp, this); 22 if (res.done) return res.value; 23 var rx = anObject(regexp); 24 var S = String(this); 25 if (!rx.global) return regExpExec(rx, S); 26 var fullUnicode = rx.unicode; 27 rx.lastIndex = 0; 28 var A = []; 29 var n = 0; 30 var result; 31 while ((result = regExpExec(rx, S)) !== null) { 32 var matchStr = String(result[0]); 33 A[n] = matchStr; 34 if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); 35 n++; 36 } 37 return n === 0 ? null : A; 38 } 39 ]; 40}); 41