摘要:一元操作符智能操作一個值的操作符叫做一元操作符。它們不僅適用于整數,也適用于字符串布爾值浮點數值和對象。此類操作符主要用于基本的算術運算。執行按位非就是返回數字的反碼,就是操作數的負值。乘法用星號表示該操作符。
操作符
在ECMA-262 中,描述了一組用于操作數據值的操作符,包括算術操作符(如加減符號)、位操作符、關系操作符和相等操作符。
一元操作符智能操作一個值的操作符叫做一元操作符。
遞增和遞減操作符此類操作符是借鑒于C 語言,有兩個版本,一種是前置型,一種是后置型。
前置型操作符在執行前置型操作符時,變量的值都是在語句被求值以前改變的。(副效應)如:
var num1 = 10; var num2 = 20; var num3 = --num1 + num2; var num4 = num1 + num2; document.write(num3 + " " + num4); //29 29 //由于是前置型遞減操作符,num3 在計算結果出來之前,num1 已經是9 了,所以num3 的計算結果就是29;同樣的,由于計算num3 之后,num1 是9,所以num4 同樣是29。后置型操作符
區別就是符號放在變量的后面,以及操作符是在包含他們的語句求值之后才執行的。如:
var num1 = 10; var num2 = 20; var num3 = num1-- + num2; var num4 = num1 + num2; document.write(num3 + " " + num4);//30 29 //由于是后置型遞減操作符,num3 在計算結果出來之后,num1 才變成9,所以num3 的計算結果仍然是30;同樣的,由于計算num3之后,num1才變成9,所以num4 則是29.
應該注意的是,此類操作符對任何值都適用。它們不僅適用于整數,也適用于字符串、布爾值、浮點數值和對象。如:
var a = "12"; var b = "abc"; var c = true; var d = 0.123; var object = { valueOf: function(){ return 1; } } document.write(++a); //13 document.write(++b); //NaN document.write(++c); //2 document.write(++d); //1.123 document.write(++object); //2一元加和減操作符
此類操作符的作用與數學常識完全一樣,不再詳述。此類操作符主要用于基本的算術運算。
位操作符ECMAScript 中的所有數值都是以IEE-754 64 位格式儲存的,但位操作符并不直接操作64 位的值。而是先轉換成32 位,操作之后再存儲為64位。對于有符號的整數,32 位的前31 位用于表示整數的值。第32位用來表示數值的符號。0 為正,1 為負。這個表示符號的位就是符號位。
那么在JavaScript 中如何將數值或字符串轉換成二進制字符串呢?如下:
var a = "18"; var numA = parseInt(a,10).toString(2); document.write(numA); //10010按位非(NOT)
由波浪線(~)表示。執行按位非就是返回數字的反碼,就是操作數的負值-1。如:
var a = "18"; var numA = parseInt(a,10).toString(2); document.write(numA); //10010 document.write(~numA); //-10011 //這里,18 的二進制碼就是10010,它的反碼就是-10011
轉換二進制和十進制的方法如下:
var a = "12"; var x = parseInt(a,10).toString(2); document.write("這個數的二進制碼是:" + x); document.write("按位與(AND)
"); var y = ~x; document.write("這個數的二進制反碼是:" + y); document.write("
"); var b = parseInt(x,2).toString(10); document.write("您輸入的數字是:" + b); /* 這個數的二進制碼是:1100 這個數的二進制反碼是:-1101 您輸入的數字是:12 */
用& 字號表示。簡單的說就是按位與操作只在兩個數值的對應位都是1 時才返回1,任何一位是0,結果都是0.如:
var num1 = 25; var num2 = 3; document.write(num1 & num2) //1 //首先其底層操作實際上就是25 和3 的二進制碼在對應位都是1 時才返回1,其他都是0,所以結果就是十進制1 的二進制碼。按位或(OR)
用| 豎線符號表示,簡單的說就是有一個位是1 的情況下就返回1,而只有在兩個位都是0 的情況下才返回0。如:
var num1 = 25; var num2 = 3; document.write(num1 | num2) //27按位異或(XOR)
用^ 插入符號表示,簡單的說就是對應位上只有一個1 時才返回1,如果對應的兩位都是1 或都是0,則返回0。如:
var num1 = 25; var num2 = 3; document.write(num1 ^ num2) //26左移
用<< 兩個小于號來表示,這個操作符會將數值的所有位向左移動指定的位數。如:
var num1 = 2; var num2 = num1 << 5; document.write(num2); //64有符號的右移
用>> 兩個大于號來表示,但是保留符號位!如:
var num1 = -64; var num2 = num1 >> 5; document.write(num2); //2無符號的右移
用>>> 三個大于號來表示,這樣就沒有辦法保留符號位了!如:
var num1 = 64; var num2 = num1 >>> 5; document.write(num2); //2 //對于正數來說,結果依然還是原來的結果(保留符號位) var num1 = -64; var num2 = num1 >>> 5; document.write(num2); //134217726 //但是對于負數,結果就不同了(不保留符號位)布爾操作符
主要用來執行if...else 等循環之類的語句。包括邏輯非(!)、邏輯與(&&)以及邏輯或(||)
邏輯非用! 嘆號表示。主要規則如下:
如果操作數是對象,返回false;
如果操作數是空字符串,返回true;
如果操作數是數值0,返回true,非零(包括infinity),返回false;
如果操作數是null、NaN、undefined,返回true;
具體例子如下:
var obj = {}; document.write(!obj); //false var str = ""; document.write(!str); //true var num = Infinity; document.write(!num); //false var thing = NaN; document.write(!thing); //true邏輯與
用&& 兩個和號表示。主要規則如下:
如果第一個操作數是對象,則返回第二個操作數;
如果第一個操作數求值結果是true,且第二個操作數是對象,則返回第二個操作數;
如果兩個操作數都是對象,則返回第二個操作數;
如果有一個操作數是null、NaN或者undefined,則返回null、NaN或undefined;
具體例子如下:
var obj1 = {}; var obj2 = {name:"-helloworld-"}; var result1 = (obj1 && 321); document.write(result1); //321 第一個是true 的對象,返回第二個操作數 var result2 = (!obj1 && 321); document.write(result2); //false 第一個是false,沒有必要對321 求值 var result3 = (obj1 && obj2.name); document.write(result3); //"-helloworld-" 第一個是true 的對象,返回第二個對象的操作數 var result4 = (321 && 33); document.write(result4); //第一個為true,返回第二個操作數 var result5 = (321 && null); document.write(result5); //第一個為true,返回null
值得注意的是,如果第一個操作數能夠決定結果,那么就不會對第二個操作數求值。如:
var x = true; var y = {name:"helloworld"}; var result = (x && y.name); document.write(result); //"helloworld" 第一個操作數不能判定結果,要繼續執行下一個操作數,才能執行document.write var x = true; var result = (x && z); document.write(result); //由于z 沒有被定義,這里會發生錯誤,不會執行document.write var x = false; var y = {name:"helloworld"}; var result = (x && y.name); document.write(result); //false 第一個操作數能夠判定結果,不需要執行下一個操作數,就可以直接執行document.write var x = false; var result = (x && z); document.write(result); //false 第一個操作數能夠判定結果,不需要執行下一個操作數,所以無論下一個操作數是否被定義,不會發生錯誤。都可以直接執行document.write邏輯或
用|| 兩個豎線符號表示。主要規則如下:
如果第一個操作數是對象,則返回第一個操作符;
如果第一個操作數的求值結果是false,則返回第二個操作數;
如果兩個操作數都是對象,則返回第一個操作數;
如果兩個操作數都是null、NaN或者undefined,則返回null、NaN或undefined;
值得注意的是,如果第一個操作數的求值結果是true,就不會對第二個操作數求值了。如:
var x = true; document.write(x || z); //true 雖然這里并沒有定義z 但是由于第一個操作數能夠判定結果,則不需要繼續對第二個操作符進行求值 var x = false; document.write(x || z); document.write("false"); //這里之所以不會返回false,是因為在第一個操作數判定不了結果的情況下,會對第二個操作數進行求值,但是第二個操作數未定義。所以會出現錯誤。
另外,還需要注意的是,我們可以利用邏輯或的這一行為來避免為變量賦予null 或 undefined 值。例如:
var str1 = "hello there!"; var str2 = null; var str = str2 || str1; document.write(str); str2 = undefined; var str = str2 || str1; document.write(str); //這樣就能規避其中一個操作數是null 或者undefined,把第二個操作數作為后備值乘性操作符
ECMAScript 定義了3個乘性操作符:乘法、除法和求模。
乘法用* 星號表示該操作符。
主要規則有:
如果計算結果超過了表示范圍,則會返回+/-Infinity;
如果有一個操作數是NaN,則結果是NaN。
如果是Infinity 與0 相乘,則結果是NaN。
如果Infinity 與 Infinity 相乘,則結果是+/-Infinity;
如果其中一個操作數不是數值,后臺將會先用Number()對齊進行轉換,然后按照上面的規則求值。
具體例子:
var result = (-Number.MAX_VALUE * Number.MAX_VALUE) document.write(result) //-Infinity result = (NaN * 321); document.write(result) //NaN result = (-Infinity * 0); document.write(result) //NaN result = (Infinity * -Infinity); document.write(result) //=Infinity result = (1 * "321"); document.write(result) //321 result = (1 * false); document.write(result) //0除法
用/ 斜線符號表示。
主要規則如下:
如果計算結果超過了表示范圍,則會返回+/-Infinity;
如果有一個操作數是NaN,則結果是NaN;
如果是0 除以0,結果則是NaN;
如果是非零的有限數被0 除,結果是+/-Infinity;
如果是Infinity 被任何非零數值除,結果則是+/-Infinity;
具體例子如下:
var result = (Number.MAX_VALUE / Number.MIN_VALUE); document.write(result) //Infinity result = (NaN / Number.MIN_VALUE); document.write(result) //NaN result = (0 / 0); document.write(result) //NaN result = (-421 / 0); document.write(result) //-Infinity result = (-Infinity / 2); document.write(result) //-Infinity求模
用% 百分號表示,求模就是求余數。
主要規則如下:
如果被除數是無窮大,除數是有限大,則返回NaN;
如果被除數是有限大,除數是0,則返回NaN;
Infinity 除以Infinity 結果是NaN;
被除數是有限大,除數是無窮大,結果是除數;
被除數如果是0,結果就是0;
如果其中一個操作數不是數值,則后臺先轉換成數值再進行上述規則。
具體例子如下:
var result = (Infinity % 2); document.write(result) //NaN var result = (2 % 0); document.write(result) //NaN var result = (Infinity % Infinity); document.write(result) //NaN var result = (2 % Infinity); document.write(result) //2 var result = (0 % 2); document.write(result) //0加性操作符 加法
用+ 加號表示,規則如下:
如果一個操作數是NaN,則結果是NaN;
如果是Infinity 加-Infinity,結果是NaN;
如果是Infinity 加Infinity,結果是Infinity;
如果是-Infinity 加-Infinity,結果是-Infinity;
如果是+0 加-0,結果是+0;
如果是+0 加+0,結果是+0;
如果是-0 加-0,結果是-0;
如果兩個操作數都是字符串,則拼接兩個字符串;
如果只有一個操作數是字符串,則將另一個轉換成字符串再拼接起來;
具體例子如下:
var num1 = NaN; var num2 = Infinity; var result = num1 + num2; document.write(result); //NaN var num1 = Infinity; var num2 = -Infinity; var result = num1 + num2; document.write(result); //NaN var num1 = Infinity; var num2 = Infinity; var result = num1 + num2; document.write(result); //Infinity; var num1 = -Infinity; var num2 = -Infinity; var result = num1 + num2; document.write(result); //-Infinity var num1 = "hello "; var num2 = "there"; var result = num1 + num2; document.write(result); //"hello there" var num1 = 1000; var num2 = " there"; var result = num1 + num2; document.write(result); //"1000 there" var result_num = parseInt(result); document.write(result_num);//可以證明result 是字符串
值得注意的是,加性操作符在編程中的常見的錯誤:
var num1 = 11; var num2 = 100; document.write("the result is " + num1 + num2); //"the result is 11100" 錯誤,num1 和num2 被拼接成字符串 document.write("the result is " + (num1 + num2)); //“the result is 111” 正確,括號內的為計算值減法
用- 減號表示,規則如下:
如果一個操作數是NaN,結果是NaN;
如果Infinity 減Infinity,結果是NaN;
如果-Infinity 減-Infinity,結果是NaN;
如果Infinity 減-Infinity,結果是Infinity;
如果-Infinity 減Infinity,結果是-Infinity;
如果是+0 減+0,結果是+0;
如果是+0 減-0,結果是-0;
如果是-0 減-0,結果是+0;
如果有一個操作數是字符串、布爾值、null 或undefined,則后臺會先把它轉換成數值;
具體例子如下:
document.write(3 - null); //3 document.write(NaN - true); //NaN document.write(3 - ""); //3 document.write(3 - "1"); //2 document.write(Infinity - Infinity); //NaN document.write(-Infinity - Infinity); //-Infinity關系操作符
用< 小于、> 大于、<= 小于等于、>= 大于等于表示。規則是:
如果兩個操作數都是字符串,則比較兩個字符串對應的字符編碼值;
如果一個操作數是數值,則將另一個操作數轉換成一個數值再比較;
如果一個操作數是數值,則將另一個操作數轉換成一個數值,當不能轉換成數值時,會當做NaN 進行比較,但是與NaN 進行比較的結果都是false;
大寫字母的字符編碼全部小于小寫字符編碼;
具體例子如下:
document.write("Blackbarry" < "apple"); //true 大寫字母字符編碼小于小寫字符編碼 document.write("blackbarry" < "apple"); //false document.write("10" < "3"); //true 兩個都是字符串 所以比較的是字符編碼 document.write("10" < 3); //false “10”字符串被轉換成10 數值,比較數值大小 document.write("a" < 3); //false "a"字符串被轉換成了NaN,任何操作數與NaN 比較都是false;相等操作符
用== 表示相等、!= 不等、=== 全等、 !==不全等。
相等和不等規則如下:
null 和undefined 是相等的
如果一個操作數是NaN,相等則返回false,不等則返回true。如果兩個操作符都是NaN,相等還是返回false,因為NaN 與NaN 不相等;
如果兩個操作數都是對象,則比較他們是不是同一個對象;
具體例子如下:
document.write(null == undefined); //true document.write(null == NaN); //false document.write(NaN == NaN); //false document.write("NaN" == NaN); //false document.write("null" == undefined); //false document.write(0 == undefined); //false document.write(0 != "0"); //false document.write(0 != false); //false全等和不全等
與相等和不等類似,例子如下:
document.write(undefined === null); //false 兩個是不同類型的值 document.write(undefined == null); //true 兩個是不同類型的值 但相等 不全等 document.write("21" == 21); //true document.write("21" === 21); //false
千萬注意null 和undefined 是相等但不全等
條件操作符語法形式是:
變量 = 條件 ? true : false;
舉個例子:
var num1 = 10; var num2 = 30; var num = (num1 > num2) ? num1 : num2; document.write(num); //30 選擇最大的那個賦值給變量并打印出來賦值操作符
用= 等號來表示,另外,復合賦值操作還可以用復合賦值操作符來表示。如:
var x = 10; x = x + 1; document.write(x); //11 //上面這種可以寫成下面這種 var x = 10; x +=1; document.write(x); //11 var x = 10; x *=2; document.write(x); //20
其他還有:
(*=)
(/=)
(%=)
(+=)
(-=)
(<<=)
(>>=)
(>>>=)
值得注意的是,使用上面這些并不能帶來任何性能的提升,無非是省了幾個字符
逗號操作符逗號操作符可以在一條語句中執行多個操作,如:
var num1 = 1, num2 = 2, num3 = 3; document.write(num1 + num2 + num3) //6
另外,逗號也可以用來賦值,逗號最后面的數值會被賦值到變量中。比如:
var x = (1,2,3,4,5); document.write(x); //5 var x = (1,2,3,4,5,); document.write(x); //出現錯誤
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86141.html
摘要:如很明顯可以看到,實際上是函數的局部變量。簡單的說就是,復制給參數,在函數內部是局部變量,無論怎么變化,都不影響的變化。 ECMAScript 變量可能包含兩種不同數據類型的值:基本類型值和引用類型值。 基本類型和引用類型的值 基本類型值(String,Number,Boolean,Null,Undefined)指的是簡單的數據段;引用類型值(保存在內存中的對象)指的是那些可能由多個值...
摘要:為了規避這個問題,可以使用定時器對事件處理程序進行節流。當第二次調用該函數時,它會清除前一次的定時器,并設置另一個。如果前一個定時器已經執行過了,這個操作就沒有任何意義。然而如果前一個定時器尚未執行,其實就是將其替換為一個新的定時器。 高級定時器 為了解決setInterval的一些執行問題, 下面是采用鏈式setTimeout的方式來規避: setTimeout(function()...
摘要:語法如下注意這里使用的并不是的,是內部函數的。函數柯里化的基本方法是使用一個閉包返回一個函數。當函數被調用時,返回的函數還需要設置一些傳入的參數。 安全的類型檢測 typeof操作符 檢測數據類型的結果可能會不正確; instanceof操作符 操作符在多個全局作用域下存在問題: var value = []; var isArray = value instanceof Array;...
摘要:對象基本介紹是最有用的對象之一,它提供了與當前窗口中加載的文檔有關的信息。設置或返回主機名和當前的端口號。設置或返回當前的協議。另外,也可以修改對象的其他屬性來改變。并且用戶不能返回到值錢的頁面。 location 對象基本介紹 location 是最有用的 BOM 對象之一,它提供了與當前窗口中加載的文檔有關的信息。還提供了一些導航功能。下面是 location 對象的所有屬性: 假...
摘要:事件流級事件規定的事件流包括三個階段事件捕獲階段處于目標階段和事件冒泡階段。事件處理程序的名字以開頭,如等。如使用級方法指定的事件處理程序被認為是元素的方法。 事件流 事件流描述的是從頁面中接收事件的順序。IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕獲流。 事件冒泡 即事件開始時由最具體的元素接收,然后逐級向上傳播到較為不具體的節點。如: ...
摘要:語句規定了一組語句也被成為流控制語句語句大多數編程語言中最為常用的一個語句就是語句。語句語句是一種精準的迭代語句。語句該語句的作用是將代碼的作用域設置到一個特定的對象中。 語句 ECMA-262 規定了一組語句(也被成為流控制語句) if 語句 大多數編程語言中最為常用的一個語句就是if 語句。語法如下: if (condition1) { statement1; } else...
閱讀 2020·2021-10-09 09:41
閱讀 1596·2021-09-28 09:36
閱讀 1100·2021-09-26 09:55
閱讀 1285·2021-09-10 11:17
閱讀 1141·2021-09-02 09:56
閱讀 2755·2019-08-30 12:58
閱讀 2927·2019-08-29 13:03
閱讀 1847·2019-08-26 13:40