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

Javascript 如何解决TypeError:无法将未定义或null转换为对象,javascript,null,undefined,Javascript,Null,Undefined,我编写了两个函数,可以有效地复制JSON.stringify(),将一系列值转换为stringify版本。当我将代码移植到JSBin并在一些示例值上运行它时,它运行得很好。但是我在一个专门为测试这个而设计的规范运行程序中遇到了这个错误 我的代码: // five lines of comments var stringify = function(obj) { if (typeof obj === 'function') { return undefined;} // return

我编写了两个函数,可以有效地复制JSON.stringify(),将一系列值转换为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)
TypeError:无法将未定义或null转换为对象
at Function.keys(本机)
在stringify(stringifyJSON.js:18:22)
在stringifyJSON(stringifyJSON.js:27:13)
在stringifyJSONSpec.js:7:20
at Array.forEach(本机)
在上下文中。(stringifyJSONSpec.js:5:26)
在Test.Runnable.run(mocha.js:4039:32)
在Runner.runTest(mocha.js:4404:10)
在摩卡。js:4450:12
在下一站(mocha.js:4330:14)
它似乎在以下方面失败了:
stringifyJSON(null)例如

通用答案

Object.keys(null)
Object.assign(window.UndefinedVariable, {})
当您调用一个函数,该函数期望一个对象作为其参数,但却传递undefined或null,例如

Object.keys(null)
Object.assign(window.UndefinedVariable, {})
由于这通常是错误的,解决方案是检查代码并修复null/undefined条件,以便函数要么获得正确的对象,要么根本不被调用

Object.keys({'key': 'value'})
if (window.UndefinedVariable) {
    Object.assign(window.UndefinedVariable, {})
}
特定于问题代码的答案

如果(obj=='null'){return null;}//null unchanged行将不会更改
当给定
null
时进行计算,仅当给定字符串
“null”
时进行计算。因此,如果将实际的
null
值传递给脚本,它将在代码的对象部分进行解析。和
Object.keys(null)
抛出前面提到的
TypeError
。要解决此问题,请使用
if(obj==null){return null}
-而不使用null周围的qoutes。

我对Web表单中的元素也有同样的问题。所以我所做的是修复它。 如果(对象=='null')
执行某些操作

确保目标对象不为空(
null
未定义

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

var destinationObj = {};

Object.assign(destinationObj, sourceObj);

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

let data=snapshot.val();
如果(数据){
让items=Object.values(数据);
}
否则{
//返回空值
}
更换

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


在我的例子中,我给Chrome添加了Lucid扩展,但当时没有注意到这个问题。经过大约一天的研究,把程序颠倒过来,在一篇帖子中有人提到了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
const obj = null;
const newObj = obj || {};
// newObj = {}  
// newObj.prop = undefined, but no error here
空对象为空

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', 'RESONController@update');

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

在我的例子中,我有一对额外的括号
()

而不是

export default connect(
  someVariable
)(otherVariable)()
一定是这样

export default connect(
  someVariable
)(otherVariable)

下面的代码片段足以理解我是如何在不同的场景中遇到相同的问题的,以及我是如何使用公认答案中的指导解决问题的。在本例中,我尝试使用object.keys()方法记录“defaultViewData”数组第0个索引中存在的对象的键

console.log没有打印出来,我收到的错误与此问题中发布的错误相同。为了防止这个错误,我添加了以下条件

    if(this.props.defaultViewData[0]) {
  console.log('DEFAULT_VIEW', Object.keys(this.props.defaultViewData[0]));
}
添加此检查确保我没有收到此错误。我希望这对某人有帮助


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

请提供您得到错误的输入,因为它用于stringifyJSON({a:'b',c:'d'))除了错误之外,
stringifyJSON([1,2,3])
返回
1,2,3
stringifyJSON({foo:'bar')
返回
{foo:'bar},这两个都不是有效的JSON。我猜这一行是
if(obj==='null'){return null;}//null unchanged
,如果给定
null
,只有在给定字符串
“null”
时才会通过。因此,如果将实际的
null
值传递给脚本,它将在代码的对象部分进行解析。和
Object.keys(null)
抛出前面提到的
TypeError
。若要修复它,请使用
if(obj==null){return null}
-而不使用
null
周围的qoutes。另一个问题:您的代码无法处理字符串中嵌入
字符的可能性。@Pointy-是的,我需要为此添加一些逻辑…谢谢突出显示:
对象.keys(null)
抛出前面提到的
TypeError
。”要添加另一个发生这种情况的常见示例:
delete obj.property
where
obj==null