摘要:中的操作符的不同之處在于,它們能夠適用于很多值,例如字符串數(shù)字值布爾值甚至對象。在應用于布爾值時,先將其轉換為再執(zhí)行加減的操作。布爾值變量變?yōu)閿?shù)值變量。在有一個操作數(shù)不是布爾值的情況下,邏輯與操作就不一定返回布爾值。
前言
初學者會覺得操作符的知識很簡單,但是隨著學習的深入會發(fā)現(xiàn)很多語句都可以用操作符來簡化,所以深入理解操作符可以幫助你寫出高性能的代碼。這篇文章主要記錄不同操作符所遵循的規(guī)則。
javascript的操作符有一元操作符、位操作符、布爾操作符、乘性操作符、加性操作符、關系操作符、相等操作符、條件操作符、賦值操作符。其中值得注意的是,一元操作符和相等操作符都有可能改變操作數(shù)的數(shù)值類型。js中的操作符的不同之處在于,它們能夠適用于很多值,例如字符串、數(shù)字值、布爾值、甚至對象。不過在應用于對象時,相應的操作符都會調用對象的valueOf()方法或者toString()方法來轉換成可以操作的數(shù)據(jù)類型。
遞增操作符 ++
遞減操作符 --
正數(shù) +
負數(shù) -
遞增和遞減操作符遵循的規(guī)則.
1.在應用于包含有效數(shù)字的字符串時,先將其轉換為數(shù)字值,再執(zhí)行加減1的操作。字符串變量變成數(shù)值變量。
2.在應用于一個不包含有效數(shù)字字符的字符串時,將變量的值設置為NaN。字符串變量變成數(shù)值變量。
3.在應用于布爾值false/true時,先將其轉換為0再執(zhí)行加減1的操作。布爾值變量變?yōu)閿?shù)值變量。
4.在應用于浮點數(shù)值時,執(zhí)行加減1的操作。
5.在應用于對象時,先調用對象的valueOf()方法以取得一個可供操作的值,然后對該值應用前面的四條規(guī)則。如果結果是NaN,則在調用toSring()方法后再應用前面的規(guī)則。對象變量變成數(shù)值變量。
var num = 1; ++num; //2 var num ="12s"; ++num; //NaN typeof num; //number var num = false; ++num; //1 typeof num; //number位操作符
位操作符用于最基本的層次上,我們一般比較少用到。ECMAscript中所有數(shù)值都以IEEE-754 64位格式存儲,但是位操作符并不直接操作64位的值,而是先將64位轉換成32位的整數(shù),然后執(zhí)行操作,最后將結果轉換回64位。這會帶來一個嚴重的副效應,即在對特殊的NaN和Infinity值應用位操作時,兩個值都會被當做0來處理。
按位非 ~
按位與 &
按位或 |
按位異或 ^
左移 <<
有符號右移 >>
無符號右移 >>>
布爾操作布爾操作的重要性不言而喻。布爾操作用來測試兩個值的關系,如果沒有它們,那么如if...else這類的判斷語句也就無用武之地了。
邏輯非 !
邏輯與 &&
邏輯或 ||
邏輯非(!)只操作1個操作數(shù),無論操作數(shù)是什么數(shù)據(jù)類型,都返回一個布爾值。邏輯非操作不會改變操作數(shù)的數(shù)據(jù)類型。
邏輯非(!)操作符的規(guī)則:
1.如果操作數(shù)是一個對象,則返回false。
2.日字旁操作數(shù)是一個空字符串,則返回true。
3.如果操作數(shù)是一個非空字符串,則返回false。
4.如果操作數(shù)值是0,則返回true。
5.如果操作數(shù)是任意非0數(shù)值(包括Infinity),返回false。
6.如果操作數(shù)是null,返回true。
7.如果操作數(shù)是NaN,返回true。
8.如果操作數(shù)是undefined,返回true。
邏輯與有兩個操作數(shù),它可以應用于任何類型的操作數(shù),而不僅僅是布爾值。在有一個操作數(shù)不是布爾值的情況下,邏輯與操作就不一定返回布爾值。
邏輯與(&&)操作符的規(guī)則
1.如果第一個操作數(shù)是對象,則返回第二個操作數(shù)。
2.如果第二個操作數(shù)是對象,則只有在第一個操作數(shù)的求值結果為true時才返回這個對象。
3.如果兩個操作數(shù)都是對象,則返回第二個操作數(shù)。
4.如果有一個操作數(shù)時null,則返回null。
5.如果有一個操作數(shù)時undefined,則返回undefined。
可見邏輯與是一種短路操作,如果第一個操作數(shù)能夠決定結果(如null,undefined),那么就不會對第二個操作數(shù)求值。
var a = {}; var b; a && b; //undefined var a = 3; var b = {}; a && b; //b var a = null; var b = {}; a && b; //null邏輯或(||)
邏輯或的操作數(shù)有兩個,如果其中有一個操作數(shù)不是布爾值,邏輯或也不一定返回布爾值,它遵循的規(guī)則如下:
1.如果第一個操作數(shù)是對象,則返回第一個操作數(shù);
2.如果第一個操作數(shù)求值結果為false,則返回第二個操作數(shù);
3.如果兩個操作數(shù)都為對象,則返回第一個操作數(shù);
4.如果兩個操作數(shù)都是null,則返回null;
5.如果兩個操作數(shù)都是NaN,則返回NaN;
6.如果連個操作數(shù)都是undefined,則返回undefined。
可見邏輯或也是一種短路語句,如果第一個操作數(shù)的求值結果為true則不會對第二個操作數(shù)進行求值。
注意:由以上規(guī)則可知,邏輯操作符均不會改變操作數(shù)的數(shù)據(jù)類型。
利用邏輯與來避免為變量賦null或者undefined的值,如下:
var myObject = preferObject || backupObject;乘性操作符
乘性操作符和其他語言中的乘性操作符用法類似,只不過在操作數(shù)為非數(shù)值的情況下會執(zhí)行自動的類型轉換。即參與乘性計算的某個操作數(shù)不是數(shù)值,會先使用Number()轉型函數(shù)將其轉換為數(shù)值。但是乘性操作不會改變操作數(shù)數(shù)值類型。
乘法(*)
除法(/)
求模(%)
var a = 1; var b = false; a*b; //0 typeof b; //boolean加性操作符
加性操作符在操作數(shù)都為數(shù)值的時候執(zhí)行常規(guī)的加減法操作,在為非數(shù)值時會有特殊的轉化規(guī)則。但是同乘性操作符一樣加性操作符不會改變數(shù)值類型。
加法(+)
減法(-)
加性操作符加性操作符在有操作數(shù)為字符串時遵循以下規(guī)則:
1.如果兩個操作數(shù)都為字符,則將第二個操作數(shù)與第一個操作數(shù)拼接起來;
2.如果只有一個操作數(shù)是字符串,則將另一個操作數(shù)轉換為字符串,然后將兩個字符串拼接起來;
1.如果有一個操作數(shù)是字符串,布爾值、null或者undefined,則先調用Number()方法,然后再根據(jù)數(shù)值減法規(guī)則執(zhí)行減法計算。
2.如果有一個操作數(shù)是對象,則調用對象的valueOf()方法取得該對象的數(shù)值。如果對象沒有valueOf()方法方法,則調用tostring()方法并將得到的字符串轉換為數(shù)值。
小于(<)
大于(>)
小于等于(<=)
大于等于(>=)
相等操作符相等(==)
不相等(!=)
全等(===)
不全等(!==)
相等和不相等這組操作符是先轉換再比較,即操作符會改變操作數(shù)的數(shù)值類型。
1.如果有一個操作數(shù)是布爾值,則在比較之前會轉換為數(shù)值;
2.一個操作數(shù)是字符,另一個是數(shù)值,那么在比較相等性之前會將字符串轉換為數(shù)值再進行比較;
3.如果一個操作符是對象,另一個不是,則調用valueOf()方法,將得到的結果進行比較。
4.如果兩個都是對象,則比較是否是同一個對象,如果兩個操作數(shù)都指向同一個對象,那么認為它們相等。
var a = "3"; var b = 3; a == b; //true typeof a; //number var a = {}; var b = {}; a == b; //false var a = {}; var b = a; var c = a; b == c; //true全等和不全等
全等和不全等操作符不會改變操作數(shù)的數(shù)值類型。
條件操作符value = boolean_expression ? true_value : false_value
條件操作符會根據(jù)boolean_expression的求值結果來決定給變量value賦哪個值,求值為真是賦true_value值,為假時賦false_value值。
賦值操作符賦值(=)
乘/賦值(*=)
初/賦值(/=)
模/賦值(%=)
加/賦值(+=)
減/賦值(-=)
左移/賦值(<<=)
無符號右移/賦值(>>>=)
有符號右移/賦值(>>=)
逗號操作符逗號操作符用于在一條語句中執(zhí)行多個操作。
var num1=1, num2=2, num3=3;操作符優(yōu)先級
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87919.html
摘要:知識點變量作用域上方的函數(shù)作用域中聲明并賦值了,且在之上,所以遵循就近原則輸出等于。上方的函數(shù)作用域中被重新賦值,未被重新聲明,且位于之下,所以輸出全局作用域中的。上方利用方法進行對象的深拷貝可以避免源對象被篡改的可能。 前言 本文是我學習JavaScript過程中收集與整理的一些易錯知識點,將分別從變量作用域,類型比較,this指向,函數(shù)參數(shù),閉包問題及對象拷貝與賦值這6個方面進行由...
摘要:知識點變量作用域上方的函數(shù)作用域中聲明并賦值了,且在之上,所以遵循就近原則輸出等于。上方的函數(shù)作用域中被重新賦值,未被重新聲明,且位于之下,所以輸出全局作用域中的。若執(zhí)行則會輸出。上方利用方法進行對象的深拷貝可以避免源對象被篡改的可能。 前言 本文是我學習JavaScript過程中收集與整理的一些易錯知識點,將分別從變量作用域,類型比較,this指向,函數(shù)參數(shù),閉包問題及對象拷貝與賦值...
摘要:個人前端文章整理從最開始萌生寫文章的想法,到著手開始寫,再到現(xiàn)在已經(jīng)一年的時間了,由于工作比較忙,更新緩慢,后面還是會繼更新,現(xiàn)將已經(jīng)寫好的文章整理一個目錄,方便更多的小伙伴去學習。 showImg(https://segmentfault.com/img/remote/1460000017490740?w=1920&h=1080); 個人前端文章整理 從最開始萌生寫文章的想法,到著手...
閱讀 1232·2021-11-25 09:43
閱讀 1343·2021-09-26 09:55
閱讀 2400·2021-09-10 11:20
閱讀 3371·2019-08-30 15:55
閱讀 1449·2019-08-29 13:58
閱讀 1173·2019-08-29 12:36
閱讀 2350·2019-08-29 11:18
閱讀 3414·2019-08-26 11:47