可能未定义的变量

时间:2018-10-14 17:30:53

标签: javascript lodash ramda.js

我正在从可能未定义的全局变量中获取键。密钥也可能不存在:

import { get } from 'lodash/fp';

const probablyGlobalFoo = typeof globalFoo === 'undefined' ? void 0 : globalFoo;

const baz = get('baz', probablyGlobalFoo) || get('bar.baz', probablyGlobalFoo) || 'baz';

typeof globalFoo === 'undefined'检查是JavaScript惯用的,但是笨拙且冗长。这种情况在我的代码库中发生过两次,但不足以向我的utils库引入另一个辅助函数。我宁愿只提供正确处理的getter函数,例如:

getFromAGetterAndCatchIfNotDefined('bar.baz', () => globalFoo);

是否可以使用我缺少的Lodash FP或Ramda API来处理这种情况?

1 个答案:

答案 0 :(得分:2)

如果全局变量是在window上定义的(对于全局var),则可以检查window.globalFoo(或在nodejs中为global.globalFoo)。如果不是,则必须使用typeof检查。

要检查对象中不存在的属性或未定义的变量,可以使用lodash / fp的getOr()

const { getOr } = _;

console.log(getOr('baz', 'bar.baz', window.globalFoo));

const anotherValue = { bar: { baz: 5 } }

console.log(getOr('baz', 'bar.baz', anotherValue));
<script src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)"></script>

或者lodash的get()

const { get } = _;

console.log(get(window.globalFoo, 'bar.baz', 'baz'));

const anotherValue = { bar: { baz: 5 } }

console.log(get(anotherValue, 'bar.baz', 'baz'));
<script src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js)"></script>

或者ramda的pathOr()

const { pathOr } = R;

console.log(pathOr('baz', ['bar','baz'], window.globalFoo));

const anotherValue = { bar: { baz: 5 } }

console.log(pathOr('baz', ['bar','baz'], anotherValue));
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>