多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 互聯(lián)網(wǎng) > JavaScript隱式類型轉(zhuǎn)換

JavaScript隱式類型轉(zhuǎn)換

來源:程序員人生   發(fā)布時間:2014-10-10 08:00:00 閱讀次數(shù):2985次

        編程中少不了將某個數(shù)據(jù)類型轉(zhuǎn)換成另一種數(shù)據(jù)類型。其中通過函數(shù)或者方法調(diào)用以及強制轉(zhuǎn)換稱為顯示轉(zhuǎn)換,相反的,在"不知情"的情況下"有意"的進行的轉(zhuǎn)換,則稱為隱士轉(zhuǎn)換。

運算符中的隱士類型轉(zhuǎn)換

        比較常見隱士類型轉(zhuǎn)換,很多語言中都存在的。這里僅僅說說JavaScript中存在的。

        1、"+"運算符

function add(){ var a ='2'; var b =2; var c = a + b; console.info(c); //輸出22 console.info(typeof c); //輸出string } add();

       這里js(ECMASCRIPT)引擎將會把b編程字符串'2'再與a進行連接,最后變成了"22"。很多語言的"+"運算符都是這樣處理的。這一過程是隱式進行的,js引擎幫助我們完成的。而且利用"+"這個特性,可以很方便的將Number類型轉(zhuǎn)換為string類型。例如:

var number = 12; var c = '' + number; console.info(typeof number); //number console.info(typeof c); //string

       2、"-"運算符

       “-”可以是一元運算符(取負),也可以是二元運算符(減法),"-"也會進行隱式類型轉(zhuǎn)換,例如

var var1 = 234; var var2 ="432"; var c = var1 - var2; console.info(c); //-198 console.info(typeof c); //number

      可以看出的是"-"的特性與"+"正好相反,會把字符串b隱士的轉(zhuǎn)換成數(shù)字再進行減法運算。利用這個特性,可以很方便的將string轉(zhuǎn)換為number

var var3 = '12'; var var4 = var3 -''; console.info(var4); //12 console.info(typeof var4); //number

      3、* and 運算符

       和"+"、“-”乘法和除法也會進行隱式類型的轉(zhuǎn)換(轉(zhuǎn)換為number再進行計算)。

var var1 = "1"; var var2 = "2"; var var3 = "20"; var var4 = var1 * var2; console.info(var4); //2 console.info(typeof var4) //number var var5 = var4/var3 ; console.info(var5); //0.1 console.info(typeof var5); //number

       4、遞增遞減操作符(前置、后置)

       這類操作符適用于任何數(shù)據(jù)類型的值,針對不同類型的值,該操作符遵循以下的轉(zhuǎn)換規(guī)則:

       1、如果是包含有效數(shù)字字符的字符串,先將其轉(zhuǎn)換為數(shù)值(同Number()),再執(zhí)行加減操作,字符串變?yōu)閿?shù)值變量

       2、如果不包含有效數(shù)字字符串,將變量的值置為NaN,字符串變量變?yōu)閿?shù)值變量。

       3、如果是布爾值false,轉(zhuǎn)換為0進行運算。

       4、如果是布爾值true,轉(zhuǎn)換為1進行運算。

       5、如果是浮點數(shù)值,直接進行加減1操作。

       6、如果是對象,先調(diào)用對象對的valueOf()方法,之后按照前5點進行轉(zhuǎn)換,如果結(jié)果是NaN,調(diào)用toString()方法后應(yīng)用前面規(guī)則進行判斷。

       5、邏輯操作符(!、&&、||)

           邏輯非(!)操作符首先通過Boolean()函數(shù)將他的操作值轉(zhuǎn)換為布爾值,然后求反。

           邏輯與(&&)

           1、如果第一個操作數(shù)經(jīng)Boolean()轉(zhuǎn)換后為true,則返回第二個操作值,否則返回第一個值(不是Boolean()轉(zhuǎn)換后的值)

           2、如果有一個操作值為null.返回null

           3、如果有一個操作值為NaN,返回NaN

           4、如果有一個操作值為undefined,返回undefined

           邏輯或(||),如果一個操作值不是布爾值,遵循以下規(guī)則:

           1、如果第一個操作值經(jīng)Boolean()轉(zhuǎn)換后為false,則返回第二個操作值,否則返回第一個操作值(非Boolean()轉(zhuǎn)換后的值)

           2、對于undefined、null和NaN處理規(guī)則與邏輯與相同

        6、關(guān)系操作符(<,>,<=,>=)

           和上述操作符一樣,關(guān)系操作符的操作值也可以是任意類型的,所以使用非數(shù)值類型參與比較時也需要系統(tǒng)進行隱式類型轉(zhuǎn)換;

           1、兩個操作值都是數(shù)值,直接比較

           2、兩個字符都是字符串,字符串編碼進行比較

           3、一個數(shù)值,另一個轉(zhuǎn)換為數(shù)值進行比較

           4、一個操作數(shù)是對象,調(diào)用valueOf()|toString(),之后按照1、2進行比較

           5、一個操作值是布爾值,則將其轉(zhuǎn)換為數(shù)值,再進行比較。

       tips:NaN是非常特殊的值,不和任何類型的值相等,包括自己,同時它與任何類型的值比較大小時都返回false。

       7、相等操作符== and ===

         相等操作符也會對操作值進行隱式轉(zhuǎn)換后進行比較

         1、布爾值、字符串和數(shù)值進行比較,轉(zhuǎn)換為數(shù)值之后在進行比較

         2、null與undefined是相等的

         3、與NaN判等,返回false

         TIPS: == 和 === 區(qū)別

          1、對于Array,Object等高級類型,兩者無區(qū)別:進行“地址”比較

          2、對于基礎(chǔ)類型==判斷值是否相等,===不僅判斷值,而且判斷類型是否相等。

          3、基礎(chǔ)類型與高級類型有區(qū)別:==將高級類型轉(zhuǎn)化為基礎(chǔ)類型,進行“值”比較,===直接返回false

