JS (位運(yùn)算符)

位運(yùn)算符:

位運(yùn)算符只針對(duì)數(shù)字的二進(jìn)制形式進(jìn)行。

var v1 = 5; //這是10進(jìn)制,二進(jìn)制其實(shí)是:101,在計(jì)算機(jī)內(nèi)部其實(shí)類似這樣: 00000101

var v2 = 6; //這是10進(jìn)制,二進(jìn)制其實(shí)是:110,在計(jì)算機(jī)內(nèi)部其實(shí)類似這樣: 00000110

按位與:

符號(hào): &

含義:將兩個(gè)二進(jìn)制數(shù)字的對(duì)應(yīng)位上的數(shù)字進(jìn)行“與運(yùn)算”,結(jié)果還是這些位運(yùn)算的結(jié)果組成的二進(jìn)制數(shù)所代表的值。

解釋:二進(jìn)制數(shù)字進(jìn)行“與運(yùn)算”的規(guī)則是:

1 & 1 è 1

1 & 0 è 0

0 & 1 è 0

0 & 0 è 0

舉例:

var v1 = 5,? v2 = 6,運(yùn)算圖示為:

v1=5 0 0 0 0 0 1 0 1

v2=6 0 0 0 0 0 1 1 0

v1 & v2 0 0 0 0 0 1 0 0

var v3 = v1 & v2 = 00000100(2) = 4(10)

按位或:

符號(hào): |

含義:將兩個(gè)二進(jìn)制數(shù)字的對(duì)應(yīng)位上的數(shù)字進(jìn)行“或運(yùn)算”,結(jié)果是這些位運(yùn)算的結(jié)果組成的二進(jìn)制數(shù)所代表的值。

解釋:二進(jìn)制數(shù)字進(jìn)行“或運(yùn)算”的規(guī)則是:

1 | 1 è 1

1 | 0 è 1

0 | 1 è 1

0 | 0 è 0

按位非:

符號(hào): ~ //這是一個(gè)“單目運(yùn)算符”

含義:將一個(gè)二進(jìn)制數(shù)字的對(duì)應(yīng)位上的數(shù)字進(jìn)行“非運(yùn)算”,結(jié)果是這些二進(jìn)制數(shù)字所代表的值。

解釋:二進(jìn)制數(shù)字進(jìn)行“非運(yùn)算”的規(guī)則是:

~1? è? 0

~0? è? 1

按位左移運(yùn)算:

符號(hào): <<

含義: 將一個(gè)二進(jìn)制數(shù)的每一個(gè)位上的數(shù)字往左邊移動(dòng)指定的位數(shù),并且左邊“冒”出去的就不管了(不算了),右邊空出來的位上填入“0”,得到的結(jié)果就是該二進(jìn)制數(shù)字所代表的值。

舉例:

var v1 = 5;var? v2 = 5 << 2; 運(yùn)算圖示為:

v1=5 0 0 0 0 0 1 0 1

v2= 5 << 2 0 0 0 1 0 1 0 0

var v2 = 5 << 2 = 00010100(2) = 1 * 24 + 1*22 = 16+4 = 20(10)

按位左移運(yùn)算:

符號(hào): >>

含義: 將一個(gè)二進(jìn)制數(shù)的每一個(gè)位上的數(shù)字往右邊移動(dòng)指定的位數(shù),并且右邊“冒”出去的就不管了(不算了),左邊空出來的位上填入原來的左邊的數(shù)字,得到的結(jié)果就是該二進(jìn)制數(shù)字所代表的值。

舉例:

var v1 = 5;var? v2 = 5 >> 2; 運(yùn)算圖示為:

v1=5 0 0 0 0 0 1 0 1

v2= 5 >> 2 0 0 0 0 0 0 0 1

var v2 = 5 >> 2 = 00000001(2) = 1(10)

運(yùn)算符其他內(nèi)容:

賦值運(yùn)算符:其實(shí)就一個(gè)基本的賦值運(yùn)算符: = ,其含義是將等號(hào)右邊的數(shù)據(jù)放到等號(hào)左邊的變量中去。

