Javascript错误的可能情况:“预期的标识符,字符串或数字”


84

一些用户在我的网站上偶尔报告JS错误。错误消息显示“期望的标识符,字符串或数字”,并且行号为423725915,这只是一个任意数字,发生这种情况时,每个报告都会更改。这主要发生在IE7 / Mozilla 4.0浏览器中。

我扫描了很多次代码,然后运行jslint,但没有收到任何结果-有人知道导致此错误消息的JS问题的一般类型吗?


首先想到的是显而易见的。
Anthony Forloney,2010年

可能是数组文字的末尾有一个悬挂的逗号吗?(还有什么是“ Mozilla 4.0”?)
尖尖的

与userAgent字符串兼容的Mozilla 4.0
psychotik 2010年

Answers:


147

此类错误的原因通常是对象或数组定义中逗号放置错误:

var obj = {
   id: 23,
   name: "test",  <--
}

如果它出现在随机线上,则可能是您正在动态创建的对象定义的一部分。


这是失踪的; 在事件分配中。查看动态创建的对象的线索有助于实现这一目标。jslint最初并没有发现它是作为内联js作为html页面的一部分生成的。谢谢!
psychotik 2010年

2
不,不会。大多数现代的浏览器都会为您解决此问题。IE6 / 7没有。在IE7仿真模式下调试IE8不能解决这一问题。(我猜您知道IE7没有调试器-将VS与IE7一起使用也无法捕获)。尝试一下,然后告诉我;)
psychotik 2010年

1
谢谢!显然,在其他浏览器(例如Chrome)中,这不是问题。
B

5
您可以使用正则表达式“,\ s *]”和“,\ s * \}”(不带引号)搜索此类事件。节省了我很多时间。
GOKHAN库尔特

2
带有换行符的javascript正则表达式如下:,\s*?\n?\s*?],\s*?\n?\s*?\}
hayatbiralem,2016年

84

由于在Internet Explorer中是保留关键字,因此在Javascript词典中使用单词class作为键也可能触发可怕的“期望的标识符,字符串或数字”错误。

{ class : 'overlay'} // ERROR: Expected identifier, string or number

{'class': 'overlay'}

在Javascript字典中使用保留关键字作为键时,请将键括在引号中。

希望此提示可以为您节省一天的调试时间。


很好,我在这个问题上苦苦挣扎了好几个小时。现在解决。
约翰·普拉多

谢谢您好先生,让我免于长时间呆在这个JavaScript库中。
Khepri

1
我向JSHint提交了一个错误,希望他们将来能够检测到此类错误:github.com/jshint/jshint/issues/1000
travis

1
@travis由于#674而实际上允许使用它:-)
cmbuckley

3
我有完全相同的错误,但在属性“导入”上。这里是“保留字”的完整列表developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
埃德加Zagórski

11

实际上,最近我在IE上得到了类似的信息,它与JavaScript语法“错误”有关。我说引号错误是因为除IE之外其他任何地方都可以。这是在IE6下。问题与JSON对象创建和一个逗号有关,例如

{ one:1, two:2, three:3, }

IE6真的不喜欢3以后的逗号。您可能会寻找类似的东西,有点语法上的小问题。

是的,我认为我的25行JavaScript中的数百万行号也很有趣。

祝好运。


+1这对我很有帮助。多余的问号对我来说并没有破坏ie8,但确实破坏了ie7。
伊万·杜斯特

9

这是一个绝对的答案:消除一个诱人但错误的答案,以帮助其他人找到正确的答案。

似乎调试可能会突出该问题。但是,出现此问题的唯一浏览器是IE,而在IE中,您只能调试原始文档中的代码。对于动态添加的代码,调试器仅将body元素显示为当前指令,IE声称该错误发生在一个巨大的行号上。

这是一个示例网页,它将在IE中演示此问题:

<html>
<head>
<title>javascript debug test</title>
</head>
<body onload="attachScript();">
<script type="text/javascript">
function attachScript() {
   var s = document.createElement("script");
   s.setAttribute("type", "text/javascript");
   document.body.appendChild(s);
   s.text = "var a = document.getElementById('nonexistent'); alert(a.tagName);"
}
</script>
</body>

这为我产生了以下错误:

Line: 54654408
Error: Object required

@Protectorone通过<script>本地或作为已加载资源的标记将javascript临时放在文档本身中。调试 切换回您的工作脚本。
ErikE 2012年

5

刚看到我的一个应用程序中的错误,作为一个包罗万象,请记住将与关键字相同的所有javascript属性的名称括起来。

遇到以下对象的错误后发现此错误:

var x = { class: 'myClass', function: 'myFunction'};

生成错误(类和函数是关键字),此错误已通过添加引号来解决

