默认参数原因无法读取未定义的属性?

时间:2018-07-07 11:17:55

标签: javascript ecmascript-6

export const getNotifications = (
  role,
  page,
  { see_more = undefined }
) => async dispatch => {

}

我收到了TypeError: Cannot read property 'see_more' of undefined的错误,但是我是否已经设置了默认值undefined?为什么仍然存在错误?

3 个答案:

答案 0 :(得分:0)

仅将其用作变量参数,而不用作对象:

export const getNotifications = (
   role,
   page,
   see_more = undefined
) => async dispatch => {

}

答案 1 :(得分:0)

我认为您的错误TypeError: Cannot read property 'see_more' of undefined与声明类型无关。忘记您的代码,请参见下文:

const sampleObj = {see:1, look:2};
const {watch} = sampleObj; //=> watch is 'undefined'

现在叫孩子!实际上,白人watchundefined,并不是JavaScript想要生孩子,甚至undefined个孩子的对象:

console.log(watch.child);
//=> error: Uncaught TypeError: Cannot read property 'child' of undefined

因此,您必须注意dispatch函数。也许您呼叫see_more的孩子,实际上是undefined,甚至不是通过{}的{​​{1}}。

建议:将undefined设置为{}的默认值,这样,如果see_more将是see_more,至少您会得到{{ 1}}来给孩子打电话。

答案 2 :(得分:0)

我敢打赌,当您这样做时,这正在发生:

blah.getNotifications('admin', 5); // and you didn't put anything for see_more

实际上,JS可以告诉您确切的内部情况,这不是错误。为了解决这个问题,我尝试了尽可能少的代码来实现这一点,这是我学到的:

export const getNotifications = (
  role,
  page,
  { see_more = undefined } = {}
) => async dispatch => {

}

您所需要的只是= {}参数前面的{ see_more = undefined };欢迎使用高级JS。

您看到,JS试图破坏未定义的对象;是的{ see_more = undefined }在解构之前将被单独视为参数。我发现JS正在看到:blah.getNotifications('admin', 5, undefined);。因此该参数为undefined,并且在尝试对其进行分解时会失败。这里的技巧是在解构步骤之前为参数本身提供默认值,以使您得到:blah.getNotifications('admin', 5, {});,而该参数没有给出任何参数。然后进行解构,以填充您提供的默认值。

我还觉得有趣的是,当对参数完全没有定义时,默认值实际上可以包含其他默认值。尽管{}足以满足您的默认默认设置,但是您可以通过执行以下操作来改变自己的习惯:

export const getNotifications = (
  role,
  page,
  { see_more = 'more text', another = 'foo', gumbo = 'mukombo' } = {another: 'bar', gumbo: 'why didnt you put anything'}
) => async dispatch => {

}

因此您将获得:

see_more === 'more text', another === 'bar', gumbo === 'why didnt you put anything'

如果您致电:

blah.getNotifications('admin', 5);

但是如果您使用至少一个属性调用,例如:

blah.getNotifications('admin', 5, {another: 'dzetse'} );

您得到:

see_more === 'more text', another === 'dzetse', gumbo === 'mukombo'

在这里完全没有任何内容(undefined)时,您将获得其他部分默认值(两个obj都用于获取1个最终对象,然后对其进行了重构)。

只希望他们也可以接受这种简单的错误语法。