function sum(a1,a2)
{
arguments = [5,6];
var x = a1+a2;
alert(x);
}
sum();
参数不是以数组存储在arguments对象中吗?
为甚么弹出NaN?
function sum(a1,a2)
{
arguments = [5,6];
var x = a1+a2;
alert(x);
}
sum();
参数不是以数组存储在arguments对象中吗?
为甚么弹出NaN?
因为比如
var a1 = undefined, a2 = undefined;
var arguments = [a1, a2];
arguments = [3, 4];
这个时候a1,a2仍然是undefined,undefined + undefined == NaN
首先要注意的是:
javascript函数体内,arguments像数组(并不是真的数组,是一个Arguments对象,再次强调)一样,有length属性,可以代表传给函数的参数的个数。
javascript中Arguments对象是函数的实际参数,arguments对象的长度是由实参个数而不是形参个数决定的。形参是函数内部重新开辟内存空间存储的变量,但是其与arguments对象内存空间并不重叠。
另外:
在es5规范下的非严格模式下,你的代码是可行的。即可以这样修改。
es5规范的严格模式下,效果等同你现在的效果。
但自es6之后,非严格模式下效果也如同你现在的效果一样,即arguments
和参数符号分别存放。
而es6的严格模式下,修改arguments会报错。
Uncaught SyntaxError: Unexpected eval or arguments in strict mode
所以,熟读es规范很有必要啊。
8 回答4.8k 阅读✓ 已解决
6 回答3.5k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
5 回答6.4k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
是,你是重新赋值了arguments,但是a1和a2的值不会从arguments自动赋值过去的,a1和a2的值获取还是在你调用sum()的时候获取的,你没传参,自然是NaN,所以这里,arguments确实是有数据的,5和6,你赋值的,a1和a2是没有数据的