有人可以解释这个 JavaScript 代码吗?

Can someone explain this JavaScript code please?

我是 JavaScript 开发的新手,如果有人可以帮助向我解释这段代码,我将不胜感激。

m = function () {
 let t = e.getCookie("cli-analytics"),
     a = e.getCookie("cli-advertisement"),
     r = e.getCookie("CLI");
 return !(!t && !a) && { analytics: "yes" === t, ads: "yes" === a, visitorHasChosen: !!r };
}

我可以理解对变量 m 的函数赋值和 cookie 的读取,但我无法理解 return 的实际作用(return用复杂的逻辑 NOT 对一个对象进行 AND 运算?在对象内部,一个 属性 被分配了一个双 NOT?)。 顺便问一下这个编程好吗practice/writing?

感谢大家

如果这个条件!(!t && !a)满足,return{ analytics: "yes" === t, ads: "yes" === a, visitorHasChosen: !!r }

条件:

如果 t a 之一具有虚假值或两者均具有虚假值,return 即 object

对象:

keys的值是boolean类型,因为比较(===)或!! 所以它检查 t 的值是否等于 'yes' 那么 analytics 的值必须是 true 否则 false,它也在 ads 中发生

!!rvisitorHasChosen 等于 Boolean(r)

如前所述,代码首先被缩小然后再次漂亮化。

因此,仅从getCookie方法的"speaking"字符串值就可以理解代码的含义。从那里并遵循 tar 的缩短变量名称,可以想出自己有意义的变量名称并将前者替换为后者。

然后,正如已经指出的那样,确实将名称替换和 DeMorgan 定律 应用于以下表达式 ...

!(!t && !a)
  1. !(!analyticsValue && !advertisementValue)

    • ...否定将一个值转换为真布尔值,反对该值自己的 truthy/falsy 表示...例如!0 === true, !'' === true, !{} === false.
  2. (!!analyticsValue || !!advertisementValue)

    • ...双重否定将值转换为值自身 truthy/falsy 表示的真布尔值...例如!!0 === false, !!'' === false, !!{} === true.
  3. (analyticsValue || advertisementValue)

    • ... 两个值的布尔运算符通过两个值的 truthy/falsy 表示来验证表达式,但 return 是真实值...例如(0 || 1) === 1, (2 || '') === 2 ... 但是 (2 && '') === '', (2 && 3) === 3, ('' && 3) === ''.

... 对于 2) 读取 ... "如果存在任何一个值(是 true)"

... 并且 3) ... "如果其中一个值是真实的".

由于以下恢复的示例代码仍然不清楚 e 的来源和内容 means/represents,该示例假定一个自定义 cookie storage 被视为函数的唯一参数...

/*
 * @returns {Object|false}
 *  either returns an object which features cookie values
 *  or returns the `false` boolean value.
 */
function getCliCookieValue(storage) {

  const analyticsValue = storage.getCookie('cli-analytics');
  const advertisementValue = storage.getCookie('cli-advertisement');

  // instead of ...
  return (!!analyticsValue || !!advertisementValue) && {

    analytics: 'yes' === analyticsValue,
    ads: 'yes' === advertisementValue,
    visitorHasChosen: !!storage.getCookie('CLI'),
  };

  // // ... one might consider ...
  // /*
  //  * @returns {Object|null}
  //  *  either returns an object which features cookie values
  //  *  or returns the `null` value.
  //  */
  // return (!!analyticsValue || !!advertisementValue) ? {
  // 
  //   analytics: 'yes' === analyticsValue,
  //   ads: 'yes' === advertisementValue,
  //   visitorHasChosen: !!storage.getCookie('CLI'),
  // 
  // } : null;
}

可以将上面恢复的函数重写为更具表现力/更直接的东西,但导致 return 值的计算过程不完全遵循原始函数,因此 return 的值 falsy 与原始实现相比,中间值可能有所不同。

/*
 * @returns {Object|false}
 *  either returns an object which features cookie values
 *  or returns the `false` boolean value.
 */
function getCliCookieValue(storage) {

  const isAnalytics = ('yes' === storage.getCookie('cli-analytics'));
  const isAdvertisement = ('yes' === storage.getCookie('cli-advertisement'));

  // instead of ...
  return (isAnalytics || isAdvertisement) && {

    analytics: isAnalytics,
    ads: isAdvertisement,
    visitorHasChosen: !!storage.getCookie('CLI'),
  };

  // // ... one might consider ...
  // /*
  //  * @returns {Object|null}
  //  *  either returns an object which features cookie values
  //  *  or returns the `null` value.
  //  */
  // return (isAnalytics || isAdvertisement) ? {
  // 
  //   analytics: isAnalytics,
  //   ads: isAdvertisement,
  //   visitorHasChosen: !!storage.getCookie('CLI'),
  // 
  // } : null;
}