谁能解释一下这个Javascript中发生了什么?

Sto*_*dow 9 javascript jquery

我正在浏览一个jQuery平滑滚动教程,并尝试弄清楚它是如何工作的,当我点击这行代码时:

 $target = $target.length && $target || $('[name=' + this.hash.slice(1) +']');
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚它的作用.看起来这个人正在为一个变量分配一个字符串,但它看起来还有点像是在测试那个变量.我不明白使用&&和|| 这里.任何人都能解释一下吗?

谢谢!

编辑:哇!真是个回应!这对我来说有点了解,但是 - 我将不得不打印出来或者其他东西并继续努力.一旦我了解了正在发生的事情,我将能够选择最能帮助我的答案.特别是这一点:

if ($target.length && $target) {
$target = $target;
Run Code Online (Sandbox Code Playgroud)

让我筋疲力尽 程序如何知道将$ target分配给$ target?操作是否将$ target分配给自身的第一个引用(等号的左侧),或者第二个引用自身(右侧,&&之后)?

Nar*_*ala 8

它是等效三元运算符的神秘(或优雅?)版本

$target = ($target.length && $target) ? $target : $('[name=' + this.hash.slice(1) +']');

如果$ target的评估不改变$ target的值,则此三元和原始短路表达式将返回完全相同的值.但是如果$ target的评估改变了$ target的值,则SCE和三元返回不同的值,例如

var a = 1; b = 2; c = 3;
a && ++b || c
returns 3;
//resetting b
b = 2
a && ++b ? ++b : c 
returns 4;

如果$ target的评估改变了$ target的值,那么SCE的等效三元运算符$target = $target.length && $target || $('[name=' + this.hash.slice(1) +']');将如下

$target = ($result= ($target.length && $target)) ? $result : $('[name=' + this.hash.slice(1) +']');

  • 有趣的事实:在Python具有相当于三元运算符之前,大多数人在问题的JavaScript代码段中使用了`and`和`或`. (2认同)