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

时间:2014-09-19 13:58:17

标签: javascript inline

这是一个询问是否存在这种技术的问题..

我正在寻找一种方法来执行一个内联语句,如果定义了item对象则执行一个动作,否则什么也不做(所以代替(条件)?if:else;它只是(条件)?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);

这会引发意外;错误!

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

3 个答案:

答案 0 :(得分:1)

我知道有两个:

// 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);
}

答案 1 :(得分:1)

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

// 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);

答案 2 :(得分:0)

//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)];