如何在JavaScript中创建CoffeeScript样式存在操作符?

fif*_*nce 9 javascript coffeescript

CoffeeScript变成user?.id

if (typeof user !== "undefined" && user !== null) {
   user.id;
}
Run Code Online (Sandbox Code Playgroud)

是否可以创建一个exists类似的JavaScript函数?即

exists(user).id
Run Code Online (Sandbox Code Playgroud)

会导致任何一个user.idnull

如果一个函数接受另一个参数会更容易exists(user, 'id'),但是看起来不那么好.

mu *_*ort 5

不,你不能产生这样的功能.问题是这个:

any_function(undeclared_variable)
Run Code Online (Sandbox Code Playgroud)

如果undeclared_variable没有在任何地方声明,将产生ReferenceError .例如,如果您运行此独立代码:

function f() { }
f(pancakes);
Run Code Online (Sandbox Code Playgroud)

你会得到一个ReferenceError因为pancakes没有在任何地方声明.演示:http://jsfiddle.net/ambiguous/wSZaL/

但是,typeof运算符可以用于尚未声明的内容,因此:

console.log(typeof pancakes);
Run Code Online (Sandbox Code Playgroud)

只需undefined在控制台中登录即可.演示:http://jsfiddle.net/ambiguous/et2Nv/

如果您不介意可能的ReferenceErrors,那么您已经在问题中拥有了必要的功能:

function exists(obj, key) {
    if (typeof obj !== "undefined" && obj !== null)
        return obj[key];
    return null; // Maybe you'd want undefined instead
}
Run Code Online (Sandbox Code Playgroud)

或者,因为您不需要typeof在此处使用未声明的变量,您可以将其简化为:

function exists(obj, key) {
    if(obj != null)
      return obj[key];
    return null;
}
Run Code Online (Sandbox Code Playgroud)

请注意,更改为!=,undefined == null即使undefined === null不是,也是如此.