1. ホーム
  2. Web プログラミング
  3. ジャバスクリプト

[解決済み】TypeErrorの解決方法。未定義またはヌルをオブジェクトに変換できない

2021-12-30 16:29:37

質問

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.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 部分で解析されます。そして Object.keys(null) を投げます。 TypeError が記載されています。これを修正するには if(obj === null) {return null} - のように、nullの周りにqoutesをつけないでください。