【问题标题】:Unable to get property 'replace' of undefined or null reference?无法获取未定义或空引用的属性“替换”?
【发布时间】:2019-06-29 22:26:56
【问题描述】:

此代码引发错误: 无法获取未定义或空引用的属性“替换”

 function formatDate(dateVal) {

        var date = new Date(parseInt(dateVal.replace('/Date(', '')))
        var month = date.getMonth() + 1;
        var day = date.getDate();
        var year = date.getFullYear();
        return (day.toString().length > 1 ? day : "0" + day) + "/" + (month.toString().length > 1 ? month : "0" + month) + "/" + year;
    }

传递给它的值为空,格式类似于 /Date(-62135596800000)/。

【问题讨论】:

  • 替换前检查值是否为空
  • 检查传递的值的类型,如果不是字符串,在尝试调用字符串方法之前处理它。

标签: javascript jquery json date


【解决方案1】:

好吧,如果你传递一个null 值,它就没有任何属性。确保传递正确的值:

function formatDate(dateVal) {
  var date = new Date(parseInt(dateVal.replace('/Date(', '')))
  var month = date.getMonth() + 1;
  var day = date.getDate();
  var year = date.getFullYear();
  return (day.toString().length > 1 ? day : "0" + day) + "/" + (month.toString().length > 1 ? month : "0" + month) + "/" + year;
}

console.log(formatDate("/Date(-62135596800000)/"));

【讨论】:

  • 是的,但是如果来自 db 的值作为 null 传递,即没有值.. 到 format 函数怎么办。如何在不失败的情况下处理它?
  • 您的意思是将/Date(-62135596800000)/ 设置为默认值@Stacky?
  • 我的意思是如何处理空条件?如果值未定义传递?
  • 如果未定义,使用默认参数function formatDate(dateVal = "/Date(-62135596800000)/") {...}。如果为空,请使用逻辑 OR 运算符 dateVal = dateVal || "/Date(-62135596800000)/"; 进行内部检查
  • @JackBashford——如果它是一个通用函数,可能需要做更多的工作,因为可能存在值是真值但不是字符串的情况。 ;-)
【解决方案2】:

使用像这样的默认参数 formatDate(dateVal = "" ) ,如果没有传递值或传递了 undefined,它允许您为函数参数设置默认值:

function formatDate(dateVal = "" ) {
  var date = new Date(parseInt(dateVal.replace('/Date(', '')))
  var month = date.getMonth() + 1;
  var day = date.getDate();
  var year = date.getFullYear();
  return (day.toString().length > 1 ? day : "0" + day) + "/" + (month.toString().length > 1 ? month : "0" + month) + "/" + year;
}

【讨论】:

  • 设置默认值并不能解决传递的值是错误类型的情况。如果需要特定类型(在本例中为字符串),则更好地验证该值。
【解决方案3】:

你的问题似乎是你期待一个像 "/Date(-62135596800000)/" 这样的字符串,但得到了别的东西。所以在调用字符串方法解析它之前验证输入,例如

function formatDate(dateVal) {

  // Test for string in required format
  if (!/^\/Date\([+-]?\d{1,16}\)\/$/.test(dateVal)) {
    return; // undefined
  }
  
  let date = new Date(parseInt(dateVal.replace('/Date(', '')))
  let month = date.getMonth() + 1;
  let day = date.getDate();
  let year = ('000' + date.getFullYear()).slice(-4);
  return (day > 9 ? day : "0" + day) + "/" +
         (month > 9 ? month : "0" + month) + "/" +
          year;
}

// Simple tests
['/Date(-62135596800000)/',
  null,
  NaN,
  'sweet',
  1561853541934,
  '/Date(1561853541934)/'].forEach(
    v => console.log(v + ': ' + formatDate(v))
);

然后在调用者中,你可以测试你是否返回了一个字符串(成功)或undefined,这表示你需要处理的无效输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 2020-04-28
    • 2016-08-16
    • 2017-05-18
    • 1970-01-01
    • 2014-08-29
    相关资源
    最近更新 更多