在if语句中获取/设置变量

时间:2017-06-09 03:37:01

标签: javascript

我有一个小例子来定义和分配给> 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:无法读取未定义的属性“长度”

5 个答案:

答案 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);
}