Các trường hợp có thể xảy ra đối với lỗi Javascript: “Số nhận dạng, chuỗi hoặc số được mong đợi”


84

Một số người dùng thỉnh thoảng báo cáo lỗi JS trên trang web của tôi. Thông báo lỗi cho biết "Số nhận dạng, chuỗi hoặc số được mong đợi" và số dòng là 423725915, chỉ là một số tùy ý và thay đổi cho mỗi báo cáo khi điều này xảy ra. Điều này chủ yếu xảy ra với trình duyệt IE7 / Mozilla 4.0.

Tôi đã quét mã của mình rất nhiều lần và chạy jslint nhưng nó không nhận được bất cứ điều gì - có ai biết về loại vấn đề JS chung dẫn đến thông báo lỗi này không?


Điều đầu tiên xuất hiện trong tâm trí là điều hiển nhiên.
Anthony Forloney

Nó có thể là một mảng ký tự có một dấu phẩy treo ở cuối? (Ngoài ra, "Mozilla 4.0" là gì?)
Pointy

Mozilla 4.0 tương thích trong chuỗi UserAgent
psychotik

Câu trả lời:


147

Nguyên nhân của loại lỗi này thường có thể là dấu phẩy đặt sai vị trí trong định nghĩa đối tượng hoặc mảng:

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

Nếu nó xuất hiện ở một dòng ngẫu nhiên, có thể đó là một phần của định hướng đối tượng mà bạn đang tạo động.


nó là một thiếu sót; trong một nhiệm vụ sự kiện. Manh mối để xem xét các đối tượng được tạo động đã giúp nhận ra điều này. jslint không tìm thấy điều này ban đầu vì nó được tạo dưới dạng js nội tuyến như một phần của trang html. Cám ơn!
Psychotik

2
Không, nó sẽ không. Hầu hết các trình duyệt hiện đại đều sửa lỗi này cho bạn. IE6 / 7 thì không. Và gỡ lỗi IE8 trong chế độ giả lập IE7 không bắt được điều này. (Tôi đoán bạn biết rằng IE7 không có trình gỡ lỗi - sử dụng VS với IE7 cũng không bắt được điều này). Hãy thử nó và sau đó cho tôi biết;)
psychotik

1
Cảm ơn bạn! Rõ ràng đây không phải là vấn đề trong các trình duyệt khác, như Chrome.
B Bảy

5
Bạn có thể tìm kiếm những lần xuất hiện như vậy bằng cách sử dụng regex ", \ s *]" và ", \ s * \}" (không có dấu ngoặc kép). Tiết kiệm cho tôi rất nhiều thời gian.
Gökhan Kurt

2
Regex cho javascript với các ngắt dòng như thế này: ,\s*?\n?\s*?],\s*?\n?\s*?\}
hayatbiralem

84

Việc sử dụng lớp từ làm khóa trong từ điển Javascript cũng có thể gây ra lỗi "Số nhận dạng, chuỗi hoặc số" đáng sợ vì lớp là một từ khóa dành riêng trong Internet Explorer.

XẤU

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

TỐT

{'class': 'overlay'}

Khi sử dụng từ khóa dành riêng làm khóa trong từ điển Javascript, hãy đặt khóa trong dấu ngoặc kép.

Hy vọng gợi ý này sẽ giúp bạn có một ngày gỡ rối địa ngục.


Tuyệt vời, tôi đang vật lộn với vấn đề này trong nhiều giờ. Đã giải quyết ngay bây giờ.
John Prado

Cảm ơn bạn tốt vì đã cứu tôi khỏi việc nhìn chằm chằm vào thư viện javascript này lâu hơn mức cần thiết.
Khepri

1
Tôi đã gửi một lỗi để JSHint, hy vọng họ sẽ có khả năng phát hiện các loại lỗi trong tương lai: github.com/jshint/jshint/issues/1000
Travis

1
@travis Họ thực sự cho phép nó do # 674 :-)
cmbuckley

3
Tôi đã gặp chính xác lỗi tương tự, nhưng trên thuộc tính "nhập". Đây là danh sách đầy đủ "Các từ dành riêng" developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Edgar Zagórski

