如何解决 TypeError:无法将未定义或 null 转换为对象
我编写了几个函数,它们可以有效地复制 JSON.stringify(),将一系列值转换为字符串化版本。当我将代码移植到 JSBin 并在一些示例值上运行它时,它运行良好。但我在为测试此问题而设计的 spec runner 中遇到了此错误。
我的代码:
// 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 作为其参数,但却传递了 undefined 或 null ,例如
Object.keys(null)
Object.assign(window.UndefinedVariable, {})
由于这通常是错误造成的,因此解决方案是检查您的代码并修复 null/undefined 条件,以便该函数可以获取正确的 Object ,或者根本不被调用。
Object.keys({'key': 'value'})
if (window.UndefinedVariable) {
Object.assign(window.UndefinedVariable, {})
}
针对所讨论代码的特定答案
当给定
null
时,行
if (obj === 'null') { return null;} // null fixed
将不会
评估,只有当给定字符串
"null"
时才会评估。因此,如果您将实际的
null
值传递给脚本,它将在代码的 Object 部分进行解析。并且
Object.keys(null)
会抛出上述的
TypeError
。要修复它,请使用
if(obj === null) {return null
- 不带 null 周围的引号。
确保对象不为空 (null 或 undefined )。
错误:
let obj
Object.keys(obj)
解决方案:
Object.keys(obj || {})
确保目标对象不为空(
null
或
undefined
)。
您可以像下面这样使用空对象初始化目标对象:
var destinationObj = {};
Object.assign(destinationObj, sourceObj);