How to resolve TypeError: Cannot convert undefined or null to object

How to resolve TypeError: Cannot convert undefined or null to object

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

我的代码:

  // 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)

一般答案

当您调用一个需要 Object 作为其参数的函数,但传递了 undefinednull 而不是,例如

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.keys(null) 抛出提到的 TypeError。要修复它,请使用 if(obj === null) {return null} - 没有 null 周围的 qoutes。

我对网络表单中的一个元素有同样的问题。所以我所做的修复是有效的。 如果(对象=== 'null') 做某事

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

您可以像下面这样用空对象初始化目标对象:

var destinationObj = {};

Object.assign(destinationObj, sourceObj);

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

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

替换

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

在我的例子中,我将 Lucid 扩展添加到 Chrome 并且当时没有注意到问题。经过大约一天的时间来解决这个问题并将程序颠倒过来,在 post 中有人提到了 Lucid。我想起了我所做的事情,并再次从 Chrome 和 运行 程序中删除了扩展名。问题消失了。我正在使用 React。我认为这可能会有所帮助。

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

null 到未定义的对象

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

未定义为空对象

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

null 到空对象

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

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

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

我写了:

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

当我修复控制器名称时,代码有效!

在我的例子中,我多了一对括号 ()

而不是

export default connect(
  someVariable
)(otherVariable)()

必须

export default connect(
  someVariable
)(otherVariable)

下面的代码片段足以让我了解我是如何在不同的情况下遇到同样的问题,以及我是如何使用已接受的答案中的指导解决它的。在我的例子中,我试图使用 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 代码。 (虽然看懂问题没关系)

在将对象放到地图上之前添加“对象 &&”。 objexts && Object.keys(objexts )?.map((objext, idx) =>

reactTraverser.js:6 未捕获类型错误:无法将未定义或 null 转换为对象 Function.keys () reactTraverser.js:6

如果您在 typeScript 上遇到此错误尝试在没有 Live Server 的情况下使用它,此错误将不会显示