var x = { 'class': 'myClass', 'function': 'myFunction'};

我希望可以节省您一些时间


我遇到了同样的问题。我的代码使用的是类似的东西if(_features.delete){...},这引起了错误,因为delete是关键字。 stackoverflow.com/questions/26255/...
Snekse


2

如前所述,用逗号隔开会引发错误。

同样在IE 7.0中,行尾没有分号会导致错误。它在Safari和Chrome中正常运行(控制台中没有错误)。


2

与较新的浏览器(尤其是Chrome)相比,IE7的宽容度要低得多。我喜欢使用JSLint查找这些错误。它将发现这些逗号放置不当。您可能需要激活该选项以忽略不正确的空格。

除了逗号放置不当之外,在此博客中,有人还评论说:

我一直在寻找一个错误,该错误仅在IE(7)中仅显示“ Expected identifier”。我的研究将我带到了此页面。经过一番挫折后,结果发现我使用保留字作为函数名称(“开关”)的问题。错误尚不清楚,它指向错误的行号。



1

当我们在数组末尾或函数代码中添加或错过删除逗号时,会发生此错误。有必要观察网页的整个代码以防此类错误。

我在为Facebook API编码时是通过Facebook应用程序代码获得的。

<div id='fb-root'>
    <script type='text/javascript' src='http://connect.facebook.net/en_US/all.js'</script>
    <script type='text/javascript'>
          window.fbAsyncInit = function() {
             FB.init({appId:'".$appid."', status: true, cookie: true, xfbml: true});            
             FB.Canvas.setSize({ width: 800 , height: 860 , }); 
                                                       // ^ extra comma here
          };
    </script>

0

对我来说,这听起来像是一个脚本,该脚本已通过src插入,并且仅在一半时间内加载,导致语法错误,其余未加载。



0

此错误的另一个变体:我有一个名为“ continue”的函数,由于它是保留字,因此引发了此错误。我不得不将函数重命名为“ continueClick”



0

使用Knockout JS时,您可能会遇到此问题。如果尝试像下面的示例一样设置class属性,它将失败:

<span data-bind="attr: { class: something() }"></span>

像这样转义类字符串:

<span data-bind="attr: { 'class': something() }"></span>

我的2美分。


0

我也遇到过这个问题。我发现以下两种解决方案。1)。与上面其他人提到的相同,请从JSON对象中删除多余的逗号。2)。另外,我的JSP / HTML具有。因此,它触发了浏览器的旧模式,从而给JS错误带来了额外的逗号。使用时,它会触发浏览器的HTML5模式(如果支持),即使与Extra Comma一样,也可以像其他浏览器FF,Chrome等一样正常工作。


1
欢迎使用Stack Overflow!您能否举一个例子说明这是什么意思:“我的JSP / HTML拥有了。”
billrichards 2015年

0

这是调试问题的一种简便方法:将脚本/代码回显到控制台。将代码从控制台复制到IDE中。大多数IDE对代码执行错误检查并突出显示错误。您应该几乎可以在JavaScript / HTML编辑器中看到该错误。


0

使用不同的配置时遇到相同的问题。这是一个有角度的工厂定义,但我认为它也可能在其他地方发生:

angular.module("myModule").factory("myFactory", function(){
    return
    {
        myMethod : function() // <--- error showing up here
        {
            // method definition
        } 
    }
});

修复非常奇怪:

angular.module("myModule").factory("myFactory", function(){
    return { // <--- notice the absence of the return line
        myMethod : function()
        {
            // method definition
        } 
    }
});

0

如果您在类中的任何地方调用函数,也会在Typescript中发生这种情况。例如

class Dojo implements Sensei {
     console.log('Hi'); // ERROR Identifier expected.
     constructor(){}
}

函数调用就像console.log()必须在函数内部一样。不在应该声明类字段的区域。


0

Windows问题的打字稿

这适用于IE,Chrome,FF

export const OTP_CLOSE = { 'outcomeCode': 'OTP_CLOSE' };

这适用于chrome,FF,但不适用于IE 11

export const OTP_CLOSE = { outcomeCode: 'OTP_CLOSE' };

我想这与Windows保留字有关在此处输入图片说明


0

我遇到了此错误,而不是在逗号后面加上逗号,而是在constants.js中使用了此语法

    var titles = {
      [title.X]: 'X title',
      [title.Y]: 'Y title'
    }

IE 11根本不喜欢这样。

如前所述,尽管使用可以轻松解决

   var titles = {
     'title.X': 'X title',
     'title.Y': 'Y title'   
   }

2
这些不是等效的表达式。第一个使用title.X和title.Y属性的值作为title对象中的键,第二个使用字符串“ title.X”和“ title.Y”作为键。
nabrown
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.