处理未定义对象的内联比三进制更聪明

A smarter inline than ternary for dealing with undefined objects

本文关键字:更聪明 未定义 对象 处理      更新时间:2023-09-26

这是一个问题,询问是否存在这样的技术

我正在寻找一种通常情况下执行内联语句的方法,该语句在项对象被定义时执行操作,否则什么都不做(so而不是(condition)?if:否则;这只是(条件)吗?if;)

(item)?[item.member='foo']:0;   //ReferenceError: item is not defined
var item={'member':'bar'};//item could be an object but it wasn't defined

我本以为除了"尝试捕获错误"之外还有其他方法

例如

在下面的片段中,可能有很多代码围绕着线条和许多事情。如果笔被定义为有时但不总是要绘图,有时不绘图,而是只围绕着计算,有没有一种巧妙的方法可以说只绘图。所以画布并不总是在使用

//calculations and code
if(drawing===true){
    var pen=document.getElementById('canvas');
    pen=pen.getContext("2d");
    //other canvas setup stuff
    }
//calculations and code
pen.moveTo(0,0);
pen.lineTo(10,10);

最后两行,如果JavaScript中有一些技巧来做一些类似(伪代码)的事情,那就太好了:

(pen) ? pen.lineTo(10,10);

这会引发意外;错误

如果对象未定义,是否存在除三进制之外的其他类型的内联以及返回的方法?

我知道有两个:

// Set a variable if not set
var x = x || 'hi';
// Do something if x is truthy
// Needs a scope, may not always be "this."
this.x && console.log(this.x);

因此,在您的示例中,如果pen是全局的,则可以执行window.pen && pen.lineTo(10, 10);

还有一行非常简单的if:

if (pen) pen.lineTo(10, 10);

从技术上讲,这不是任何形式的简写,它只是简短的。比较两行长度(您的伪代码与此方法):

(pen) ? pen.lineTo(10,10);
if (pen) pen.lineTo(10, 10);

更深入一点,我建议不要使用

if (pen) pen.moveTo(0, 0);
if (pen) pen.lineTo(10, 10);

因为是的,这是几句俏皮话,但你在加倍逻辑,重复自己,你会让人们思考"他为什么这么做?"。在这种情况下,我会保持简单:

if (pen) {
    pen.moveTo(0, 0);
    pen.lineTo(10, 10);
}

是的,但是,您需要以某种方式声明变量,例如:

// declare pen
var pen;
//calculations and code
if(drawing===true){
    pen=document.getElementById('canvas');
    pen=pen.getContext("2d");
    //other canvas setup stuff
    }
//calculations and code
pen && pen.moveTo(0,0);
pen && pen.lineTo(10,10);
//var pen;   not declared
(!window.pen)&&console.log('no pen');
(window.pen)&&console.log('is pen');

这将打印"无笔",并且不会抛出错误

var pen=document.getElementById('canvas');
    pen=pen.getContext("2d");

(window.pen)&&pen.lineTo(10,10);

或者如果你没有使用jquery 中保留的单词

$.pen=$('#canvas')[0];
  pen=pen.getContext("2d");
($.pen)&&pen.lineTo(10,10);

按顺序做一堆事情:

($.pen)&&[
    pen.lineTo(10,10),
    pen.lineTo(20,20),
    pen.lineTo(30,30)];