11

Trên thực tế, tôi đã nhận được một cái gì đó như vậy trên IE gần đây và nó có liên quan đến "lỗi" cú pháp JavaScript. Tôi nói lỗi trong dấu ngoặc kép vì nó ổn ở mọi nơi nhưng trên IE. Đây là dưới IE6. Sự cố liên quan đến việc tạo đối tượng JSON và thêm một dấu phẩy, chẳng hạn như

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

IE6 thực sự không thích dấu phẩy đó sau 3. Bạn có thể tìm kiếm một cái gì đó tương tự như vậy, các vấn đề về hình thức cú pháp rất nhỏ.

Vâng, tôi nghĩ con số hàng triệu dòng trong JavaScript 25 dòng của tôi cũng thú vị.

Chúc may mắn.


+1 Điều này đã giúp tôi rất nhiều. Dấu chấm hỏi phụ không phá vỡ ie8 đối với tôi, nhưng đã phá vỡ ie7.
Ivan Durst

9

Đây là một câu trả lời không xác định: loại bỏ một câu trả lời hấp dẫn nhưng sai để giúp người khác điều hướng đến câu trả lời đúng.

Có vẻ như gỡ lỗi sẽ làm nổi bật vấn đề. Tuy nhiên, trình duyệt duy nhất mà sự cố xảy ra là IE và trong IE bạn chỉ có thể gỡ lỗi mã là một phần của tài liệu gốc. Đối với mã được thêm động, trình gỡ lỗi chỉ hiển thị phần tử body dưới dạng lệnh hiện tại và IE tuyên bố lỗi đã xảy ra trên một số dòng lớn.

Đây là một trang web mẫu sẽ giải thích vấn đề này trong 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>

Điều này dẫn đến cho tôi lỗi sau:

Line: 54654408
Error: Object required

@Protectorone Tạm thời đưa javascript vào chính tài liệu thông qua <script>thẻ, cục bộ hoặc dưới dạng tài nguyên được tải. Gỡ lỗi. Chuyển trở lại tập lệnh làm việc của bạn.
ErikE

5

Chỉ cần nhìn thấy lỗi trong một trong các ứng dụng của tôi, như một thông tin tóm tắt, hãy nhớ bao gồm tên của tất cả các thuộc tính javascript giống với từ khóa.

Tìm thấy lỗi này sau khi xem một lỗi trong đó một đối tượng như:

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

đã tạo ra lỗi (lớp và hàm là từ khóa) điều này đã được khắc phục bằng cách thêm dấu ngoặc kép

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

Tôi hy vọng sẽ giúp bạn tiết kiệm thời gian


Tôi gặp phải vấn đề tương tự. Mã của tôi đang sử dụng một cái gì đó tương tự như if(_features.delete){...}vậy đã gây ra lỗi vì xóa là một từ khóa. stackoverflow.com/questions/26255/…
Snekse


2

Như đã lưu ý trước đây, việc có thêm một dấu phẩy sẽ gây ra lỗi.

Cũng trong IE 7.0, việc không có dấu chấm phẩy ở cuối dòng đã gây ra lỗi. Nó hoạt động tốt trong Safari và Chrome (không có lỗi trong bảng điều khiển).


2

IE7 ít tha thứ hơn nhiều so với các trình duyệt mới hơn, đặc biệt là Chrome. Tôi thích sử dụng JSLint để tìm những lỗi này. Nó sẽ tìm thấy những dấu phẩy được đặt không đúng cách này, trong số những thứ khác. Bạn có thể sẽ muốn kích hoạt tùy chọn để bỏ qua khoảng trắng không thích hợp.

Ngoài dấu phẩy được đặt không đúng, tại blog này trong các nhận xét có người đã báo cáo:

Tôi đã tìm kiếm một lỗi chỉ cho biết "Số nhận dạng mong đợi" chỉ trong IE (7). Nghiên cứu của tôi đã dẫn tôi đến trang này. Sau một số thất vọng, hóa ra vấn đề là tôi đã sử dụng một từ dành riêng làm tên hàm ("switch"). Lỗi đó không rõ ràng và nó chỉ đến số dòng sai.



1