語句中的隱式轉(zhuǎn)換

       在JavaScript語法中也存在者隱式類型轉(zhuǎn)換,其中有if,while,for in,for in在定義對象字面量時發(fā)生從標(biāo)識符到字符串的隱式轉(zhuǎn)換

 

var ary = [1,3,5,7]; for(var a in ary){ alert(a + ": " + typeof a); }

    數(shù)組的索引其實也是字符串類型。

      alert時存在的隱式轉(zhuǎn)換

String.prototype.fn = function(){return this}; var a = 'hello'; alert(typeof a.fn()); //-->object alert(a.fn()); //-->hello

     string原型上添加了fn方法,該方法返回this也就是當(dāng)前的實例對象,無可厚非的是typeof a.fn()是Object類型,可以alert(a.fn())卻將object對象隱式的轉(zhuǎn)為了字符串"hello"顯示。

     同理,數(shù)值類型的也一樣:

Number.prototype.fn = function(){return this}; var a = 10; alert(typeof a.fn());//-->object alert(a.fn()); //-->10

總結(jié)

       我相信js中的隱式類型轉(zhuǎn)換的怪癖不止這么一點點,由于js是一種弱類型的語言,造成了coding時的靈活性,可以將不同類型進行比較等操作(js隱式轉(zhuǎn)換),這可能讓人感覺的詫異和不舒服。這種機制是否容易出錯,其實不必過于擔(dān)心,因為大部分的情況下,我們不需要轉(zhuǎn)換,我們很少進行不同類型的比較(若有,不是更方便了嘛)。


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产欧美日韩图片一区二区 | 国产午夜亚洲精品久久www | 美女又黄又免费 | 黄a毛片| 国产视频 每日更新 | 精品国产福利在线观看网址2022 | 日韩精品久久久毛片一区二区 | 亚洲国产成人久久精品影视 | 在线播放性xxx欧美 在线播放亚洲美女视频网站 | 另类zoofilia杂交videos | 特黄色一级毛片 | 77777网站 | 欧美成人精品一区二三区在线观看 | 爱爱www在线观看视频高清 | 伊人啪啪网 | 欧美日韩不卡视频一区二区三区 | 久久精品国产亚洲网址 | 午夜在线视频国产极品片 | 国产精品一区伦免视频播放 | 国产精品极品美女自在线看免费一区二区 | 亚洲欧美视频在线观看 | 视频在线观看免费 | 亚洲三级视频在线 | 成人精品一区二区久久 | 久久精品欧美日韩精品 | free性欧美另类高清 | www.黄色网址| 免费一级肉体全黄毛片高清 | 精彩视频一区二区三区 | 久久精品中文字幕不卡一二区 | 亚洲视频精选 | 国产亚洲一区在线 | 日韩久久中文字幕 | h网站在线看| 欧洲福利视频 | 综合欧美视频一区二区三区 | 欧美jjzz | 亚洲天堂最新地址 | 久久精品视频观看 | 春意午夜影院 | 成人精品一区二区三区校园激情 |