使用&&或|| 在CDN后备 - 有区别吗?

Kim*_*sen 2 jquery fallback cdn

这是一个快速的问题,可能会立即标记我为新手,但这里有:-)

在查看代码示例时,包括使用jquery cdn的回退,我看到使用&&或||的方法非常相似:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>
Run Code Online (Sandbox Code Playgroud)

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>!window.jQuery && document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>
Run Code Online (Sandbox Code Playgroud)

现在,我的问题很简单:两者之间是否存在差异(个人偏好和可读性除外)?

Kev*_*sox 5

基本上这两个脚本执行相同的功能.他们检查CDN是否加载了jQuery,如果没有,则返回本地副本.唯一的区别是执行检查的方式.

第一个脚本

window.jQuery || 
  document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')
Run Code Online (Sandbox Code Playgroud)

如果jQuery无法加载,那么window.jQuery将导致undefined或者false导致布尔表达式的第二部分被评估,因为使用了||(或运算符),使得脚本的本地副本加载.这是基本or逻辑,因为当前面的||条件为假时,操作员将评估每个条件.

第二个脚本

!window.jQuery && 
       document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')
Run Code Online (Sandbox Code Playgroud)

这个脚本只是否定了对jQuery的检查!window.jQuery,所以如果jQuery是undefined等价的false(当被否定==为真时)它将评估布尔表达式的第二部分,导致加载本地副本.如果加载了jQuery,则布尔表达式的第一部分在否定时等效于false,导致不计算表达式的第二部分.

这是一个关于布尔逻辑如何播放的小脚本示例:

!false && alert("First condition is true evaluate me");

false || alert("First condition is false evaluate me");

false && alert("I am never evaluated since first condition is false, entire condition is false.");

true || alert("I am never evaluated since first condition is true, entire condition is true");
Run Code Online (Sandbox Code Playgroud)

布尔脚本示例: http ://jsfiddle.net/kbLfB/