網站搜尋

javascript - 如何解決 TypeError:無法將 undefined 或 null 轉換為物件


我寫了幾個函數,能有效地模仿 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 的函數,但傳遞了 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 部分被解析。而 Object.keys(null) 會拋出提到的 TypeError。要修正它,請使用 if(obj === null) {return null} - null 兩邊不要加引號。

答案#2

確保該物件不是空的(null 或 undefined)。

錯誤:

let obj

Object.keys(obj)

解決方案:

Object.keys(obj || {})