这个 JavaScript 语法是什么?

问题描述 投票:0回答:5

我是 JavaScript 新手。以下代码来自一些生产代码库。 regDefinition 以 JSON 形式传递。但我不太确定方法体中的语法。 尤其是

||
[]
部分。

function getCookieValue(regDefinition) {
    return (document.cookie.match(regDefiniation.regEx) || [])[regDefiniation.index] || null;
}
javascript operators
5个回答
31
投票

看起来有人做了很多努力让这篇文章变得很难阅读。

如果我理解正确的话,它会做这样的事情:

  • 调用 match 方法。
  • 它返回一个匹配数组,或者什么也不返回(null,未定义?)。如果它不返回任何内容,则默认为空数组。
  • 在数组中,获取索引为“regDefiniation.index”的元素。
  • 如果该项目不存在(可以是匹配的情况,并且始终是空默认数组的情况),则返回 null。

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 || [])
的结果是
[]
,你现在可以尝试安全地读取它的属性


7
投票

document.cookie
是一个字符串,包含与当前页面关联的 cookie。
document.cookie.match(regDefiniation.regEx)
函数调用正在使用正则表达式搜索该字符串,以获得匹配的子字符串列表。

如果 cookie 字符串中没有任何内容与正则表达式匹配,则

match
调用将返回 null,因此
|| []
可以用空数组替换该 null。 这确保表达式
(document.cookie.match(regDefiniation.regEx) || [])
始终返回一个数组。

[regDefiniation.index]
只是从该数组中检索一个元素。 但是,如果数组中不存在请求的索引 - 例如,如果由于正则表达式与 cookie 字符串中的任何内容都不匹配而导致数组为空 - 结果将是
undefined
,因此
|| null
会更改结果在这种情况下,
null


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.

任何其他都会返回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


3
投票

步骤如下:

document.cookie
返回一个字符串,并且
match
方法(内置)应用于该字符串。如果参数在
regDefiniation.regEx
中找到,则执行此操作,否则返回
[]
(即数组) 之后,无论上述步骤返回什么,都使用
[regDefiniation.index]
对其应用索引。

`如果以上步骤全部失败,则返回null。

© www.soinside.com 2019 - 2024. All rights reserved.