用于检查未定义值的优雅Javascript代码

时间:2014-11-13 17:37:35

标签: javascript node.js coffeescript

所以我有一个回调函数,它提供了一个json对象:

function(object){
    var data=object.packet.link.ip.tcp.data;
    console.log(data.toString());
}

我遇到的问题是任何packet / link / ip / tcp / data都可能是" undefined" - 我的node.js程序每遇到一个未定义的变量就会失败。

我尝试了"数据"的声明。在try / catch中,但是我一直在" undefined"错误 - 我的猜测是我需要放置object / object.packet / object.packet.link / object.packet.link.ip / etc.在try / catch。

所以,我找到了一些优雅的咖啡因:

if object?.packet?.link?.ip?.tcp?.data? then doStuff()

编译为:

var _ref, _ref1, _ref2, _ref3;

if ((typeof object !== "undefined" && object !== null ? (_ref = object.packet) != null ? (_ref1 = _ref.link) != null ? (_ref2 = _ref1.ip) != null ? (_ref3 = _ref2.tcp) != null ? _ref3.data : void 0 : void 0 : void 0 : void 0 : void 0) != null) {
       //doStuff:
       var data = object.packet.link.ip.tcp.data;
       console.log(data.toString());
}

呸!

现在它完美无缺,但我只是想知道在纯Javascript中是否有更优雅(可读)的方法吗?

3 个答案:

答案 0 :(得分:5)

你可以做到

["packet", "link", "ip", "tcp", "data"]
  .reduce(function (m, i) { if (m) return m[i]; }, object);

您可以将reduce移动到一个函数中并拥有get(object, "packet", "link", "ip", "tcp", "data")。虽然简单的&&解决方案可能更明智,但它可能很漂亮。

答案 1 :(得分:3)

如果它足以检查您是否正在处理 truthy 值,您可能会像

一样
var data = object && object.packet && object.packet.link && object.packet.link.ip; // etc.

仍然没有美丽,但最有可能是你能做的最好的。当然,你总是可以选择介绍好的' try..catch条款。

try {
    var data = object.packet.link.ip.tcp.data;
} catch( ex ) { }

任何事情"更好"而不是优雅" (无论谁定义)都需要一个自定义编写的函数,它逐步遍历对象属性,检查是否存在。

答案 2 :(得分:1)

function A(object)
{
 var data = object?object.packet?object.packet.link?object.packet.link.ip?object.packet.link.ip.tcp?  object.packet.link.ip.tcp.data:null:null:null:null:null;
 console.log(data);
}
  • 注意

    如果data为null,则不能在null上调用toString,因为null(以及undefined)是唯一没有对象包装器且后来没有toString()函数的两个基元。