在我的案例混乱中使用javascript对象中的OR

时间:2014-12-22 13:42:29

标签: javascript jquery

enter image description here

问题1

options.left = options.left || _KSM.drawOption.left的含义是什么?我知道_KSM.drawOption指的是对象(也是一个函数),但||运算符如何在这里工作?如果_KMS.drawOption.left未定,是否意味着将options.left分配给options.left

问题2

为什么作者在这种情况下没有使用this关键字?我认为这是因为在这个演示中他没有创建一个实例,因为他只做了一次调用。 Rigtht? (我在jquery插件中看到了很多this这就是为什么当作者在一个函数中调用函数名而不是函数时我就会被使用了)

2 个答案:

答案 0 :(得分:0)

问题1

这是一种为变量设置默认值的方法。它实际上是评估左侧,如果它是falsy,变量将等于右侧(即使它也是假的)。

这是分配默认变量的一种不好的方法,尤其是在使用整数时。 0被视为虚假,因此您永远无法将0指定为左侧属性。相反,它始终是_KMS.drawOption的默认参数。

问题2

我们没有完整的代码,所以我们只能假设。但我的假设是draw是一个事件,一个函数与addEventListener绑定。这意味着上下文(this值)是事件的目标。我的猜测是画布。

答案 1 :(得分:0)

JavaScript中的逻辑运算符与大多数人期望的工作方式略有不同。

Logical OR (||)

  

如果可以转换为true,则返回expr1;否则,返回   表达式2。因此,当与布尔值一起使用时,||如果有,则返回true   操作数是真的;如果两者都为假,则返回false。

因此,不是导致布尔值的表达式,而是返回不是“falsey”的第一个值。这样做的好处是可以在未定义,null,0或空字符串的情况下填充默认值。

var myObj = { name: 'Josh' };

myObj.age = myObj.age || 33;

Logical AND (&&)

  

如果可以转换为false,则返回expr1;否则,返回   表达式2。因此,当与布尔值一起使用时,&&如果两者都返回true   操作数是真的;否则,返回false。

基本上恰恰相反。由于任何计算结果为false的表达式都会使逻辑检查短路,因此在尝试使用字段之前测试字段的存在会很有用。

var myObj = null;

if(myObj && myObj.person && myObj.person.name === "Josh") // false, no error

var myObj = {};

if(myObj && myObj.person && myObj.person.name === "Josh") // false, no error

var myObj = {person: {}};

if(myObj && myObj.person && myObj.person.name === "Josh") // false, no error

var myObj = {person: {name: "Josh"}};

if(myObj && myObj.person && myObj.person.name === "Josh") // true

然而!此处应谨慎,因为在布尔值truefalse和整数值0或任何不是{{1}的情况下你最终可能会覆盖合法的价值。

问题2:上下文不够