如何解决TypeError:无法将undefined或null转换为object

时间:2015-04-18 18:29:42

标签: javascript

我编写了几个有效复制JSON.stringify()的函数,将一系列值转换为字符串化版本。当我将代码移植到JSBin并在某些示例值上运行它时,它运行正常。但是我在一个专门用来测试它的规范运行器中得到了这个错误。

我的代码:

  // 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) + "";
    }
};

我从测试人员那里得到的错误信息是:

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)

似乎失败了: stringifyJSON(null)例如

10 个答案:

答案 0 :(得分:59)

通用答案

当您调用期望 Object 作为其参数的函数时会导致此错误,但是会传递 undefined null ,例如示例

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

由于这通常是错误的,解决方案是检查您的代码并修复 null / undefined 条件,以便该函数获得正确的 Object ,或者根本没有被召唤。

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

特定于相关代码的答案

if (obj === 'null') { return null;} // null unchanged行不会 只有在给定字符串null时,才会在给定"null"时进行评估。因此,如果将实际的null值传递给脚本,它将在代码的Object部分中进行解析。 Object.keys(null)会引发TypeError提到的内容。要解决此问题,请使用if(obj === null) {return null} - 不要将qoutes置于null。

答案 1 :(得分:2)

这对于避免访问null或未定义对象的属性时的错误非常有用。

空为未定义对象

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

未定义为空对象

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

空到空对象

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

答案 2 :(得分:0)

确保目标对象不为空(nullundefined)。

您可以使用空对象初始化目标对象,如下所示:

var destinationObj = {};

Object.assign(destinationObj, sourceObj);

答案 3 :(得分:0)

我在React Native项目中解决了相同的问题。我用这个解决了。

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

答案 4 :(得分:0)

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

使用

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

答案 5 :(得分:0)

就我而言,我在Chrome中添加了Lucid扩展程序,但当时没有注意到问题。经过大约一天的时间解决问题并将程序颠倒了之后,有人在帖子中提到了Lucid。我记得自己所做的事情,并从Chrome中删除了该扩展程序,然后再次运行了该程序。问题解决了。我正在与React合作。我认为这可能会有所帮助。

答案 6 :(得分:0)

如果您使用的是 Laravel ,则问题出在我的路线名称上。 相反:

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

我写道:

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

当我固定控制器名称时,代码就起作用了!

答案 7 :(得分:0)

在我的情况下,我还有一对括号()

代替

export default connect(
  someVariable
)(otherVariable)()

必须是

export default connect(
  someVariable
)(otherVariable)

答案 8 :(得分:0)

下面的代码片段足以了解我如何遇到相同的问题,但是在不同的情况下,以及如何使用已接受答案中的指导来解决该问题。在我的情况下,我试图使用Object.keys()方法记录“ defaultViewData”数组的第0个索引中存在的对象的键。

defaultViewData = [{"name": "DEFAULT_VIEW_PLP","value": {"MSH25": "LIST"}}] 

console.log('DEFAULT_VIEW', Object.keys(this.props.defaultViewData[0]));

未打印console.log,并且出现与该问题相同的错误。为了防止该错误,我在以下条件下添加了

    if(this.props.defaultViewData[0]) {
  console.log('DEFAULT_VIEW', Object.keys(this.props.defaultViewData[0]));
}

添加此检查可确保我没有收到此错误。我希望这对某人有帮助。

注意:这是React.js代码。 (尽管了解问题并不重要)。

答案 9 :(得分:-1)

我对网络表单中的元素有同样的问题。因此,我所做的修复工作就是验证。 if(Object ==='null')      做某事