Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript match()返回字符串而不是数组_Javascript_Arrays_Regex_String - Fatal编程技术网

Javascript match()返回字符串而不是数组

Javascript 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); 这将提供以下输出(

我一直在使用Javascript
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
方法时 采取了以下步骤:

  • 调用传递此值作为其参数
  • 让我们作为调用的结果,将this值作为其参数
  • 如果(regexp)是Object,并且regexp的[[Class]]内部属性的值是“
    regexp
    ”,那么让rx为 regexp
  • 否则,让rx成为一个新的RegExp对象,就像通过表达式
    newregexp(
    RegExp
    创建一样,其中
    RegExp
    是标准 具有该名称的内置构造函数
  • 让global作为调用rx的[[Get]]内部方法的结果,该方法带有参数“
    global
  • 让exec成为标准的内置函数
    RegExp.prototype.exec
    ()
  • 如果global不是真的,则
  • 返回调用exec的[[Call]]内部方法的结果,其中rx作为值和包含S的参数列表
  • 否则,global是真的
  • 使用参数“
    lastIndex
    ”和0调用rx的[[Put]]内部方法
  • 假设A是一个新数组,它是通过表达式
    new array()
    创建的,其中
    array
    是该数组的标准内置构造函数 名字
  • 设previousLastIndex为0
  • 设n为0
  • 让lastMatch为
  • 重复,而lastMatch为true
  • 让result作为调用exec的[[Call]]内部方法的结果,其中rx作为该值和参数列表 包含S
  • 如果结果为null,则将lastMatch设置为false
  • 否则,结果不是null
  • 将此索引设为调用rx的[[Get]]内部方法(参数为“
    lastIndex
    ”)的结果
  • 如果thisIndex=上一个LastIndex,则
  • 使用参数“
    lastIndex
    ”和thisIndex+1调用rx的[[Put]]内部方法
  • 将previousLastIndex设置为thisIndex+1
  • 否则,将previousLastIndex设置为thisIndex
  • 让matchStr作为调用带有参数“
    0
    ”的result的[[Get]]内部方法的结果
  • 使用参数(n)调用A的[[DefineOwnProperty]]内部方法 {[[Value]]:matchStr,[[Writable]]:true,[[Enumerable]]: true,[[可配置]]:true}和false
  • 增量
  • 如果n=0,则返回null
  • 返回A
  • 因此,对于您的全局正则表达式,唯一可能的返回值是null或A,它是一个数组

    对于非全局的,返回调用的结果。但它也返回数组或null

    执行字符串与正则表达式的正则表达式匹配 表达式,并返回包含 匹配,如果字符串不匹配,则为空


    开始使用查看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"]