錯(cuò)誤的語法:

var v1 = 1,? v2 = 2,? v3 = 5,? v4 = -2;

v1 + v2 = v3 + v4; //錯(cuò),大錯(cuò),大錯(cuò)特錯(cuò)

復(fù)合賦值運(yùn)算符: +=? -=? *=? /=? %=

運(yùn)算符的優(yōu)先級(jí) —— 太多,較為復(fù)雜,記不住,但請(qǐng)記住一下幾條規(guī)則:

1, 要心如明鏡:運(yùn)算符有優(yōu)先級(jí)(先后順序)問題。

2, 括號(hào)最優(yōu)先,等號(hào)(賦值)最落后。

3, 先乘除后加減

4, 想不清楚或用不明白的,使用括號(hào)來解決

5, 括號(hào)只有小括號(hào),可以一層層嵌套。

舉例:

var? year = 2013;

//判斷閏年:一個(gè)年份能被4整除并且不能被100整除是閏年,或者能被400整除,也是閏年。

if (? ( (year? %? 4 == 0)? &&? (year % 100 != 0) )? ||? (year % 400 == 0)? )

{? documment.write(? year? + “是閏年”)? ;}

數(shù)據(jù)的傳值方式:

var v1 = 10;

var v2 = v1;? ? //將v1中值拷貝一份,放到v2這個(gè)變量中去了——此時(shí)也可以說成“將v1的值傳遞給v2”

var v1 = v1 + v1;? ? //v1的值改變了,但并不影響v2——因?yàn)関2本身也是一個(gè)獨(dú)立的變量。document.write(“<br/>v1=" + v1);? ? ? ? //20

document.write("<br/>v2=" + v2);? ? ? ? //10

上述“v2 = v1”就稱為“拷貝傳值”——取得v1的值并拷貝一份,然后賦值給v2

拷貝傳值圖示如下:

圖片發(fā)自簡(jiǎn)書App

var v3 = {name:"小花", age:18, edu:"大學(xué)" };? ? //這是一個(gè)所謂“對(duì)象”類型——其中包括了3個(gè)數(shù)據(jù)。

//操作其中的數(shù)據(jù)類似這樣:document.write("<br />v3這個(gè)對(duì)象的年齡為:" + v3.age);

v3.age = 19;? //v3這個(gè)對(duì)象的age這項(xiàng)數(shù)據(jù)的值重復(fù)賦了一個(gè)新值,類似前面v1 = 20;

var v4 = v3;? ? //此時(shí),是將v3這個(gè)變量的“內(nèi)存地址”傳遞給v4這個(gè)變量,而v3這個(gè)對(duì)象的數(shù)據(jù)本身其實(shí)只是由該地址來獲取。——這就叫做引用傳值——此時(shí),其實(shí)這兩個(gè)變量是一樣的數(shù)據(jù)內(nèi)容,類似一個(gè)人的多個(gè)名字:真名,藝名,網(wǎng)名,小名

document.write("<br />v4這個(gè)對(duì)象的年齡為:" + v4.age);

v3.age = 20;? //

document.write("<br />此時(shí),v4這個(gè)對(duì)象的年齡為:" + v4.age);

圖示:


注意: 基本(簡(jiǎn)單)數(shù)據(jù)類型的變量名和數(shù)據(jù)是直接存在“快速內(nèi)存”(棧內(nèi)存)中,而復(fù)合數(shù)據(jù)類型(對(duì)象和數(shù)組)的存儲(chǔ)分兩個(gè)部分:實(shí)際數(shù)據(jù)存在“慢速內(nèi)存”(堆內(nèi)存)中,棧內(nèi)存中只存變量名和數(shù)據(jù)在堆內(nèi)存中的位置(地址)。如圖所示:

圖片發(fā)自簡(jiǎn)書App

總結(jié):? ? ? ? 在js中,基本數(shù)據(jù)類型使用“拷貝傳值”——傳值的時(shí)候直接就出現(xiàn)了一份新的數(shù)據(jù)(當(dāng)然同時(shí)也是另一個(gè)變量所代表)

