带&&amp ;?的返回功能

时间:2018-03-24 14:50:15

标签: javascript

我对命令模式教程

中的这个片段感到困惑

是什么意思

return carManager[name] && carManager[name].apply( carManager, [].slice.call(arguments, 1) );

另外我可以理解它是否是carManager.execute(“buyVehicle”),然后carManager [“buyVehicle”]可以调用该函数,但是carManager [buyVehicle“,”Ford Escort“,”453543“]怎么样? / p>

    (function(){

      var carManager = {

        // request information
        requestInfo: function( model, id ){
          return "The information for " + model + " with ID " + id + " is foobar";
        },

        // purchase the car
        buyVehicle: function( model, id ){
          return "You have successfully purchased Item " + id + ", a " + model;
        },

        // arrange a viewing
        arrangeViewing: function( model, id ){
          return "You have successfully booked a viewing of " + model + " ( " + id + " ) ";
        }

      };

    })();

    carManager.execute = function ( name ) {
        return carManager[name] && carManager[name].apply( carManager, [].slice.call(arguments, 1) );
    };

    carManager.execute( "buyVehicle", "Ford Escort", "453543" );

4 个答案:

答案 0 :(得分:1)

简化示例:

return f && f();

&&运算符在JavaScript中的工作方式是,如果左操作数是伪操作,则生成左操作数,否则生成右操作数。它也会短路,这意味着如果左操作数是假的,则根本不评估右操作数。在此,如果f是真实的(例如函数)并返回其返回值,则会调用f,如果f是假的,则返回f(例如{ {1}})。

换句话说,这是一种简短的写作方式:

undefined

具有以下实际含义:

return f ? f() : f;

if (f) { return f(); } 是一个具有函数属性的对象时,这反过来意味着只有当它存在并传递其返回值时才调用名为carManager的方法。

  

另外我可以理解它是否是carManager.execute(“buyVehicle”),然后carManager [“buyVehicle”]可以调用该函数,但是carManager [buyVehicle“,”Ford Escort“,”453543“]怎么样? / p>

这个问题有点难以解释,但

name

可能会回答它。

答案 1 :(得分:1)

return carManager[name] && carManager[name].apply( carManager, [].slice.call(arguments, 1) );

如果carManager [name]中存在carManager [name]功能,则执行该功能。

carManager[name].apply( carManager, [].slice.call(arguments, 1) );

.apply()用于在另一个或同一个对象上调用某个函数。它将对象作为第一个参数,将参数作为第二个参数。只要函数doent导致对象的现有属性发生任何更改,您就可以将任何对象作为第一个参数提供。例如,这是相同的。

carManager.execute = function ( name ) {
  return carManager[name] && carManager[name].apply( {}, [].slice.call(arguments, 1) );
};

代码:

[].slice.call(arguments, 1);

.call()apply()完全相同。它接受Array对象的slice函数并将其调用到其他对象上,这次是在arguments(object)数组上。 slice返回数组的一部分。在这种情况下,它只是避免了arguments数组中的第一个元素。即它使阵列没有第一个元素

carManager.execute( "buyVehicle", "Ford Escort", "453543" );

它调用invoke函数。第一个参数提供了函数的关键。第二个和第三个参数提供必须传递给carManager对象中存在的方法的实际数据。这就是为什么参数数组被切片的原因。

答案 2 :(得分:0)

它可以防止.bash_profile是一个假的*值(很可能根本没有填充)。代码假设属性完全缺失或具有假值,或者具有函数。

如果carManager[name]是假的,则返回该假值。

如果carManager[name]不是假的(真实的),代码假定它是一个函数并调用它(通过carManager[name])并返回它返回的任何内容。

*“falsy”= apply如果强制转换为布尔值。虚假值为false0NaN""null,当然还有undefined。所有其他值都是 truthy

答案 3 :(得分:0)

问题1

当你这样做时:

return carManager[name] && carManager[name].func();

您说:检查carManager[name]untruthy。如果是,则返回false。否则,执行func()并返回其结果。

问题2

arguments object可用于获取传递给函数的所有参数,即使它们不存在于函数声明中。

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