กรณีที่เป็นไปได้สำหรับข้อผิดพลาดของ Javascript:“ ตัวระบุสตริงหรือตัวเลขที่คาดไว้”


87

ผู้ใช้บางรายรายงานข้อผิดพลาด JS ในไซต์ของฉันเป็นครั้งคราว ข้อความแสดงข้อผิดพลาดระบุว่า "ตัวระบุสตริงหรือหมายเลขที่คาดไว้" และหมายเลขบรรทัดคือ 423725915 ซึ่งเป็นเพียงตัวเลขที่กำหนดเองและการเปลี่ยนแปลงสำหรับแต่ละรายงานเมื่อเกิดเหตุการณ์นี้ ส่วนใหญ่เกิดขึ้นกับเบราว์เซอร์ IE7 / Mozilla 4.0

ฉันสแกนโค้ดหลายครั้งและรัน jslint แต่มันไม่ได้รับอะไรเลย - มีใครรู้ปัญหา JS ทั่วไปที่นำไปสู่ข้อความแสดงข้อผิดพลาดนี้บ้าง?


สิ่งแรกที่อยู่ในใจคือสิ่งที่ชัดเจน
Anthony Forloney

อาจเป็นอาร์เรย์ลิเทอรัลที่มีลูกน้ำห้อยอยู่ที่ท้ายหรือไม่? (นอกจากนี้ "Mozilla 4.0" คืออะไร)
Pointy

Mozilla 4.0 เข้ากันได้ในสตริง userAgent
Psychotik

คำตอบ:


150

สาเหตุของข้อผิดพลาดประเภทนี้มักจะเป็นลูกน้ำที่ใส่ผิดตำแหน่งในนิยามของวัตถุหรืออาร์เรย์:

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

หากปรากฏเป็นเส้นสุ่มอาจเป็นส่วนหนึ่งของการกำหนดวัตถุที่คุณกำลังสร้างแบบไดนามิก


มันหายไป; ในการมอบหมายงาน เบาะแสในการดูวัตถุที่สร้างแบบไดนามิกช่วยให้หยิบสิ่งนี้ขึ้นมา jslint ไม่พบสิ่งนี้ในตอนแรกเพราะมันถูกสร้างขึ้นเป็น inline js ซึ่งเป็นส่วนหนึ่งของเพจ html ขอบคุณ!
psychotik

2
ไม่มันจะไม่ เบราว์เซอร์สมัยใหม่ส่วนใหญ่แก้ไขปัญหานี้ให้คุณ IE6 / 7 ไม่ได้ และการดีบัก IE8 ในโหมดจำลอง IE7 ไม่สามารถทำได้ (ฉันเดาว่าคุณรู้ว่า IE7 ไม่มีดีบักเกอร์ - การใช้ VS กับ IE7 ไม่สามารถตรวจจับสิ่งนี้ได้เช่นกัน) ลองแล้วบอกเลย;)
psychotik

1
ขอขอบคุณ! เห็นได้ชัดว่านี่ไม่ใช่ปัญหาในเบราว์เซอร์อื่นเช่น Chrome
B Seven

5
คุณสามารถค้นหาเหตุการณ์ดังกล่าวโดยใช้ regex ", \ s *]" และ ", \ s * \}" (โดยไม่มีเครื่องหมายคำพูด) ช่วยฉันประหยัดเวลาได้มาก
Gökhan Kurt

2
Regex สำหรับ javascript ที่มีตัวแบ่งบรรทัดดังนี้,\s*?\n?\s*?]และ,\s*?\n?\s*?\}
hayatbiralem

84

การใช้คลาสคำเป็นคีย์ในพจนานุกรม Javascript ยังสามารถทริกเกอร์ข้อผิดพลาด "ตัวระบุสตริงหรือตัวเลขที่คาดหวัง" เนื่องจากคลาสเป็นคีย์เวิร์ดที่สงวนไว้ใน Internet Explorer

ไม่ดี

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

ดี

{'class': 'overlay'}

เมื่อใช้คีย์เวิร์ดที่สงวนไว้เป็นคีย์ในพจนานุกรม Javascript ให้ใส่คีย์ในเครื่องหมายคำพูด

หวังว่าคำใบ้นี้จะช่วยคุณประหยัดวันแห่งการแก้จุดบกพร่องนรก


