Javascript 带&&;?
我对命令模式教程中的这段代码感到困惑 这是什么意思Javascript 带&&;?,javascript,Javascript,我对命令模式教程中的这段代码感到困惑 这是什么意思 返回carManager[name]&&carManager[name].apply(carManager,[].slice.call(arguments,1)) 我也能理解如果是carManager.execute(“buyVehicle”),那么carManager[“buyVehicle”]可以调用该函数,但是carManager[buyVehicle”、“Ford Escort”、“453543”]呢 这是为了防止carManager[
返回carManager[name]&&carManager[name].apply(carManager,[].slice.call(arguments,1))代码>
我也能理解如果是carManager.execute(“buyVehicle”),那么carManager[“buyVehicle”]可以调用该函数,但是carManager[buyVehicle”、“Ford Escort”、“453543”]呢
这是为了防止carManager[name]
是一个falsy*值(很可能根本没有填写)。代码假定该属性完全缺失,或者有一个falsy值,或者其中有一个函数
如果carManager[name]
为falsy,则返回该falsy值
如果carManager[name]
不是falsy(truthy),则代码假定它是一个函数并调用它(通过apply
)并返回它返回的任何内容
*如果强制为布尔值,“falsy”=false
。falsy值是0
,NaN
,,null
,未定义的
,当然还有false
。所有其他值都是真实的。这是为了防止carManager[name]
是falsy*值的可能性(很可能根本没有填写)。代码假定该属性要么完全丢失,要么具有虚假值,或者其中包含函数
如果carManager[name]
为falsy,则返回该falsy值
如果carManager[name]
不是falsy(truthy),则代码假定它是一个函数并调用它(通过apply
)并返回它返回的任何内容
*如果强制为布尔值,“falsy”=false
。falsy值为0
,NaN
,,null
,undefined
,当然还有false
。所有其他值都是真实的。问题1
当您这样做时:
return carManager[name] && carManager[name].func();
您的意思是:检查carManager[name]
是否为。如果为,则返回false。否则,执行func()
并返回其结果
问题2
可以使用获取传递给函数的所有参数,即使它们不在函数声明中
function foo(baz) {
console.log(arguments[0]); // outputs baz: "me"
// same of: console.log(baz);
console.log(arguments[1]); // outputs "you"
console.log(arguments[2]); // outputs "them"
}
foo('me', 'you', 'them'); // call the function, pass 3 arguments
问题1
当您这样做时:
return carManager[name] && carManager[name].func();
您的意思是:检查carManager[name]
是否为。如果为,则返回false。否则,执行func()
并返回其结果
问题2
可以使用获取传递给函数的所有参数,即使它们不在函数声明中
function foo(baz) {
console.log(arguments[0]); // outputs baz: "me"
// same of: console.log(baz);
console.log(arguments[1]); // outputs "you"
console.log(arguments[2]); // outputs "them"
}
foo('me', 'you', 'them'); // call the function, pass 3 arguments
简化示例:
return f && f();
&
运算符在JavaScript中的工作方式是,如果左操作数为falsy,则生成左操作数;如果右操作数为falsy,则生成右操作数。它还短路,这意味着如果左操作数为falsy,则根本不计算右操作数。在这里,如果f
为truty,则具有调用f
的效果(例如,函数)并返回其返回值,或者如果f
是错误的(例如未定义的
),则返回f
)
换句话说,这是一种简短的写作方式:
return f ? f() : f;
具有以下实际含义:
if (f) {
return f();
}
当carManager
是一个具有函数属性的对象时,这又意味着只在名为name
的方法存在时调用该方法并传递其返回值
我也能理解如果是carManager.execute(“buyVehicle”),那么carManager[“buyVehicle”]可以调用该函数,但是carManager[buyVehicle”、“Ford Escort”、“453543”]呢
这个问题有点难以解释,但是
carManager.execute("buyVehicle", "Ford Escort", "453543")
可能是答案。简化示例:
return f && f();
return carManager[name] && carManager[name].apply( carManager, [].slice.call(arguments, 1) );
&
运算符在JavaScript中的工作方式是,如果左操作数为falsy,则生成左操作数;如果右操作数为falsy,则生成右操作数。它还短路,这意味着如果左操作数为falsy,则根本不计算右操作数。在这里,如果f
为truty,则具有调用f
的效果(例如,函数)并返回其返回值,或者如果f
是错误的(例如未定义的
),则返回f
)
换句话说,这是一种简短的写作方式:
return f ? f() : f;
具有以下实际含义:
if (f) {
return f();
}
当carManager
是一个具有函数属性的对象时,这又意味着只在名为name
的方法存在时调用该方法并传递其返回值
我也能理解如果是carManager.execute(“buyVehicle”),那么carManager[“buyVehicle”]可以调用该函数,但是carManager[buyVehicle”、“Ford Escort”、“453543”]呢
这个问题有点难以解释,但是
carManager.execute("buyVehicle", "Ford Escort", "453543")
可能会回答这个问题
return carManager[name] && carManager[name].apply( carManager, [].slice.call(arguments, 1) );
如果carManager中存在函数carManager[name],则执行该函数
carManager[name].apply( carManager, [].slice.call(arguments, 1) );
.apply()
用于调用其他对象或同一对象上的某个函数。它将对象作为第一个参数,参数作为第二个参数。只要函数不会对对象的现有属性造成任何更改,您就可以将任何对象作为第一个参数提供。例如,这同样适用
carManager.execute = function ( name ) {
return carManager[name] && carManager[name].apply( {}, [].slice.call(arguments, 1) );
};
代码:
.call()
的功能与apply()
的功能非常相似。它获取数组对象的切片函数,并将其调用到其他对象上,这次调用的是参数(对象)数组。slice
返回数组的一部分。在这种情况下,它只是避免参数数组中的第一个元素。即它使数组中没有第一个元素
carManager.execute( "buyVehicle", "Ford Escort", "453543" );
它调用invoke函数。第一个参数提供函数的键。第二个和第三个参数提供必须传递到carManager对象中存在的方法的实际数据。这就是参数数组被切片的原因
如果carManager中存在函数carManager[name],则执行该函数
carManager[name].apply( carManager, [].slice.call(arguments, 1) );
.apply()
用于在其他对象或同一对象上调用特定函数