这是一个询问是否存在这种技术的问题..
我正在寻找一种方法来执行一个内联语句,如果定义了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);
这会引发意外;错误!
如果对象未定义,是否存在除三元之外的其他类型的内联以及返回的方法?
答案 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)];