我是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
方法的字符串值。从那里,通过遵循t
、a
和r
的缩短变量名,可以得出自己有意义的变量名,并用后者取代前者。
然后,正如已经指出的,我们确实将名称替换和DeMorgan定律应用于以下表达式。。。
!(!t && !a)
!(!analyticsValue && !advertisementValue)
- 。。。否定将一个值转换为真正的布尔值,与该值自己的truthy/falsy表示相反。。。例如
!0 === true
、!'' === true
、!{} === false
- 。。。否定将一个值转换为真正的布尔值,与该值自己的truthy/falsy表示相反。。。例如
(!!analyticsValue || !!advertisementValue)
- 。。。双重否定将一个值转换为该值自身truthy/falsy表示的真布尔值。。。例如
!!0 === false
、!!'' === false
、!!{} === true
- 。。。双重否定将一个值转换为该值自身truthy/falsy表示的真布尔值。。。例如
(analyticsValue || advertisementValue)
- 。。。两个值上的布尔运算符通过两个值的truthy/falsy表示来验证表达式,但返回实际值。。。例如
(0 || 1) === 1
、(2 || '') === 2
。。。而(2 && '') === ''
、(2 && 3) === 3
、('' && 3) === ''
- 。。。两个值上的布尔运算符通过两个值的truthy/falsy表示来验证表达式,但返回实际值。。。例如
。。。其对于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 }
条件:
如果t
或a
中的一个具有错误值,或者这两个都具有虚假值,则返回该object
对象:
键的值是布尔类型,因为比较(==(或!!
所以它检查t
的值是否等于"是",那么analytics
的值必须是true
,否则是false
,这也发生在ads
中
visitorHasChosen
中的!!r
等同于Boolean(r)