有人能解释一下这个JavaScript代码吗



我是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的实际作用(返回一个带有复杂逻辑NOT的and对象?在对象内部,一个属性被分配了一个双NOT?(。顺便问一下,这是很好的编程实践/写作吗?

感谢所有

如前所述,代码首先进行了缩小,然后再次进行了预定型。

因此,仅从"em"就可以理解代码的内涵;说"getCookie方法的字符串值。从那里,通过遵循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表示来验证表达式,但返回实际值。。。例如(0 || 1) === 1(2 || '') === 2。。。而(2 && '') === ''(2 && 3) === 3('' && 3) === ''

。。。其对于CCD_ 19读取";如果值中的任一个存在(是true(">

对于CCD_ 21";如果其中一个值是真的">

由于对于以下恢复的示例代码,仍然不清楚e来自何处以及它的含义/表示,因此该示例假设了一个自定义cookiestorage,它被视为函数的唯一参数。。。

/*
* @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;
}

可以将上面恢复的函数重写为更具表达性/更直接的函数,但当然,返回值的计算过程并不完全遵循原始函数,因此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;
}

如果满足此条件!(!t && !a),则返回{ analytics: "yes" === t, ads: "yes" === a, visitorHasChosen: !!r }

条件:

如果ta中的一个具有错误值,或者这两个都具有虚假值,则返回该object

对象:

键的值是布尔类型,因为比较(==(或!!所以它检查t的值是否等于"是",那么analytics的值必须是true,否则是false,这也发生在ads

visitorHasChosen中的!!r等同于Boolean(r)

最新更新