我是 JavaScript 新手。以下代码来自一些生产代码库。 regDefinition 以 JSON 形式传递。但我不太确定方法体中的语法。 尤其是
||
和[]
部分。
function getCookieValue(regDefinition) {
return (document.cookie.match(regDefiniation.regEx) || [])[regDefiniation.index] || null;
}
看起来有人做了很多努力让这篇文章变得很难阅读。
如果我理解正确的话,它会做这样的事情:
这里有一些很好的答案,但似乎没有人真正解释你为什么这样做
(foo || [])[bar]; // or similarly (foo || {})[bar]
而不仅仅是
foo[bar]
考虑 RegExp 失败的情况,
var foo = null, bar = 0;
现在,如果没有任何特殊的情况,你会抛出一个错误,并且代码将停止
foo[bar]; // TypeError: Cannot read property '0' of null
但是括号中的或版本会有所不同
(foo || [])[bar]; // undefined (note, no error)
这是因为
(null || [])
的结果是 []
,你现在可以尝试安全地读取它的属性
document.cookie
是一个字符串,包含与当前页面关联的 cookie。 document.cookie.match(regDefiniation.regEx)
函数调用正在使用正则表达式搜索该字符串,以获得匹配的子字符串列表。
如果 cookie 字符串中没有任何内容与正则表达式匹配,则
match
调用将返回 null,因此 || []
可以用空数组替换该 null。 这确保表达式 (document.cookie.match(regDefiniation.regEx) || [])
始终返回一个数组。
[regDefiniation.index]
只是从该数组中检索一个元素。 但是,如果数组中不存在请求的索引 - 例如,如果由于正则表达式与 cookie 字符串中的任何内容都不匹配而导致数组为空 - 结果将是 undefined
,因此 || null
会更改结果在这种情况下,null
。
为了理解这一点,让我们深入研究这个例子
var myValue = someValue || otherValue
所以这里如果 someValue 可以转换为 true 那么 myValue 将包含 someValue 否则它将包含 otherValue
// Values that evaluate to false:
false
"" // An empty string.
NaN // JavaScript's "not-a-number" variable.
null
undefined // Be careful -- undefined can be redefined!
0 // The number zero.
任何其他都会返回true
为了理解你的代码,让我们打破它
var myCookie = document.cookie.match(regDefiniation.regEx) || []
所以这里如果 document.cookie.match(regDefiniation.regEx) 返回 true 则返回它,否则返回空数组。 其他部分也一样。有关 JavaScript 中逻辑运算符的更多信息,请点击以下链接
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators
步骤如下:
document.cookie
返回一个字符串,并且 match
方法(内置)应用于该字符串。如果参数在 regDefiniation.regEx
中找到,则执行此操作,否则返回 []
(即数组)
之后,无论上述步骤返回什么,都使用 [regDefiniation.index]
对其应用索引。
`如果以上步骤全部失败,则返回null。