我写了几个有效复制 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)
通用答案
当您调用一个期望 Object 作为其参数的函数时,会导致此错误,但却传递了 undefined 或 null,例如
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}
- 没有 qoutes 围绕 null.
确保对象不为空(null 或 undefined )。
错误:
let obj
Object.keys(obj)
解决方案:
Object.keys(obj || {})
确保目标对象不为空(
null
或 undefined
)。
您可以像下面这样用空对象初始化目标对象:
var destinationObj = {};
Object.assign(destinationObj, sourceObj);
这对于在访问 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
添加
Object &&
在将对象放到地图上之前起作用。
objexts && Object.keys(objexts)?.map((objext, idx) =>
就我而言,我在 Chrome 中添加了 Lucid 扩展程序,但当时并没有注意到这个问题。经过大约一天的时间来解决这个问题并将程序颠倒过来,在一篇帖子中有人提到了 Lucid。我记得我做了什么,从 Chrome 中删除了扩展程序,然后再次运行该程序。问题消失了。我正在使用 React。我认为这可能会有所帮助。
我在一个 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
如果您使用的是 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 代码。 (虽然理解问题没关系)。
reactTraverser.js:6 Uncaught TypeError: Cannot convert undefined or null to object at Function.keys () 在 reactTraverser.js:6
如果您在 typeScript 上遇到此错误,请尝试在没有 Live Server 的情况下使用它,此错误将不会显示
我对网络表单中的元素有同样的问题。所以我所做的修复是有效的。 如果(对象==='空') 做某事