处理未定义对象的内联比三进制更聪明
A smarter inline than ternary for dealing with undefined objects
这是一个问题,询问是否存在这样的技术
我正在寻找一种通常情况下执行内联语句的方法,该语句在项对象被定义时执行操作,否则什么都不做(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)];
相关文章:
- 为什么“;未定义的“;在JavaScript中结束循环
- 要求未定义JS回调参数
- 如何检查管道中未定义的项目
- TypeError:无法读取属性'推'未定义的JavaScript
- $window.ga在AngularJS事件中未定义
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 无法获取属性'selectedIndex'的未定义引用或null引用
- 如何消除代码中的未定义和其他问题
- 未捕获的ReferenceError:$未定义
- 什么更快?运行空函数或检查函数是否未定义
- 对象不为 null,也不未定义.更好的是 - 双重反转'!!' 或 JavaScript 中的严格等价性 '!=='
- 想要了解更多关于未定义的信息
- 处理未定义对象的内联比三进制更聪明
- 有没有办法让Angular.js在未定义的情况下变得更冗长?
- PHP错误未定义变量:data -使用Codeigniter加载更多数据
- 寻找一种更简单的方法来检查是否多个属性&对象中的方法是未定义的
- 为什么对于在更高范围内初始化并稍后在当前范围内初始化的变量,我会得到未定义
- 数组以更高的粒度返回未定义
- 检测变量的更好方法!=发送异步请求时未定义