Cách giải quyết TypeError: Không thể chuyển đổi không xác định hoặc null thành đối tượng


90

Tôi đã viết một số hàm sao chép hiệu quả JSON.stringify (), chuyển đổi một loạt các giá trị thành các phiên bản được xâu chuỗi. Khi tôi chuyển mã của mình sang JSBin và chạy nó trên một số giá trị mẫu, nó hoạt động tốt. Nhưng tôi gặp lỗi này trong một trình chạy thông số kỹ thuật được thiết kế để kiểm tra điều này.

Mã của tôi:

  // five lines of comments
  var stringify = function(obj) {
  if (typeof obj === 'function') { return undefined;}  // return undefined for function
  if (typeof obj === 'undefined') { return undefined;} // return undefined for undefined
  if (typeof obj === 'number') { return obj;} // number unchanged
  if (obj === 'null') { return null;} // null unchanged
  if (typeof obj === 'boolean') { return obj;} // boolean unchanged
  if (typeof obj === 'string') { return '\"' + obj + '\"';} // string gets escaped end-quotes
  if (Array.isArray(obj)) { 
    return obj.map(function (e) {  // uses map() to create new array with stringified elements
        return stringify(e);
    });
  } else {
    var keys = Object.keys(obj);   // convert object's keys into an array
    var container = keys.map(function (k) {  // uses map() to create an array of key:(stringified)value pairs
        return k + ': ' + stringify(obj[k]);
    });
    return '{' + container.join(', ') + '}'; // returns assembled object with curly brackets
  }
};

var stringifyJSON = function(obj) {
    if (typeof stringify(obj) != 'undefined') {
        return "" + stringify(obj) + "";
    }
};

Thông báo lỗi mà tôi nhận được từ người kiểm tra là:

TypeError: Cannot convert undefined or null to object
    at Function.keys (native)
    at stringify (stringifyJSON.js:18:22)
    at stringifyJSON (stringifyJSON.js:27:13)
    at stringifyJSONSpec.js:7:20
    at Array.forEach (native)
    at Context.<anonymous> (stringifyJSONSpec.js:5:26)
    at Test.Runnable.run (mocha.js:4039:32)
    at Runner.runTest (mocha.js:4404:10)
    at mocha.js:4450:12
    at next (mocha.js:4330:14)

Có vẻ như không thành công với: stringifyJSON (null) chẳng hạn


1
vui lòng cung cấp các đầu vào mà bạn đang nhận lỗi, như hoạt động cho mục stringifyJSON ({a: 'b', c: 'd'})
vinayakj

1
Ngoài lỗi, stringifyJSON([1,2,3])trả về 1,2,3stringifyJSON({foo: 'bar'})trả về {foo: "bar"}, cả hai đều không phải là JSON hợp lệ.
Felix Kling

4
Dự đoán của tôi sẽ là dòng này if (obj === 'null') { return null;} // null unchanged, - dòng đó sẽ không vượt qua khi được đưa ra null, chỉ khi được cung cấp chuỗi "null". Vì vậy, nếu bạn chuyển nullgiá trị thực tế cho tập lệnh của mình, nó sẽ được phân tích cú pháp trong phần Đối tượng của mã. Và Object.keys(null)ném những thứ TypeErrorđã đề cập. Để khắc phục sự cố, hãy sử dụng if(obj === null) {return null}- không có qoutes xung quanh null.
veproza

1
Một vấn đề khác: mã của bạn không xử lý khả năng có các "ký tự được nhúng trong chuỗi.
Pointy

@Pointy - vâng, tôi sẽ cần phải thêm một số logic cho rằng ... cảm ơn bạn
zahabba

Câu trả lời:


131

Câu trả lời chung chung

Lỗi này xảy ra khi bạn gọi một hàm mong đợi một Đối tượng làm đối số của nó, nhưng thay vào đó lại truyền không xác định hoặc null , chẳng hạn như