? ? ? 復(fù)合數(shù)據(jù)類型(數(shù)組和對(duì)象)使用“引用傳值”——傳值的時(shí)候只是做了一個(gè)地址指向,數(shù)據(jù)仍然只有一份,兩個(gè)變量就指向這同一份數(shù)據(jù)。

if分支結(jié)構(gòu):

控制結(jié)構(gòu):就是使用一定的語法來控制我們程序執(zhí)行的流程——也可以叫“流程控制結(jié)構(gòu)”

分支就是“多條路徑,走一條”。

最簡(jiǎn)形式:

//如果此條件滿足(即條件判斷的結(jié)果是true),則會(huì)執(zhí)行其中的語句塊,否則什么也不做。

if(? 條件判斷語句? )

{

//要執(zhí)行的語句塊——語句塊其實(shí)就是一種表示“n條語句”泛泛說法。

}

二選一分支形式:含義是兩條路,必走一條。

if(? 條件判斷語句? )

{

//要執(zhí)行的語句塊1——前面條件成立時(shí)執(zhí)行

}

else

{

//要執(zhí)行的語句塊2——前面條件不成立時(shí)執(zhí)行

}

多選一分支結(jié)構(gòu):多條路根據(jù)條件的滿足情況走其中一條,但也可能一條都不走:

if(? 條件判斷1 ) //如果此條件滿足,則執(zhí)行語句塊1,然后if就結(jié)束了

{

//語句塊1

}

else? if ( 條件判斷2? ) //如果條件1不滿足,則判斷條件2:如果滿足,則執(zhí)行語句塊2,并結(jié)束if

{

//語句塊2

}

else? if ( 條件判斷3? ) //如果條件2不滿足,則判斷條件3:如果滿足,則執(zhí)行語句塊3,并結(jié)束if

{

//語句塊3

}

…………………… //依此類推。。。。。。如果沒有一個(gè)條件滿足,則其實(shí)到最后什么也不會(huì)執(zhí)行,if結(jié)束。

綜合型式:

if(? 條件判斷1 ) //如果此條件滿足,則執(zhí)行語句塊1,然后if就結(jié)束了

{

//語句塊1

}

else? if ( 條件判斷2? ) //如果條件1不滿足,則判斷條件2:如果滿足,則執(zhí)行語句塊2,并結(jié)束if

{

//語句塊2

}

else? if ( 條件判斷3? ) //如果條件2不滿足,則判斷條件3:如果滿足,則執(zhí)行語句塊3,并結(jié)束if

{

//語句塊3

}

…………….? //依此類推。。。。。。

else

{

//最后的else語句塊。 //此語句塊會(huì)在前面條件都不滿足的時(shí)候去執(zhí)行。

}

注意:綜合型式中是必有一條分支(語句塊)會(huì)得到執(zhí)行。

switch分支結(jié)構(gòu):

switch的分支結(jié)構(gòu)整體含義跟if類似,也是表示“多條路走一條”,其使用形式:

switch (? 一個(gè)變量或表達(dá)式? ) //不管是變量還是表達(dá)式,最終都代表一個(gè)“值”,我們用v1來說話

{

case? 固定值1: //如果v1等于本值1,則會(huì)執(zhí)行語句塊1

//語句塊1;

break; //退出此switch結(jié)構(gòu)

case? 固定值2: 如果v1不等于前面值1,則繼續(xù)判斷是否等于這里的值2,如果相等,執(zhí)行語句2

//語句塊2;

break; //退出此switch結(jié)構(gòu)

case? ………………………………

。。。。。。。。。。。。。。。。。

default: //如果前面各個(gè)判斷都不成立(也就是不相等),則會(huì)執(zhí)行此語句塊。

//注意:switch中此default語句塊可以沒有。

//默認(rèn)語句塊

}

特別注意:if語句其實(shí)是可以使用非常靈活的條件判斷,比如? >? >=? <? <=? ==? !=? ===? ,但,switch這里case的判斷,只能有一種判斷:相等判斷。

while循環(huán)結(jié)構(gòu):

循環(huán)的基本觀念:

