&& || 赋值时傻傻分不清楚吗?

先上一个问题:

 a = b || c;

请问a的值会等于b还是等于c呢?
相信你心里已经分情况讨论了,
那再来一个问题:

 a = b && c;

再请问a的值会等于b还是等于c呢?
相信你心里已经又开始分情况讨论了,
矣等等。。。我好想傻傻分不清了哈哈哈

那到底这两种操作符是怎样解析的呢?
我们来做个试验:

var a = true || 'c'; // true
a = false || 'c'; // 'c'
//
a = true && 'c' // 'c'
a = false && 'c' // false

矣,有没有发现正好相反,平时我用 || 比较多,今天突然看到有人用 &&,一下子有些蒙圈哈哈哈,就拿来研究了一把,是不是觉得不好记忆,然后有啥卵用?

好吧,我个人理解的是这些情形其实是?:三元运算符的一种简写,为什么这么说呢,其实他们是等价的:

 var a = b || c; 
 等价于
 var a = b ? b : c;
 意思就是说:当b为可以转化为真值的时候,那就返回b, 否则返回c

var a = b && c;
等价于
var a = b ? c : b;

哈哈,是不是觉得好记忆了那么一丢丢呢。。。
来说说用途吧, 为啥不用三元运算符呢,非要搞这些幺蛾子,就是为了让我等新手傻傻分不清楚嘛。。。看看下面的例子:

假设我们有一个方法,得到一个元素,如果有就返回元素,没有就返回false;
function getElementFromYawen() {
  if(hasElement) {
     return element;
  }
  return false;
}
然后我们有一个默认元素b, 如果从方法中没得到元素则使用默认,
怎么写呢?很简单吧:

var myElement = getElementFromYawen() : getElementFromYawen() : b;

这种情况挺多的吧,有时候可能不是个方法,但是是个变量名很长很长的变量,编辑器折行了有木有啊有木有,你说蛋不蛋疼。。。。,有点。。那这样写会不会好很多:

var myElement = getElementFromYawen() || b;

看起来舒爽一些了吧哈哈

矣,等等那 && 有什么鬼用,这个我还真的很少用啊,我查了下外国友人叫它保护操作符,为什么呢,因为它前面的值为真得时候才把后面的值赋值,否则就自己上~~就是第一个值对第二个值起保护作用,给个栗子:

var hasElementFromYawen = true;
var myElement = hasElementFromYawen ? yawenElement : hasElementFromYawen;
是不是也是很长啊,那干脆这样写:
var myElement = hasElementFromYawen && yawenElement;
觉得举得栗子不太好啊,,有好的使用场景的可以给我留言啊,
其实又看了下,以上只是个栗子,更多的时候是这样用的,不用于赋值而用于执行流的控制比如:
a === 0 && this.remove();
又或者
that.remove && that.remove.apply(that)
也就是当前一个值为真得时候才对第二个值进行解析,如果为假就不再执行了,就是说其实它是
if的一种缩写,还是想少些点字啊

恩,突然发现自己又傻傻分不清楚了,哈哈哈