js “||”、“&&”的靈活運用

javascript “||”、“&&”的靈活運用

如果&&左側表達式的值爲真值,則返回右側表達式的值;否則返回左側表達式的值。
Js代碼  收藏代碼
  1. var i=""&&"真值";//->i=""  
  2. i="真值"&&"其他真值";//->i="其他真值"  
  3. i="真值"&&"";//->i=""  
 
如果||左側表達式的值爲真值,則返回左側表達式的值;否則返回右側表達式的值。
Js代碼  收藏代碼
  1. var i=""||"真值";//->i="真值"  
  2. i="真值"||"其他真值";//->i="真值"  
  3. i="真值"||"";//->i="真值"  

 


http://my249645546.iteye.com/blog/1716629

一、一些晦澀的操作符:

1、(function(){})();

幾乎所有的開源js代碼開篇都是這樣(function(……){……})(……);

下面是Jquery的部分源碼:

 

Js代碼  收藏代碼
  1. (function( window, undefined ) {  
  2.     var jQuery = function( selector, context ) {  
  3.         // The jQuery object is actually just the init constructor 'enhanced'  
  4.         return new jQuery.fn.init( selector, context );  
  5.     },  
  6.   
  7.     // Map over jQuery in case of overwrite  
  8.     _jQuery = window.jQuery,  
  9.   
  10.     // Map over the $ in case of overwrite  
  11.     _$ = window.$,  
  12.     ……  
  13.     indexOf = Array.prototype.indexOf;  
  14.   
  15.     // Expose jQuery to the global object  
  16.     window.jQuery = window.$ = jQuery;  
  17. })(window);  

 

那麼這個操作符(function(){})();到底是什麼意思呢?

(function(){})中的定義了一個function,緊接着的()表示立即執行這個function。

我們看到Jquery源碼第一個()中是定義了一個匿名function( window, undefined ) {};接着末尾有個(window),就表示執行這個匿名function,並傳入參數window。

 

在匿名function( window, undefined ) {}中,定義了一個局部變量jQuery;然後在末尾我們看到Jquery末尾有一句 window.jQuery = window.$ = jQuery; 這句代碼就表示,將此前定義的jQuery導出到window對象。這也是爲什麼我們可以在代碼任何地方直接使用$、jQuery對象,因爲在這裏已經將$、jQuery對象掛載到window下去了,而window.$、window.jQuery與直接使用$、jQuery是沒有區別的。

(注意,這個window對象是傳入的參數window,而不是瀏覽器window對象!!一個形參、一個實參。我們可以在定義function的時候,將參數window取名爲其他字符。所以我們看到jquery.min.js中這個匿名function變成了(function(E,B){})(window);)

 

通常(function(){})()用來封裝一些私有成員或者公共成員的導出。

 

2、令人迷惑的","

我們知道“,”一般用於一次定義多個變量、定義多個參數等。像上面的jQuery源碼中在var jQuery後面,使用“,”一次定義了很多個變量。

但是,像下面的代碼,可能大家就不一定看得懂了:

 

Js代碼  收藏代碼
  1. //html:<input type="hidden" value="king" id="nameHide"/>  
  2. jQuery(document).ready(function() {  
  3.     var showName=function(){  
  4.         var value,nameInput=$("#nameHide");  
  5.         return nameInput.show(),value=nameInput.val();  
  6.     };  
  7.     alert(showName());  
  8. });  
  9. //結果:彈出king  

 這裏的“nameInput.show(),value=nameInput.val()”中的“,”運算符的作用是返回","右側表達式的值。所以,return 後面如果有多個表達式,且表達式之間由","隔開,整個return表達式返回的是最後一個","右側的表達式的值。

 

“,”在開源代碼中常常被用於return表達式中,以及跟下面我們要講到的"()"運算符一起使用。

 

3、“()”廣義上的代碼包裝

我們遇到複雜的邏輯表達式時,我們通常會把需要一起運算的表達式用“()”包起來:(a||b)&&(c||d)

其實,我們可以這樣理解:"()"運算符將一個表達式包裹起來作爲一個整體進行運算,然後返回這個整體的值。

那麼上面的(function(){})()中左側定義function的()也是這個作用,將這個function給包裹起來,然後返回這個function。我們調用方法一般是a();那麼(function(){})的作用就是返回這個function對象,然後(function(){})()右側的()表示調用這個function。

 

我們再來看其他的用法:

 

 

Js代碼  收藏代碼
  1. //html:<input value="kings" id="name"/><div id="nameErrorTip">輸入錯誤!</div>  
  2. jQuery(document).ready(function() {  
  3.     var nameValidate=function(){  
  4.         var value,nameInput=$("#name"),nameErrorTip=$("#nameErrorTip");   
  5.         return (value=nameInput.val(),value=="king")?(nameErrorTip.hide(),"對了,輸入爲king!"):(nameErrorTip.show(),"請輸入king!");  
  6.     };  
  7.     alert(nameValidate());  
  8. });  
  9.   
  10. //結果 nameErrorTip顯示,彈出"請輸入king!"  
  11.   
  12.   
  13.   
  14. //html:<input value="king" id="name"/><div id="nameErrorTip">輸入錯誤!</div>  
  15. //結果 nameErrorTip隱藏,彈出"對了,輸入爲king!"  
 

 

這裏“ (value=nameInput.val(),value=="king")”中"()"將裏面的表達式作爲一個整體進行運算,而裏面的表達式又是由","構成的多個表達式組,所以執行的時候會把這多個表達式都執行一次,並且返回最後一個表達式的值!

所以 (value=nameInput.val(),value=="king")執行時,先運算value的值,再判斷是否爲"king"。如果爲king,會執行(nameErrorTip.hide(),"對了,輸入爲king!")。這個表達式又先將nameErrorTip隱藏,再返回一個"對了,輸入爲king!"字符串作爲 整個return的值。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章