有人能解释一下这段Javascript中发生了什么吗?
Can anyone explain what is happening in this bit of Javascript?
我正在浏览一个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 = ($result= ($target =))长度&& $target)) ?$result: $('[name=' + this.hash.slice(1) +']');$target = $target.length && $target || $('[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
- Javascript函数 - 通过引用复制,但这里发生了什么
- JavaScript's数组过滤器函数在没有分配函数的情况下使用-这里发生了什么
- 这个JavaScript函数中发生了什么
- 十分钟内的 Javascript:此示例代码中发生了什么说明惰性范围
- 有人请帮助解释这个javascript代码,即发生了什么以及代码在做什么
- GithubElectron:浏览器进程中发生了JavaScript错误
- 这个JavaScript三元运算符中发生了什么
- 如何检查JSON在Javascript中是否发生了更改
- Javascript如何判断侦听器上是否发生了event.preventDefault
- 如何修复'�'我页面上的符号?servlet和Javascript之间似乎发生了一些事情
- 任何天才都能告诉我这个小代码中发生了什么吗?来自 JavaScript Ninja 的秘密
- 这个Javascript代码的幕后发生了什么
- javascript引擎解释对象文字时发生了什么
- 使用JavaScript,这样当点击图像时,另一个元素's的位置发生了变化
- 有人可以解释发生了什么在我的JavaScript函数
- javascript和fn发生了什么
- 使用JavaScript来告知节点何时发生了更改
- Javascript中事件中引用的局部函数发生了什么
- Javascript纯对象:这个属性发生了什么?
- JavaScript作用域在这里发生了什么?