我是JavaScript新手。以下代码来自某些生产代码库。
regDefinition 以JSON格式传递。但我不太确定方法体中的语法。
特别是||
和[]
部分。
function getCookieValue(regDefinition) {
return (document.cookie.match(regDefiniation.regEx) || [])[regDefiniation.index] || null;
}
答案 0 :(得分:31)
看起来有人花了很多精力让这很难读。
如果我解释正确,它会做这样的事情:
答案 1 :(得分:25)
这里有一些好的答案,但似乎没有人真正解释你为什么要这样做
(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 || [])
的结果是[]
,您现在可以尝试安全地读取它的属性
答案 2 :(得分:7)
document.cookie
是一个字符串,其中包含与当前页面关联的Cookie。 document.cookie.match(regDefiniation.regEx)
函数调用正在使用正则表达式搜索此字符串,以获取匹配的子字符串列表。
如果cookie字符串中没有任何内容与正则表达式匹配,则match
调用将返回null,因此|| []
将使用空数组替换该null。这可以确保表达式(document.cookie.match(regDefiniation.regEx) || [])
始终返回一个数组。
[regDefiniation.index]
只是从该数组中检索一个元素。但是如果数组中不存在请求的索引 - 例如,如果数组为空,因为正则表达式与cookie字符串中的任何内容都不匹配 - 结果将是undefined
,那么{{1}在这种情况下,将结果更改为|| null
。
答案 3 :(得分:6)
所以要理解这一点,让我们深入研究这个例子
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.
其他任何东西都会返回真实
因此,要了解您的代码,请让它破解
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
答案 4 :(得分:3)
这是一步一步的步骤:
document.cookie
返回一个字符串,并将match
方法(内置)应用于该字符串。如果参数在regDefiniation.regEx
找到,那么执行此操作返回[]
(即数组)
在此之后,无论上述步骤返回什么,请将索引应用于[regDefiniation.index]
。
`如果上述所有步骤都失败,则返回null。