1, 循環(huán)就是讓某些程序(語句塊)反復(fù)執(zhí)行

2, 循環(huán)必須能夠有辦法停止——計(jì)算機(jī)沒有自己的判斷能力去決定“累了,不做了”

while循環(huán)的基本語法形式:

while? (? 條件判斷? ) //如果條件判斷滿足了,則會(huì)執(zhí)行其中的語句塊,否則while結(jié)束。

{

//要執(zhí)行的語句塊

} //如果此語句塊執(zhí)行完了,會(huì)立即回到前面while的位置繼續(xù)判斷。

上述形式只是語法上的基本要求,但,在“實(shí)用”中,通常會(huì)需要遵照如下模式:

【循環(huán)變量初始化】

while? (? 【循環(huán)變量作為條件判斷】 )

{

//循環(huán)體,就是要反復(fù)執(zhí)行的語句塊

【循環(huán)變量值的改變】

}

do while循環(huán)結(jié)構(gòu):

do while循環(huán)是一種會(huì)先執(zhí)行一次,然后再根據(jù)判斷條件來決定是否繼續(xù)執(zhí)行并循環(huán)的一種循環(huán)結(jié)構(gòu)。

do while的實(shí)用形式如下:

【循環(huán)變量初始化】

do

{

//循環(huán)體,就是要反復(fù)執(zhí)行的語句塊

【循環(huán)變量值的改變】

} while? (? 【循環(huán)變量作為條件判斷】 ) ;

描述: 先執(zhí)行do后面打括號(hào)中的語句塊,然后再進(jìn)行while語句中的條件判斷,如果判斷成立(true),則繼續(xù)回到上面do后面的大括號(hào)中執(zhí)行語句塊,否則就結(jié)束。

for循環(huán)結(jié)構(gòu)——推薦使用:

for循環(huán)基本形式:

for(? 【循環(huán)變量初始化A】; 【循環(huán)變量作為條件判斷B】; 【循環(huán)變量值的改變C】? )

{

//循環(huán)體D,也就是要反復(fù)執(zhí)行的語句塊

}

for循環(huán)的執(zhí)行邏輯(順序):

A? è? Bètrue? è D? è? C? è Bètrue? è D? è C? è Bè

? ┗èfalseèfor循環(huán)結(jié)束 ┗èfalseèfor循環(huán)結(jié)束

var a = new Date(); //new Date() 就是指“系統(tǒng)時(shí)間”,該時(shí)間其實(shí)就是一個(gè)“復(fù)合數(shù)據(jù)”,其中包括了時(shí)間(日期)中的各項(xiàng)值,比如年份數(shù),月份數(shù),時(shí)分秒,星期等等。其中每個(gè)數(shù)據(jù)都是一個(gè)“數(shù)字”而已。

var week = a.getDay(); //獲取今天系統(tǒng)時(shí)間對(duì)應(yīng)的星期,這里獲取的星期只是一個(gè)0到6的數(shù)而已。0代表禮拜天,1代表禮拜一。

昨日回顧

位運(yùn)算符:指對(duì)二進(jìn)制數(shù)字進(jìn)行的運(yùn)算

按位左移:將所有數(shù)位往左邊移動(dòng)指定的位數(shù),左邊冒出去的不管,右邊補(bǔ)0

按位右移:將所有數(shù)位往右邊移動(dòng)指定的位數(shù),右邊冒出去的不管,左邊補(bǔ)原來左邊的數(shù)字(0或1)

按位與:將兩個(gè)二進(jìn)制數(shù)字的對(duì)應(yīng)位進(jìn)行二進(jìn)制數(shù)的“相與”(只有兩個(gè)是1才是1)

按位或:將兩個(gè)二進(jìn)制數(shù)字的對(duì)應(yīng)位進(jìn)行二進(jìn)制數(shù)的“相或”(只有兩個(gè)是0才是0)

按位非:將一個(gè)二進(jìn)制數(shù)字的每一位“取反”所得結(jié)果。

傳值方式:指將一個(gè)變量(A)的值傳給另一個(gè)變量(B)的時(shí)候的不同機(jī)制問題

