有人可以解释这个 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
中发生
!!r
在 visitorHasChosen
等于 Boolean(r)
如前所述,代码首先被缩小然后再次漂亮化。
因此,仅从getCookie
方法的"speaking"字符串值就可以理解代码的含义。从那里并遵循 t
、a
和 r
的缩短变量名称,可以想出自己有意义的变量名称并将前者替换为后者。
然后,正如已经指出的那样,确实将名称替换和 DeMorgan 定律 应用于以下表达式 ...
!(!t && !a)
!(!analyticsValue && !advertisementValue)
- ...否定将一个值转换为真布尔值,反对该值自己的 truthy/falsy 表示...例如
!0 === true
, !'' === true
, !{} === false
.
(!!analyticsValue || !!advertisementValue)
- ...双重否定将值转换为值自身 truthy/falsy 表示的真布尔值...例如
!!0 === false
, !!'' === false
, !!{} === true
.
(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;
}
我是 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
中发生
!!r
在 visitorHasChosen
等于 Boolean(r)
如前所述,代码首先被缩小然后再次漂亮化。
因此,仅从getCookie
方法的"speaking"字符串值就可以理解代码的含义。从那里并遵循 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 表示来验证表达式,但 return 是真实值...例如
(0 || 1) === 1
,(2 || '') === 2
... 但是(2 && '') === ''
,(2 && 3) === 3
,('' && 3) === ''
.
- ... 两个值的布尔运算符通过两个值的 truthy/falsy 表示来验证表达式,但 return 是真实值...例如
... 对于 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;
}