有人能解释一下这段Javascript中发生了什么吗?

Can anyone explain what is happening in this bit of Javascript?

本文关键字:Javascript 发生了 什么 一下 能解释      更新时间:2023-09-26

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

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

我不知道它是做什么的。它看起来像是在给一个变量赋值一个字符串,但它也看起来像是在测试那个变量。我不明白&&这里。有人能解释一下吗?

谢谢!

编辑:哇!多么好的回应啊!这对我来说是有点理解,虽然-我将不得不把它打印出来,并在它的工作。一旦我明白了发生了什么,我就能选择对我帮助最大的答案。特别是这位:

if ($target.length && $target) {
$target = $target;

在阻碍我。程序如何知道将$target赋值给$target?该操作是将$target赋值给对自身的第一个引用(等号的左侧),还是将$target赋值给对自身的第二个引用(在&&之后的右侧)?

这是等效三元操作符

的一个神秘(或优雅?)版本。
$target = ($target;长度&& $target) ?目标:美元("[name = ' + this.hash.slice (1 ) +']');

如果对$target求值不改变$target的值,那么这个三进制和原来的短路表达式将返回完全相同的值。但是如果$target的求值改变了$target的值,那么SCE和三元制返回不同的值,例如

<>之前Var a = 1;B = 2;C = 3;A && ++b返回3;//重置bB = 2A && ++b ?++b: c返回4;之前

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

<>之前$target = ($result= ($target =))长度&& $target)) ?$result: $('[name=' + this.hash.slice(1) +']');

它正在测试$target(我假设是一个jQuery对象)的元素,如果为空,分配一个默认值。

详细说明请参见逻辑运算符。

更新

解释一下(如果你不想读MDN文档),JavaScript逻辑比较运算符从左到右工作。

expr1 && expr2

如果可以转换为false,则返回expr1;否则,返回expr2

expr1 || expr2

如果可以转换为true,则返回expr1;否则,返回expr2

要分解所讨论的行,可以这样想

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

看第一个操作…

$target.length && $target

如果$target.length可以转换为false(即0),则返回$target.length,否则返回$target

第二个操作如下…

(operation1) || $('[name=' + this.hash.slice(1) +']')

如果operation1的结果可以转换为true(即$target),则返回$('[name=' + this.hash.slice(1) +']')

这称为短路求值,它的等价于三元运算符。

和你的代码的和平等价物如下:

if ($target.length && $target) {
    $target = $target;
} 
 else {
    $target = $('[name=' + this.hash.slice(1) +']');
}

在JavaScript和其他大多数具有两个以上真值True和False的松散类型语言中,返回的值基于最后值

a && b如果为false则返回a,否则返回b。

a || b将返回a,如果为真,则返回b。

为了更好地理解最后一个值,请看下面的例子:
var a = true;
var b = false;
var c = 5;
var d = 0;
return a && b; //returns false
return a && c; //returns 5
return b && c; //returns false
return c && b; //returns false
return c && a; //returns true;
return d && b; //returns 0;
return b && d; //returns false;
return a || b; //returns true
return a || c; //returns true
return b || c; //returns 5
return c || b; //returns 5
return c || a; //returns 5;
return d || b; //returns false;
return b || d; //returns 0;

更新:

三元操作符:

(condition)?(evaluate if condition was true):(evaluate if condition was false)

短路评定:

(evaluate this, if true go ahead else return this) && (evaluate this, if true go ahead else return this)

可以清楚地看到,有一个condition for三元运算符,而在SCE中,值的求值本身就是条件。

$target = $target。长度,,美元目标| | $ (' [name = ' + this.hash.slice (1 ) +']');

在javascript中,你可以在赋值变量时进行内联比较,所以你的例子相当于

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

更多示例,参见http://www.w3schools.com/JS/js_comparisons.asp
例如:

var x= y > 4 ?value1:value2

巫婆意味着如果条件为真(y大于4),x将被赋值为value1,否则将被赋值为value2