ดีฉันกำลังต่อสู้กับปัญหานี้เป็นเวลาหลายชั่วโมง แก้ไขแล้ว
John Prado

ขอบคุณที่ช่วยฉันไม่ให้จ้องที่ห้องสมุดจาวาสคริปต์นี้นานเกินความจำเป็น
Khepri

1
ฉันส่งข้อบกพร่องไปยัง JSHint หวังว่าพวกเขาจะสามารถตรวจพบข้อผิดพลาดประเภทนี้ได้ในอนาคต: github.com/jshint/jshint/issues/1000
travis

1
@travis พวกเขาอนุญาตให้เป็นผลมาจาก# 674 :-)
cmbuckley

3
ฉันมีข้อผิดพลาดเดียวกันทุกประการ แต่ในคุณสมบัติ "นำเข้า" นี่คือรายการเต็มรูปแบบของ "คำสงวน" developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
เอ็ดการ์ Zagorski

11

อันที่จริงฉันมีบางอย่างเช่นนั้นใน IE เมื่อเร็ว ๆ นี้และเกี่ยวข้องกับ "ข้อผิดพลาด" ของไวยากรณ์ JavaScript ฉันพูดว่ามีข้อผิดพลาดในเครื่องหมายคำพูดเพราะใช้ได้ทุกที่ยกเว้นใน IE อยู่ภายใต้ IE6 ปัญหาเกี่ยวข้องกับการสร้างอ็อบเจ็กต์ JSON และเครื่องหมายจุลภาคพิเศษเช่น

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

IE6 ไม่ชอบเครื่องหมายจุลภาคนั้นจริงๆหลังจาก 3 คุณอาจมองหาบางอย่างเช่นนั้นปัญหาเกี่ยวกับรูปแบบไวยากรณ์เล็กน้อยที่น่าสัมผัส

ใช่ฉันคิดว่าหมายเลขบรรทัดหลายล้านบรรทัดใน JavaScript 25 บรรทัดของฉันก็น่าสนใจเช่นกัน

โชคดี.


+1 สิ่งนี้ช่วยฉันได้มาก เครื่องหมายคำถามพิเศษไม่ได้ทำลาย ie8 สำหรับฉัน แต่ทำลาย ie7
Ivan Durst

9

นี่เป็นคำตอบที่ไม่ชัดเจน: การกำจัดคำตอบที่น่าดึงดูด แต่ผิดเพื่อช่วยให้ผู้อื่นไปยังคำตอบที่ถูกต้อง

อาจดูเหมือนว่าการดีบักจะเน้นปัญหา อย่างไรก็ตามเบราว์เซอร์เดียวที่เกิดปัญหาคือ IE และใน IE คุณสามารถแก้ปัญหาได้เฉพาะโค้ดที่เป็นส่วนหนึ่งของเอกสารต้นฉบับเท่านั้น สำหรับโค้ดที่เพิ่มแบบไดนามิกดีบักเกอร์จะแสดงองค์ประกอบของร่างกายเป็นคำสั่งปัจจุบันและ 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 ใส่ javascript ลงในเอกสารชั่วคราวผ่าน<script>แท็กไม่ว่าจะเป็นโลคัลหรือรีซอร์สที่โหลด แก้ไขข้อบกพร่อง เปลี่ยนกลับไปที่สคริปต์การทำงานของคุณ
ErikE

5

เพิ่งเห็นข้อบกพร่องในหนึ่งในแอปพลิเคชันของฉันในฐานะที่จับได้ทั้งหมดอย่าลืมใส่ชื่อของคุณสมบัติจาวาสคริปต์ทั้งหมดที่เหมือนกับคีย์เวิร์ด

พบข้อผิดพลาดนี้หลังจากเข้าร่วมจุดบกพร่องที่วัตถุเช่น:

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

สร้างข้อผิดพลาด (คลาสและฟังก์ชันคือคีย์เวิร์ด) ซึ่งได้รับการแก้ไขโดยการเพิ่มเครื่องหมายคำพูด

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

ฉันหวังว่าจะช่วยคุณประหยัดเวลาได้บ้าง


ฉันพบปัญหาเดียวกัน รหัสของฉันใช้บางอย่างif(_features.delete){...}ที่ทำให้เกิดข้อผิดพลาดเนื่องจากการลบเป็นคำหลัก stackoverflow.com/questions/26255/…
Snekse