拷貝傳值:將變量A的值做一份“拷貝”,并賦值給另一個(gè)變量B——B和A此時(shí)是兩個(gè)相互獨(dú)立的變量,但此時(shí)的值相同(相等)——js中,基本數(shù)據(jù)類型使用拷貝傳值。

引用傳值:將變量A的實(shí)際數(shù)據(jù)的“地址”拷貝給變量B(并沒有拷貝數(shù)據(jù))——B和A是兩個(gè)有關(guān)系的變量,即他們實(shí)際上就是指“一份數(shù)據(jù)”,類似“同樣的內(nèi)容不同的名字”——在js中,復(fù)合數(shù)據(jù)類型使用引用傳值。

流程控制之 if? 分支結(jié)構(gòu)

if( 條件判斷1 )

{

//語句塊1

}

else? if( 條件判斷2 )

{

//語句塊2

}

else? if( 條件判斷3 )

{

//語句塊3

}

。。。。。。。。。。。。

else

{

//else語句塊

}

流程控制之 switch 分支結(jié)構(gòu)

switch (? 一個(gè)變量或表達(dá)式? ) //這里最終都應(yīng)該是一個(gè)“值”

{

case? 值1:

語句塊1

break;

case? 值2:

語句塊2

break;

。。。。。。。。。。。。。。。。。。

default:

默認(rèn)語句塊

}

流程控制之 while 循環(huán)結(jié)構(gòu)

循環(huán)變量的初始化

while? (? 循環(huán)變量判斷 )

{

//語句塊

循環(huán)變量的改變

}

流程控制之 do while 循環(huán)結(jié)構(gòu)

循環(huán)變量的初始化

do

{

//語句塊

循環(huán)變量的改變

}

while (? 循環(huán)變量判斷 );

流程控制之 for 循環(huán)結(jié)構(gòu)

for(? 循環(huán)變量的初始化;循環(huán)變量判斷;循環(huán)變量的改變 )

{

//語句塊

}

昨日回顧

位運(yùn)算符:指對(duì)二進(jìn)制數(shù)字進(jìn)行的運(yùn)算

按位左移:將所有數(shù)位往左邊移動(dòng)指定的位數(shù),左邊冒出去的不管,右邊補(bǔ)0

按位右移:將所有數(shù)位往右邊移動(dòng)指定的位數(shù),右邊冒出去的不管,左邊補(bǔ)原來左邊的數(shù)字(0或1)

按位與:將兩個(gè)二進(jìn)制數(shù)字的對(duì)應(yīng)位進(jìn)行二進(jìn)制數(shù)的“相與”(只有兩個(gè)是1才是1)

按位或:將兩個(gè)二進(jìn)制數(shù)字的對(duì)應(yīng)位進(jìn)行二進(jìn)制數(shù)的“相或”(只有兩個(gè)是0才是0)

按位非:將一個(gè)二進(jìn)制數(shù)字的每一位“取反”所得結(jié)果。

傳值方式:指將一個(gè)變量(A)的值傳給另一個(gè)變量(B)的時(shí)候的不同機(jī)制問題

拷貝傳值:將變量A的值做一份“拷貝”,并賦值給另一個(gè)變量B——B和A此時(shí)是兩個(gè)相互獨(dú)立的變量,但此時(shí)的值相同(相等)——js中,基本數(shù)據(jù)類型使用拷貝傳值。

引用傳值:將變量A的實(shí)際數(shù)據(jù)的“地址”拷貝給變量B(并沒有拷貝數(shù)據(jù))——B和A是兩個(gè)有關(guān)系的變量,即他們實(shí)際上就是指“一份數(shù)據(jù)”,類似“同樣的內(nèi)容不同的名字”——在js中,復(fù)合數(shù)據(jù)類型使用引用傳值。

流程控制之 if? 分支結(jié)構(gòu)

if( 條件判斷1 )

{

//語句塊1

}

else? if( 條件判斷2 )

{

//語句塊2

}

else? if( 條件判斷3 )

{

//語句塊3

}

。。。。。。。。。。。。