Object.keys(null)
Object.assign(window.UndefinedVariable, {})

Vì điều đó thường do nhầm lẫn, giải pháp là kiểm tra mã của bạn và sửa điều kiện null / undefined để hàm nhận được một Đối tượng thích hợp hoặc hoàn toàn không được gọi.

Object.keys({'key': 'value'})
if (window.UndefinedVariable) {
    Object.assign(window.UndefinedVariable, {})
}

Trả lời cụ thể cho mã được đề cập

Dòng if (obj === 'null') { return null;} // null unchanged sẽ không đánh giá khi được đưa ra null, chỉ khi được cung cấp chuỗi "null". Vì vậy, nếu bạn chuyển nullgiá trị thực tế cho tập lệnh của mình, nó sẽ được phân tích cú pháp trong phần Đối tượng của mã. Và Object.keys(null)ném những thứ TypeErrorđã đề cập. Để khắc phục, hãy sử dụng if(obj === null) {return null}- không có qoutes xung quanh null.


8
Đánh dấu: "Và Object.keys(null)ném những thứ TypeErrorđã đề cập."
falsarella

1
Để thêm một ví dụ phổ biến khác về nơi điều này xảy ra: delete obj.propertyở đâuobj===null
Gio

4

Đảm bảo rằng đối tượng đích không trống ( nullhoặc undefined).

Bạn có thể khởi tạo đối tượng đích với đối tượng trống như bên dưới:

var destinationObj = {};

Object.assign(destinationObj, sourceObj);

2

Điều này rất hữu ích để tránh lỗi khi truy cập thuộc tính của các đối tượng null hoặc không xác định.

null đến đối tượng không xác định

const obj = null;
const newObj = obj || undefined;
// newObj = undefined

không xác định cho đối tượng trống

const obj; 
const newObj = obj || {};
// newObj = {}     
// newObj.prop = undefined, but no error here

null thành rỗng đối tượng

const obj = null;
const newObj = obj || {};
// newObj = {}  
// newObj.prop = undefined, but no error here

0

Tôi đã giải quyết vấn đề tương tự trong một dự án React Native. Tôi đã giải quyết nó bằng cách sử dụng này.

let data = snapshot.val();
if(data){
  let items = Object.values(data);
}
else{
  //return null
}

0

Trong trường hợp của tôi, tôi đã thêm tiện ích mở rộng Lucid vào Chrome và không nhận thấy sự cố tại thời điểm đó. Sau khoảng một ngày làm việc để giải quyết vấn đề và đảo ngược chương trình, trong một bài đăng, ai đó đã đề cập đến Lucid. Tôi nhớ những gì tôi đã làm và xóa tiện ích mở rộng khỏi Chrome và chạy lại chương trình. Vấn đề đã biến mất. Tôi đang làm việc với React. Tôi nghĩ điều này có thể giúp ích.


0

Thay thế

if (typeof obj === 'undefined') { return undefined;} // return undefined for undefined
if (obj === 'null') { return null;} // null unchanged

với

if (obj === undefined) { return undefined;} // return undefined for undefined 
if (obj === null) { return null;} // null unchanged

0

Nếu bạn đang sử dụng Laravel , vấn đề của tôi là ở tên Tuyến đường của tôi. Thay thế:

Route::put('/reason/update', 'REASONController@update');

Tôi đã viết:

Route::put('/reason/update', 'RESONController@update');

và khi tôi sửa tên bộ điều khiển, mã đã hoạt động!


0

Trong trường hợp của tôi, tôi có thêm một cặp ngoặc đơn ()

Thay vì

export default connect(
  someVariable
)(otherVariable)()

Nó đã được

export default connect(
  someVariable
)(otherVariable)

-2

Tôi gặp vấn đề tương tự với một phần tử trong biểu mẫu web. Vì vậy, những gì tôi đã làm để sửa chữa nó đã được xác thực. if (Object === 'null') làm gì đó

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.