我的应用程序发生了奇怪的行为。我有以下DatePicker,如下所示:
<DatePicker
inline
minDate={moment().add(1, "day").utc().toDate()}
maxDate={moment().add(7, "day").utc().toDate()}
selected={selectedDate ? selectedDate : moment().utc().toDate()}
onChange={this.onDateSelect}/>
如果我将这样的代码保留下来,则应用程序可以正常运行,但是如果我将minDate从1更改为-say- 25,然后将maxDate从7更改为35,那么我会在此代码行上收到上述错误: / p>
以下是在reducer中,其initialState定义为:
const initialState = {
days: [],
times:[],
schedule: {},
rescheduled: false
};
> let times = dayList.find(day => Boolean(day.selected) === true).times.filter(time => Boolean(time.available) === true);
我不确定times
如果在这里明确定义了,为什么会变得不确定?
任何反馈或帮助将不胜感激。
答案 0 :(得分:2)
如果Array#find
函数未“找到”任何内容-返回未定义。
显然,这就是为什么您收到错误消息:
dayList.find(day => Boolean(day.selected) === true).times
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-> undefined
我建议您确保没有定义times
:
const getTimes = (dayList) => {
const time = dayList.find(day => Boolean(day.selected) === true);
if (time && Array.isArray(time.times)) {
return time.times.filter(n => Boolean(n.available) === true);
}
};
注意:您还应该检查time.times
是否为数组,以在其上正确使用Array#filter
。
答案 1 :(得分:1)
错误并不表示times
未定义。就是说它无法读取times
对象的undefined
属性。如果您有一个名为entry
的变量,那么您说entry.times
仅在将entry
定义为一个对象时才有效。但是,如果执行此操作,则会收到此错误:
let entry;
entry.times = []; // <-- fails because entry is undefined
看看您的代码,您有:
dayList.find(day => Boolean(day.selected) === true).times.filter(time => Boolean(time.available) === true);
因此,我猜测.times
之前的部分被评估为undefined
。我的意思是
dayList.find(day => Boolean(day.selected) === true) === undefined
您没有提供足够的信息来知道dayList
数组中的对象种类,但是如果dayList.find()
找不到任何内容,它将返回undefined
,然后您尝试访问undefined.times
会导致您看到错误。
我建议将此行分成几个单独的部分,以便您只能尝试访问已知存在的数据。例如:
const item = dayList.find(day => Boolean(day.selected) === true);
if (item) {
const times = item.times;
// do something with the times array...
}
else // report that no day could be found, or whatever is appropriate
答案 2 :(得分:1)
当您忘记声明变量时,例如在严格模式下发生的ReferenceError可能会令人困惑。 console.log(iDontExist)
。
但是,Property accessor(obj.property
中的点运算符)在对象的属性不存在时返回值undefined
,例如
const obj = {property: 1}
console.log(obj.iDontExist) // undefined
问题是undefined
本身的行为不同,当您尝试访问undefined.property
时会抛出错误,例如:
const obj = {property: 1}
console.log(obj.iDontExist.whatever) // ???
该错误在不同的JS实现中有所不同,例如在Firefox中:
TypeError: obj.iDontExist is undefined
在Chrome和Node.js中:
Uncaught TypeError: Cannot read property 'whatever' of undefined
在边缘:
Unable to get property 'whatever' of undefined or null reference
答案 3 :(得分:0)
> let x = dayList.find(day => Boolean(day.selected) === true).times.filter(time => Boolean(time.available) === true);
在这里左右链接属性。如果您说哪个属性给您带来麻烦,而不是说“ X”,则回答起来会容易得多。
.find()方法可能在某时找不到任何东西,当您访问.times时,它说.find()的结果是不确定的,或者是.times.filter()。
每次使用.find()时,都应将结果存储在变量中,并在尝试执行任何操作之前检查其是否具有值。