如何解决类型错误: 无法将未定义或 null 转换为对象

2022-08-30 04:09:56

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


答案 1

通用答案

当您调用一个函数时,如果该函数需要 Object 作为其参数,但传递未定义null,例如

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

由于这通常是错误的,因此解决方案是检查代码并修复null/unfined条件,以便函数要么获得正确的对象,要么根本不被调用。

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

特定于相关代码的答案

该行在给定时不会计算,仅当给定字符串时。因此,如果将实际值传递给脚本,则会在代码的 Object 部分中对其进行分析。并抛出提到的。要修复它,请使用 - 不带 null 周围的 qoutes。if (obj === 'null') { return null;} // null unchangednull"null"nullObject.keys(null)TypeErrorif(obj === null) {return null}


答案 2

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

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

var destinationObj = {};

Object.assign(destinationObj, sourceObj);