TypeErrorを解決する方法:未定義またはnullをオブジェクトに変換できません


92

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
エラーは別として、stringifyJSON([1,2,3])returns1,2,3stringifyJSON({foo: 'bar'})returnsは{foo: "bar"}、どちらも有効なJSONではありません。
Felix Kling 2015

4
私の推測では、この行if (obj === 'null') { return null;} // null unchangednull、文字列が与えられた場合にのみ、与えられたときに通過しません"null"。したがって、実際のnull値をスクリプトに渡すと、コードのオブジェクト部分で解析されます。そしてObject.keys(null)TypeError言及されたものを投げます。これを修正するには、if(obj === null) {return null}-を使用しnullます。
veproza 2015

1
別の問題:コードが"文字列に埋め込まれた文字の可能性を処理しない。
先のとがっ

@ Pointy-はい、そのためのロジックを追加する必要があります...ありがとうございます
zahabba 2015

回答:


134

一般的な答え

このエラーは、オブジェクトを引数として期待する関数を呼び出したが、代わりにundefinedまたはnullを渡した場合に発生します。たとえば、

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

これは通常誤っているため、解決策は、コードをチェックしてnull / undefined条件を修正し、関数が適切なオブジェクトを取得するか、まったく呼び出されないようにすることです。

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}nullの周りのqoutesなしで-を使用します。


8
ハイライト:「そしてObject.keys(null)TypeError言及されたものを投げます。」
falsarella

1
これが発生する別の一般的な例を追加するには:delete obj.propertywhereobj===null
Gio 2010

4

宛先オブジェクトが空(nullまたはundefined)でないことを確認してください。

以下のように、宛先オブジェクトを空のオブジェクトで初期化できます。

var destinationObj = {};

Object.assign(destinationObj, sourceObj);

2

これは、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

0

ReactNativeプロジェクトで同じ問題を解決しました。これを使って解決しました。

let data = snapshot.val();
if(data){
  let items = Object.values(data);
}
else{
  //return null
}

0

私の場合、ChromeにLucid拡張機能を追加しましたが、その時点では問題に気づいていませんでした。問題に取り組み、プログラムを逆さまにして約1日後、誰かがLucidについて言及した投稿がありました。自分が行ったことを思い出し、Chromeから拡張機能を削除して、プログラムを再度実行しました。問題はなくなりました。私はReactを使用しています。これが役立つかもしれないと思いました。


0

交換

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

0

Laravelを使用している場合、私の問題は私のルートの名前にありました。代わりに:

Route::put('/reason/update', 'REASONController@update');

私が書いた:

Route::put('/reason/update', 'RESONController@update');

コントローラー名を修正すると、コードが機能しました。


0

私の場合、余分な括弧がありました ()

の代わりに

export default connect(
  someVariable
)(otherVariable)()

それはしなければなりませんでした

export default connect(
  someVariable
)(otherVariable)

0

以下のスニペットは、同じ問題が異なるシナリオでどのように発生したか、および受け入れられた回答のガイダンスを使用してどのように解決したかを理解するのに十分です。私の場合、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コードです。(問題を理解することは重要ではありませんが)。


-2

Webフォームの要素についても同じ問題があります。だから私がそれを修正するためにしたことは検証でした。if(Object === 'null')何かをする

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.