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()
用于在其他对象或同一对象上调用特定函数