我有一个小例子来定义和分配给> getSymbols('AAPL', src = 'yahoo', from = '2016-01-01', auto.assign = T)
[1] "AAPL"
> class(AAPL)
[1] "xts" "zoo"
> periodReturn(AAPL, by = years, from = '2003-01-01')
monthly.returns
2016-01-29 -5.135956e-02
2016-02-29 -6.677563e-03
2016-03-31 1.272106e-01
2016-04-29 -1.399211e-01
2016-05-31 6.528700e-02
2016-06-30 -4.265975e-02
2016-07-29 9.006277e-02
2016-08-31 1.813645e-02
2016-09-30 6.550429e-02
2016-10-31 4.334348e-03
2016-11-30 -2.659859e-02
2016-12-30 4.795515e-02
2017-01-31 4.774649e-02
2017-02-28 1.288835e-01
2017-03-31 4.868968e-02
2017-04-28 -6.967841e-05
2017-05-31 6.341804e-02
2017-06-08 1.459813e-02
数组。
arr
然后,我想获得数组的var arr;
if (arr = [1]) { // arr is an array here, it contains 1 element
console.log(arr.length); // 1
}
length
未捕获的TypeError:无法读取未定义的属性“长度”
答案 0 :(得分:3)
var arr;
// arr is an array here, but why cannot I assign to length property?
if (arr = [1] && arr.length) {
console.log(arr.length);
}
由于operator precedence,失败。 &&
的优先级高于赋值=
,因此首先进行评估。
[1] && arr.length
表达式由数组文字和arr.length
表达式组成。 arr.length
失败,因为此时arr
未定义。
参考文献:
答案 1 :(得分:2)
你的if应该是这样if ((arr = [1]) && arr.length)
您需要为数组赋值部分赋予高优先级。首先分配然后比较。
优先权只不过是。哪个部分代码首先根据运算符优先级执行,因此代码&&
的优先级高于赋值运算符=
,因此虽然未分配arr,但未定义
var arr;
// arr is an array here, but why cannot I assign to length property?
if ((arr = [1]) && arr.length) {
console.log(arr.length);
}
答案 2 :(得分:1)
在这一行:
if (arr = [1] && arr.length)
您已将阵列分配给arr,同时尝试检查长度。由于JS目前还不知道arr
包含数组,因此在尝试访问length属性时会抛出异常。
为了进行比较,这不会引发异常:
if (arr = [1]) {
if (arr.length) {
console.log(arr.length);
}
}
因为在达到第二个条件检查时,JS已经知道arr
是一个数组。
答案 3 :(得分:1)
JS将您的if
语句解析为
if (arr = ([1] && arr.length)) {
原因是&&
比赋值运算符绑定得更紧密。因此,JS正在尝试在尚未定义[1] && arr.length
的时间点评估arr
。
你需要写
if ((arr = [1]) && arr.length) {
答案 4 :(得分:0)
在IF中分配变量是代码气味。
var arr;
var x = 1;
if (arr = [1] && arr.length && x == 1) {
console.log(arr.length);
}
上面的if条件如何?大多数人可能不知道您正在为arr
分配价值,但认为您要检查arr == [1]
。
一个更好的例子:
var arr = [1];
if (arr.length > 0) {
console.log(arr.length);
}