我正在编写一个函数来检查参数是否为零,并且它似乎无法正常工作。注意:使用Chrome作为我的浏览器,但此代码应支持跨浏览器。
// check all arguments, and make sure they aren't zero
function zeroCheck(arg1, arg2) {
var i, argsLen = arguments.length;
for (i = 0; i <= argsLen; i += 1) {
if (arguments[i] === 0) {
// This is where it doesn't behave as I expected
arguments[i] = 1; // make arg1 = 1
}
}
console.log(arg1); // arg1 = 0
}
zeroCheck(0, 2);
我希望arg1
等于1
,但它仍然等于0
。
答案 0 :(得分:1)
虽然有些浏览器看起来像你想要的那样(Chrome和Firefox),但ECMAScript规范对我来说并不是很明显,它总是这样。这听起来像参数数组可能只是在非严格模式下对命名参数的引用,它特别指出两者在严格模式下应该没有相互连接(换句话说,你想要做的是具体的不应该在严格模式下工作。)
您可以在此jsFiddle http://jsfiddle.net/jfriend00/bG5xp/中看到Chrome似乎按照规范描述的那样实现了它。在非严格模式下arguments[0]
和arg1
之间存在联系,并且在严格模式下它们之间没有联系。仔细阅读规范并不是说javascript需要在非严格模式下在两者之间建立联系,但它确实让它听起来很可能。如果你想依赖它,并且你确定你从未需要你的代码在严格模式下工作,那么你必须测试一堆浏览器,看看你想要的行为是否得到广泛支持。
规范中也不清楚参数数组是否总是可以修改,但似乎更可能是因为它是用javascript对象(而不是实际数组)实现的。
修改参数数组的安全方法是先制作副本并修改副本。当然,这不会修改任何命名参数。如果您愿意,可以手动修改它们。
制作arguments数组副本的常用方法是:
var args = Array.prototype.slice.call(arguments, 0);
通常使用arguments
数组或命名参数,而不是两者都使用,因为任何命名参数也在arguments数组中的已知位置,因此您不必担心命名参数更改值修改参数数组时。
答案 1 :(得分:1)
试试这样。值arg1
的{{1}}评估为0
,因此您可以使用此shortcut boolean evaluation:
false/falsy
检查所有参数的通用函数(返回function zeroCheck(arg1,arg2) {
arg1 = arg1 || 1;
console.log(arg1); //=> 1
}
zeroCheck(0,2);
)
Array
答案 2 :(得分:1)
来自ECMA-262规范:
“对于非严格模式函数,数组索引(在15.4中定义)命名为参数对象的数据属性,其数值名称值小于相应函数对象的形式参数的数量,最初与其共享其值函数执行上下文中相应的参数绑定。这意味着更改属性会更改参数绑定的相应值,反之亦然。如果删除这个属性然后重新定义或者属性更改为对于严格模式函数,arguments对象的属性值只是传递给函数的参数的副本,并且属性值和形式参数值之间没有动态链接。“ < / p>
但是如果你阅读了如何设置arguments
对象的技术细节,我想你会发现它是基于调用它时实际传递给函数的参数数量,而不是有多少命名参数声明,所以使用arguments
和循环来检查每个命名参数的值可能不起作用,如果它们都没有传入。虽然在你的情况下,如果你专门测试0
它应该有效,因为未传递的参数将是undefined
而不是0
。
话虽如此,arguments
对象实际上的行为究竟取决于浏览器。 Chrome不符合规范。
答案 3 :(得分:0)
它对我有用,请查看this example fiddle
答案 4 :(得分:0)
@nnnnnn -
“对于非严格模式函数,数组索引(在15.4中定义)命名 数据名称值为的参数对象的数据属性 小于相应的形式参数的数量 函数对象最初与相应的共享它们的值 函数执行上下文中的参数绑定。这意味着 更改属性会更改参数的相应值 绑定,反之亦然。如果这样的话,这种对应就会破裂 删除属性,然后重新定义或更改属性 进入一个访问者财产。对于严格模式函数,其值为 arguments对象的属性只是参数的副本 传递给函数,之间没有动态联系 属性值和形式参数值。“
你的引文实际上回答了我原来的问题。我在下面发布的代码无法按预期工作的原因是因为我实际上使用的是“严格”模式。
// check all arguments, and make sure they aren't zero
function zeroCheck(arg1,arg2) {
var i, argsLen = arguments.length;
for (i = 0; i <= argsLen; i += 1) {
if (arguments[i] === 0) {
// This is where it doesn't behave as I expected
arguments[i] = 1; // make arg1 = 1
}
}
console.log(arg1); // arg1 = 0
}
zeroCheck(0,2);
它适用于xdazz,Jeroen Moons和jFriend00 - 因为它们没有包含严格: http://jsfiddle.net/nSJGV/(非严格) http://jsfiddle.net/HDjWx/(严格)