else

{

//else語句塊

}

流程控制之 switch 分支結(jié)構(gòu)

switch (? 一個(gè)變量或表達(dá)式? ) //這里最終都應(yīng)該是一個(gè)“值”

{

case? 值1:

語句塊1

break;

case? 值2:

語句塊2

break;

。。。。。。。。。。。。。。。。。。

default:

默認(rèn)語句塊

}

流程控制之 while 循環(huán)結(jié)構(gòu)

循環(huán)變量的初始化

while? (? 循環(huán)變量判斷 )

{

//語句塊

循環(huán)變量的改變

}

流程控制之 do while 循環(huán)結(jié)構(gòu)

循環(huán)變量的初始化

do

{

//語句塊

循環(huán)變量的改變

}

while (? 循環(huán)變量判斷 );

流程控制之 for 循環(huán)結(jié)構(gòu)

for(? 循環(huán)變量的初始化;循環(huán)變量判斷;循環(huán)變量的改變 )

{

//語句塊

}

昨日回顧

位運(yùn)算符:指對(duì)二進(jìn)制數(shù)字進(jìn)行的運(yùn)算

按位左移:將所有數(shù)位往左邊移動(dòng)指定的位數(shù),左邊冒出去的不管,右邊補(bǔ)0

按位右移:將所有數(shù)位往右邊移動(dòng)指定的位數(shù),右邊冒出去的不管,左邊補(bǔ)原來左邊的數(shù)字(0或1)

按位與:將兩個(gè)二進(jìn)制數(shù)字的對(duì)應(yīng)位進(jìn)行二進(jìn)制數(shù)的“相與”(只有兩個(gè)是1才是1)

按位或:將兩個(gè)二進(jìn)制數(shù)字的對(duì)應(yīng)位進(jìn)行二進(jìn)制數(shù)的“相或”(只有兩個(gè)是0才是0)

按位非:將一個(gè)二進(jìn)制數(shù)字的每一位“取反”所得結(jié)果。

傳值方式:指將一個(gè)變量(A)的值傳給另一個(gè)變量(B)的時(shí)候的不同機(jī)制問題

拷貝傳值:將變量A的值做一份“拷貝”,并賦值給另一個(gè)變量B——B和A此時(shí)是兩個(gè)相互獨(dú)立的變量,但此時(shí)的值相同(相等)——js中,基本數(shù)據(jù)類型使用拷貝傳值。

引用傳值:將變量A的實(shí)際數(shù)據(jù)的“地址”拷貝給變量B(并沒有拷貝數(shù)據(jù))——B和A是兩個(gè)有關(guān)系的變量,即他們實(shí)際上就是指“一份數(shù)據(jù)”,類似“同樣的內(nèi)容不同的名字”——在js中,復(fù)合數(shù)據(jù)類型使用引用傳值。

流程控制之 if? 分支結(jié)構(gòu)

if( 條件判斷1 )

{

//語句塊1

}

else? if( 條件判斷2 )

{

//語句塊2

}

else? if( 條件判斷3 )

{

//語句塊3

}

。。。。。。。。。。。。

else

{

//else語句塊

}

流程控制之 switch 分支結(jié)構(gòu)

switch (? 一個(gè)變量或表達(dá)式? ) //這里最終都應(yīng)該是一個(gè)“值”

{

case? 值1:

語句塊1

break;

case? 值2:

語句塊2

break;

。。。。。。。。。。。。。。。。。。

default:

默認(rèn)語句塊

}

流程控制之 while 循環(huán)結(jié)構(gòu)

循環(huán)變量的初始化

while? (? 循環(huán)變量判斷 )

{

//語句塊

循環(huán)變量的改變

}

流程控制之 do while 循環(huán)結(jié)構(gòu)

循環(huán)變量的初始化

do

{

//語句塊

循環(huán)變量的改變

}

while (? 循環(huán)變量判斷 );

流程控制之 for 循環(huán)結(jié)構(gòu)

for(? 循環(huán)變量的初始化;循環(huán)變量判斷;循環(huán)變量的改變 )

{

//語句塊

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容