2

ตามที่ระบุไว้ก่อนหน้านี้การมีเครื่องหมายจุลภาคเพิ่มเติมทำให้เกิดข้อผิดพลาด

นอกจากนี้ใน IE 7.0 การไม่มีอัฒภาคที่ท้ายบรรทัดทำให้เกิดข้อผิดพลาด ทำงานได้ดีใน Safari และ Chrome (โดยไม่มีข้อผิดพลาดในคอนโซล)


2

IE7 นั้นให้อภัยน้อยกว่าเบราว์เซอร์รุ่นใหม่ ๆ มากโดยเฉพาะ Chrome ฉันชอบใช้JSLintเพื่อค้นหาจุดบกพร่องเหล่านี้ จะพบเครื่องหมายจุลภาคที่วางไว้ไม่เหมาะสมเหล่านี้เหนือสิ่งอื่นใด คุณอาจต้องการเปิดใช้งานตัวเลือกเพื่อละเว้นช่องว่างที่ไม่เหมาะสม

นอกเหนือจากการวางลูกน้ำที่ไม่ถูกต้องในบล็อกนี้ในความคิดเห็นที่มีคนรายงาน:

ฉันได้ค้นหาข้อผิดพลาดที่ระบุว่า "ตัวระบุที่คาดไว้" เฉพาะใน IE (7) เท่านั้น การค้นคว้าของฉันทำให้ฉันมาที่หน้านี้ หลังจากไม่สบายใจปรากฎว่าปัญหาที่ฉันใช้คำสงวนเป็นชื่อฟังก์ชัน ("สวิตช์") ข้อผิดพลาดไม่ชัดเจนและชี้ไปที่หมายเลขบรรทัดที่ไม่ถูกต้อง


1

ลบสิ่งที่ไม่ต้องการลงชื่อเข้าใช้ฟังก์ชัน คุณจะได้รับการแก้ปัญหา

อ้างถึงสิ่งนี้

http://blog.favrik.com/2007/11/29/ie7-error- expected-identifier-string-or-number/


วิธีแก้ปัญหาของคุณถูกต้องฉันโหวตให้คุณกำจัด -1 downvote ไม่แน่ใจว่าทำไมบางคนถึงโหวตคำตอบที่ถูกต้อง
akousmata

1

ข้อผิดพลาดนี้เกิดขึ้นเมื่อเราเพิ่มหรือพลาดที่จะลบลูกน้ำที่ท้ายอาร์เรย์หรือในโค้ดฟังก์ชัน จำเป็นต้องสังเกตรหัสทั้งหมดของหน้าเว็บสำหรับข้อผิดพลาดดังกล่าว

ฉันได้รับมันในรหัสแอพ Facebook ในขณะที่ฉันกำลังเขียนโค้ดสำหรับ Facebook API

<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

IE7 มีปัญหากับอาร์เรย์ของวัตถุ

columns: [
{
  field: "id",
  header: "ID"
},
{
  field: "name",
  header: "Name" , /* this comma was the problem*/ 
},
...

0

อีกรูปแบบหนึ่งของข้อผิดพลาดนี้: ฉันมีฟังก์ชันชื่อ 'ดำเนินการต่อ' และเนื่องจากเป็นคำสงวนจึงทำให้เกิดข้อผิดพลาดนี้ ฉันต้องเปลี่ยนชื่อฟังก์ชั่นของฉัน 'ContinueClick'



0

คุณอาจประสบปัญหานี้ขณะใช้ Knockout JS หากคุณลองตั้งค่าแอตทริบิวต์คลาสดังตัวอย่างด้านล่างนี้จะล้มเหลว:

<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

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

ปัญหา typescript สำหรับ Windows

ใช้งานได้ใน IE, chrome, FF

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

ใช้งานได้ใน chrome, FF ไม่ทำงานใน IE 11

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

ฉันเดาว่ามันเกี่ยวข้องกับคำสงวนของ Windowsใส่คำอธิบายภาพที่นี่


0

ฉันพบข้อผิดพลาดนี้โดยที่แทนที่จะใช้เครื่องหมายจุลภาคต่อท้ายหรือบางส่วนไวยากรณ์นี้ถูกใช้ในค่าคงที่ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.