如何重写此JavaScript行以简化阅读?(三元运算符)

如何重写此JavaScript行以简化阅读?(三元运算符),javascript,Javascript,大家好,我正在尝试使用此日历代码作为学习/项目材料来学习JavaScript。在这个变量中发生了很多事情,就像在看一些外星语言一样。我如何重写这一行以便更简单地阅读 为了避免重复,您可以通过在三元运算符本身中创建新日期,然后对整个表达式调用getDate,只编写一次getDate: var lastDay_of_LastMonth = (m === 0 ? new Date(y-1, 11, 0) : new Date(y, m, 0)) .getDate(); 但您也可以为所讨论

大家好,我正在尝试使用此日历代码作为学习/项目材料来学习JavaScript。在这个变量中发生了很多事情,就像在看一些外星语言一样。我如何重写这一行以便更简单地阅读


为了避免重复,您可以通过在三元运算符本身中创建
新日期
,然后对整个表达式调用
getDate
,只编写一次
getDate

var lastDay_of_LastMonth = 
  (m === 0 ? new Date(y-1, 11, 0) : new Date(y, m, 0))
  .getDate();
但您也可以为所讨论的
date
对象定义一个独立变量,以明确它代表什么:

var lastMonthDate = m === 0
  ? new Date(y - 1, 11, 0)
  : new Date(y, m, 0)
var lastDay_of_LastMonth = lastMonthDate.getDate();

不要害怕将长表达式分隔成多行

为了避免重复,您可以通过在三元运算符本身中创建新日期来编写一次
getDate
,然后对整个表达式调用
getDate

var lastDay_of_LastMonth = 
  (m === 0 ? new Date(y-1, 11, 0) : new Date(y, m, 0))
  .getDate();
但您也可以为所讨论的
date
对象定义一个独立变量,以明确它代表什么:

var lastMonthDate = m === 0
  ? new Date(y - 1, 11, 0)
  : new Date(y, m, 0)
var lastDay_of_LastMonth = lastMonthDate.getDate();
不要害怕将长表达式分成多行

当三元运算符(或压缩if)的组件有许多部分时,它会很快变得混乱。也许有些人会不同意,但最好将三元运算符限制在更简单的情况下,例如
var parity=x%2==0?“偶数”:“奇数”

在你的情况下,我认为最具可读性的是写出整个if语句:

var lastDay_of_LastMonth
if (m == 0)
  lastDay_of_LastMonth = new Date(y-1, 11, 0).getDate();
else
  lastDay_of_LastMonth = new Date(y, m, 0).getDate();
当三元运算符(或压缩if)的组件有许多部分时,它会很快变得混乱。也许有些人会不同意,但最好将三元运算符限制在更简单的情况下,例如
var parity=x%2==0?“偶数”:“奇数”

在你的情况下,我认为最具可读性的是写出整个if语句:

var lastDay_of_LastMonth
if (m == 0)
  lastDay_of_LastMonth = new Date(y-1, 11, 0).getDate();
else
  lastDay_of_LastMonth = new Date(y, m, 0).getDate();

月份可以是负数,因此
新日期(y-1,11,0)
新日期(y-1,0)
相同:

但要获得月份为1月(m==0)时12月的天数,正确的版本如下:

var lastDay_of_LastMonth = new Date(y, m, 0).getDate();

月份可以是负数,因此
新日期(y-1,11,0)
新日期(y-1,0)
相同:

但要获得月份为1月(m==0)时12月的天数,正确的版本如下:

var lastDay_of_LastMonth = new Date(y, m, 0).getDate();


该语法是一个三元语句,读起来很好。您可以用if-else替换它,或者为上个月的最后一天编写函数。如果可能的话,最好使用const而不是var。getDate有点多余。似乎有点不合适。。对于一月(m==0),它得到的是十一月(30)的天数,而不是十二月(31)?是的,这是一个bug。。日历上显示的是1月1日之前的12月30日,而不是12月31日sttnx@JohnOttenlips,当我对JavaScript有了更多的经验后,我将研究“const vs.var”。该语法是一个三元语句,读起来很好。您可以用if-else替换它,或者为上个月的最后一天编写函数。如果可能的话,最好使用const而不是var。getDate有点多余。似乎有点不合适。。对于一月(m==0),它得到的是十一月(30)的天数,而不是十二月(31)?是的,这是一个bug。。日历上显示的是1月1日之前的12月30日,而不是12月31日sttnx@JohnOttenlips,当我对JavaScript有了更多的经验后,我将研究“const vs.var”。我不同意,这是非常重复的。@brendon boldt这更易于阅读和维护,对我的大脑来说也更简单。:)我并不是说这是写这篇文章的最佳方式,但我确实认为这是最容易理解和最容易快速阅读的方式。我不同意,这是非常重复的。@brendon boldt这篇文章更易于阅读和维护,对我的大脑影响更小。:)我并不是说这是写这篇文章的最佳方式,但我确实认为这是最容易理解和快速阅读的方式。嗨,斯拉伊,这就是我的新代码的样子吗?//上个月的最后一天。如果(m==0)//BUG!?它计算11月的最后一天而不是12月的最后一天。//lastDay\u of_lastmount=新日期(y-1,11,0)。getDate();lastDay_of_LastMonth=新日期(y,m,0).getDate();elselastDay_of_lastmount=新日期(y,m | |-1,0).getDate()}另外,我真的不明白“m和-1”部分如何适用于二月到十二月?2月到12月不是应该是“m-1”吗?@Abby我在评论中提到其他版本是错误的,因为它们是12月30日而不是12月31日。您不需要其他工具,只需
var lastDay\u of_lastmount=新日期(y,m,0).getDate()就足够了<不需要代码>m-1
,因为
0
天是上个月的最后一天。在新日期(y,m,d)中,一月的月份从0开始,但一天从1Hi Slai开始,我的新代码是这样的吗?//上个月的最后一天。如果(m==0)//BUG!?它计算11月的最后一天而不是12月的最后一天。//lastDay\u of_lastmount=新日期(y-1,11,0)。getDate();lastDay_of_LastMonth=新日期(y,m,0).getDate();elselastDay_of_lastmount=新日期(y,m | |-1,0).getDate()}另外,我真的不明白“m和-1”部分如何适用于二月到十二月?2月到12月不是应该是“m-1”吗?@Abby我在评论中提到其他版本是错误的,因为它们是12月30日而不是12月31日。您不需要其他工具,只需
var lastDay\u of_lastmount=新日期(y,m,0).getDate()就足够了<不需要代码>m-1
,因为
0
天是上个月的最后一天。在新日期(y、m、d)中,一月的月份从0开始,但天从1开始