Javascript match()返回字符串而不是数组
我一直在使用JavascriptJavascript match()返回字符串而不是数组,javascript,arrays,regex,string,Javascript,Arrays,Regex,String,我一直在使用Javascriptstring.match(*regex*)函数来解析navigator.userAgent字符串 供参考,根据MDN和W3学校: match()方法根据正则表达式搜索字符串中的匹配项,并将匹配项作为数组对象返回 我首先解析一次以获取基本字符串所需的字符串: var userAgent = navigator.userAgent; var splitted = userAgent.match(/[(][^)]+[)]|\w+\/\S+/ig); 这将提供以下输出(
string.match(*regex*)
函数来解析navigator.userAgent
字符串
供参考,根据MDN和W3学校:
match()方法根据正则表达式搜索字符串中的匹配项,并将匹配项作为数组对象返回
我首先解析一次以获取基本字符串所需的字符串:
var userAgent = navigator.userAgent;
var splitted = userAgent.match(/[(][^)]+[)]|\w+\/\S+/ig);
这将提供以下输出(这是一个数组)
然后在for循环中解析导航器/版本类型字符串
for (var i = 0; i < splitted.length; i++ ) {
var str = splitted[i];
if (str[0] == '(') {
} else {
var name = str.match(/[^\/]+/i);
var version = str.match(/[0-9|\.]+/i);
}
for(变量i=0;i
但是,非常令人惊讶的是,尽管我得到了期望的结果,我得到了一个字符串对象作为名称,一个数组对象作为版本
这怎么可能呢
下面是代码()的片段:
var userAgent=navigator.userAgent;
var splitted=userAgent.match(/[(][^)]+[)]\w+\/\S+/ig);
var outputDiv=document.getElementById(“日志”);
对于(变量i=0;i”;
outputDiv.innerHTML++=version.toString()+”是“+typeof(version)+”
”;
}
};
全局变量范围
这是因为您正在使用name
作为变量。这是一个全局浏览器窗口变量,本质上是一个字符串,不能存储为数组
Mozilla/5.0
(Macintosh; Intel Mac OS X 10_10_3)
AppleWebKit/537.36
(KHTML, like Gecko)
Chrome/41.0.2272.76
Safari/537.36
即使您使用var name=
重新声明它,您仍然在全局范围内。因此name
(又称window.name
)只保留您分配给它的最后一个值
您可以在空页面上使用以下内容进行测试,而无需定义任何变量:
console.log(name===window.name) // Returns true
console.log(name,window.name) // Returns 'Safari Safari' for my browser
将
名称
更改为其他名称
如果将name
变量更改为具有不同的名称,如my_name
,它将.match()
的结果存储为数组
var my_name = str.match(/[^\/]+/i);
var version = str.match(/[0-9|\.]+/i);
console.log(typeof my_name, my_name instanceof Array) // Returns object, true
通过在函数中换行来更改范围 这是封装在函数中的精确代码,返回正确的变量类型:
function getBrowserStuff(){
var userAgent = navigator.userAgent;
var splitted = userAgent.match(/[(][^)]+[)]|\w+\/\S+/ig);
for (var i = 0; i < splitted.length; i++ ) {
var str = splitted[i];
if (str[0] == '(') {
} else {
var name = str.match(/[^\/]+/i);
var version = str.match(/[0-9|\.]+/i);
console.log('Name','Typeof '+(typeof name), 'IsArray '+(name instanceof Array),name)
console.log('Version','Typeof '+(typeof version),'IsArray '+(version instanceof Array),version)
}
}
return 'whatever'
}
getBrowserStuff()
在返回本文件之前:
Name Typeof string IsArray false Mozilla
Version Typeof object IsArray true ["5.0"]
Name Typeof string IsArray false AppleWebKit
Version Typeof object IsArray true ["600.3.18"]
Name Typeof string IsArray false Version
Version Typeof object IsArray true ["8.0.3"]
Name Typeof string IsArray false Safari
Version Typeof object IsArray true ["600.3.18"]
这是不可能的,或者是您的实现的一个bug 根据ECMAScript 5.1规范,
match
的行为如下:
使用参数regexp调用match
方法时
采取了以下步骤:
regexp
”,那么让rx为
regexpnewregexp(
RegExp)
创建一样,其中RegExp
是标准
具有该名称的内置构造函数global
”RegExp.prototype.exec
()lastIndex
”和0调用rx的[[Put]]内部方法new array()
创建的,其中array
是该数组的标准内置构造函数
名字lastIndex
”)的结果lastIndex
”和thisIndex+1调用rx的[[Put]]内部方法0
”的result的[[Get]]内部方法的结果开始使用查看JavaScript文档。匹配项也无法返回字符串。离题文化建议:在英语中,使用“亲爱的”一词来表示非常正式的信函,并引用我们的h
Name Typeof string IsArray false Mozilla
Version Typeof object IsArray true ["5.0"]
Name Typeof string IsArray false AppleWebKit
Version Typeof object IsArray true ["600.3.18"]
Name Typeof string IsArray false Version
Version Typeof object IsArray true ["8.0.3"]
Name Typeof string IsArray false Safari
Version Typeof object IsArray true ["600.3.18"]