javascript if语句是否有多个条件testing它们?
在javascript中,当使用if语句来testing多个条件时,javascript是否全部testing它们,还是在testing它们之前保留它们,如果它已经是错误的呢?
例如:
a = 1 b = 2 c = 1 if (a==1 && b==1 && c==1)
请问javascript会testing所有这三个条件,或者在看到b不等于1的情况下,因此是false,它会退出语句吗?
我从性能angular度来问。 例如,如果我正在testing3个复杂的jQueryselect器,我宁愿没有jQuery遍历DOM 3次,如果它明显通过第一个将返回FALSE。 (在这种情况下,嵌套3个if语句会更有意义)。
附录:更多的好奇心,这是什么适当的术语? 我注意到很多人使用术语“短路”。 另外,做一些语言做这个和别人不?
&&
运算符“短路” – 也就是说,如果左边的条件是错误的,那么它就不会评估正确的条件。
同样, ||
如果左侧条件为真,则操作员短路。
编辑:虽然,你不应该担心性能,直到你基准,并确定这是一个问题。 过早的微观优化是可维护性的祸根。
从性能angular度来看,这不是一个微观优化。
如果我们有3个布尔variables,a,b,c是一个微优化。
如果我们调用返回布尔variables的3个函数,每个函数可能需要很长时间,不仅对于了解这个短路,而且以何种顺序知道这一点很重要。 例如:
if(takesSeconds()&& takesMinutes())
比…更好
if(takesMinutes()&& takesSeconds())
如果两者都有可能返回错误。
这就是为什么你可以在JavaScript代码中做的
var x = x || 2;
这意味着如果x是未定义的或者是“假”的,那么默认值是2。
如果有人想知道是否有办法强制所有条件的评估 , 在某些情况下 ,按位运算符&
和|
可以使用
var testOr = true | alert(""); //alert pops up var testAnd = false & alert(""); //alert pops up
这些应该是非常小心的,因为按位运算符是算术运算符,它们在它们的操作数的单个位上工作,并且不能总是作为&&
和||
非“短路”版本。
例:
-2147483648 && 1 = 1
但
-2147483648 & 1 = 0
希望它能帮助到达这里的人寻找这样的信息(像我一样),感谢@Max的纠正和反例
它只会testing所有的条件,如果第一个是真的,为自己testing:
javascript: alert (false && alert("A") && false);
它短路 – 只有a和b将在你的例子中进行比较。
看到b不等于1后退出。
停止使用1个或多个参数向左评估的另一个原因。
if(response.authResponse &&(response.authResponse.accessToken!= user.accessToken)){…}
第二个评估依赖于第一个是真实的,如果response.authResponse为null或未定义等,则不会抛出编译错误,因为第一个条件失败。
其他语言在早期就有这个问题,我认为现在编译器是一种标准的方法。
对于这个问题的任何人都困惑,因为他们没有看到使用||
时的短路行为 与一个?
运营商如此:
x = 1 || true ? 2 : 3 // value of x will be 2, rather than 1 as expected
似乎短路规则不起作用。 为什么要评估||
的第二项 (真实的2:3)第一个是真的吗? 原来是一个操作顺序问题,因为上面是等价的
x = (1 || true) ? 2 : 3
与||
首先评估和?
第二次评估。 你可能想要的是:
x = 1 || (true ? 2 : 3)
- 找不到JavaScript运行时。 有关可用运行时的列表,请参阅https://github.com/sstephenson/execjs。 (ExecJS :: RuntimeUnavailable)
- Chrome中不再允许使用selectionStart / selectionEndinputtypes=“数字”
- 推迟加载和parsingPrimeFaces JavaScript文件
- 将jquery元素转换为html元素
- AngularJS 2 – 使用哪种语言? (打字稿,Javascript,镖)
- 如何实现JavaScript哈希映射?
- 我使用babel的时候需要js吗?
- node.js:将一个文本文件读入一个数组。 (每行在数组中的一个项目。)
- 滚动事件发射次数太多。 我只想让它每秒钟发射一次