Lỗi này xảy ra khi chúng ta thêm hoặc bỏ sót dấu phẩy ở cuối mảng hoặc trong mã hàm. Cần phải quan sát toàn bộ mã của một trang web để tìm lỗi như vậy.

Tôi đã nhận được nó trong một mã ứng dụng Facebook khi tôi đang viết mã cho 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

Điều này đối với tôi nghe giống như một tập lệnh được kéo vào bằng src và được tải chỉ nửa chừng, gây ra lỗi cú pháp sin phần còn lại không được tải.


0

IE7 gặp sự cố với mảng đối tượng

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

0

Một biến thể khác của lỗi này: Tôi có một hàm có tên là 'tiếp tục' và vì đó là một từ dành riêng nên nó đã gây ra lỗi này. Tôi đã phải đổi tên hàm của mình là 'continueClick'


0

Có thể bạn có một đối tượng có một phương thức 'constructor' và cố gắng gọi phương thức đó.


0

Bạn có thể gặp sự cố này khi sử dụng Knockout JS. Nếu bạn thử đặt thuộc tính lớp như ví dụ bên dưới, nó sẽ không thành công:

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

Thoát chuỗi lớp như thế này:

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

2 xu của tôi.


0

Tôi cũng đã gặp vấn đề này. Tôi tìm thấy hai giải pháp dưới đây. 1). Tương tự như những người khác đã đề cập ở trên, hãy xóa dấu phẩy thừa khỏi đối tượng JSON. 2). Ngoài ra, JSP / HTML của tôi đã gặp phải. Vì điều này, nó đã kích hoạt chế độ cũ của trình duyệt, gây ra lỗi JS cho thêm dấu phẩy. Khi được sử dụng, nó sẽ kích hoạt chế độ HTML5 của trình duyệt (Nếu được hỗ trợ) và nó hoạt động tốt ngay cả với Dấu phẩy phụ giống như bất kỳ trình duyệt nào khác FF, Chrome, v.v.


1
Chào mừng bạn đến với Stack Overflow! Bạn có thể cho một ví dụ về điều này có nghĩa là gì: "JSP / HTML của tôi đã gặp phải."
billrichards

0

Đây là một kỹ thuật dễ dàng để gỡ lỗi sự cố: lặp lại tập lệnh / mã vào bảng điều khiển. Sao chép mã từ bảng điều khiển vào IDE của bạn. Hầu hết IDE thực hiện kiểm tra lỗi trên mã và đánh dấu các lỗi. Bạn sẽ có thể thấy lỗi gần như ngay lập tức trong trình soạn thảo JavaScript / HTML của mình.


0

Gặp sự cố tương tự với một cấu hình khác. Đây là một định nghĩa nhà máy góc cạnh, nhưng tôi cho rằng nó cũng có thể xảy ra ở những nơi khác:

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

Sửa chữa rất kỳ lạ:

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

0

Điều này cũng có thể xảy ra trong Typecript nếu bạn gọi một hàm ở giữa hư không bên trong một lớp. Ví dụ

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

Các cuộc gọi hàm, chẳng hạn như các console.log()hàm bên trong. Không nằm trong khu vực mà bạn nên khai báo các trường lớp.


0

Chỉ định chữ cho vấn đề Windows

Điều này hoạt động trong IE, chrome, FF

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

Điều này hoạt động trong chrome, FF, Không hoạt động trong IE 11

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

Tôi đoán nó bằng cách nào đó liên quan đến các từ dành riêng cho Windowsnhập mô tả hình ảnh ở đây


0

Tôi đã gặp lỗi này trong đó thay vì dấu phẩy ở cuối hoặc một số như vậy, cú pháp này đã được sử dụng trong hằng số.js

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

IE 11 không thích điều này chút nào.

Như đã đề cập trước đó, mặc dù điều này đã được khắc phục dễ dàng bằng cách sử dụng

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

2
Đây không phải là những biểu thức tương đương. Cách thứ nhất sử dụng các giá trị của thuộc tính title.X và title.Y làm khóa trong đối tượng title, thứ hai sử dụng chuỗi "title.X" và "title.Y" làm khóa.
nabrown
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.