如何解决 TypeError: 无法将未定义或 null 转换为对象

我已经编写了几个有效复制 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)

503639 次浏览

一般答案

当您调用一个函数,该函数期望 反对作为其参数,但是却传递了 未定义无效,就会导致此错误,例如

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

因为这通常是错误的,所以解决方案是检查代码并修复 Null/未定义条件,这样函数要么获得正确的 反对,要么根本不被调用。

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}-不要使用 null 附近的 qoutes。

我对 webform 中的一个元素也有同样的问题,所以我所做的修复是有效的。 如果(Object = = ‘ null’) 做点什么

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

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

var destinationObj = {};


Object.assign(destinationObj, sourceObj);

我在一个反应本机项目中解决了同样的问题,我用这个解决了它。

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

在我的案例中,我在 Chrome 中添加了 Lucid 扩展,当时并没有注意到这个问题。经过大约一天的工作,解决这个问题,并把程序颠倒过来,在一个帖子中有人提到了 Lucid。我记得我做了什么,从 Chrome 中删除了扩展,然后再次运行程序。问题解决了。我在和“反应”合作。我觉得这个可能会有帮助。

这对于在访问 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

如果你使用 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]));

Log 没有被打印出来,我得到的错误和这个问题中提到的一样。为了防止这个错误,我添加了以下条件

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

添加这个检查确保我没有得到这个错误。我希望这对某些人有所帮助。

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

在将对象放到映射之前添加 Object &&可以工作。

objexts && Object.keys(objexts)?.map((objext, idx) =>

未捕获的 TypeError: 无法在 reactTraverser.js: 6处的 Function.keys ()将未定义或 null 转换为对象

如果您在 typeScript 上得到此错误,请尝试在不使用 LiveServer 的情况下使用它,此错误将不会显示

确保该对象不为空(null 或未定义)。

错误:

let obj


Object.keys(obj)

解决方案:

Object.keys(obj || {})

小菜一碟

只需使用一行代码将传递给 Object.keys的任何内容转换为 Object,如下所示:

let variable = undefined;


Object.keys(Object(variable)); // Outputs: []