日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

有趣的JavaScript隱式類型轉換操作實例分析

瀏覽:186日期:2023-10-31 11:32:02

本文實例講述了JavaScript隱式類型轉換操作。分享給大家供大家參考,具體如下:

JavaScript的數據類型是非常弱的(不然不會叫它做弱類型語言了)!在使用算術運算符時,運算符兩邊的數據類型可以是任意的,比如,一個字符串可以和數字相加。之所以不同的數據類型之間可以做運算,是因為JavaScript引擎在運算之前會悄悄的把他們進行了隱式類型轉換的,如下是數值類型和布爾類型的相加:

3 + true; // 4

結果是一個數值型!如果是在C或者Java環境的話,上面的運算肯定會因為運算符兩邊的數據類型不一致而導致報錯的!但是,在JavaScript中,只有少數情況下,錯誤類型才會導致出錯,比如調用非函數,或者讀取null或者undefined的屬性時,如下:

'hello'(1); // error: not a functionnull.x; // error: cannot read property ’x’ of null

多數情況下,JavaScript都不會出錯的,而是自動的進行相應的類型轉換。比如-, *, /,和%等算術運算符都會把操作數轉換成數字的,但是“+”號就有點不一樣了,有些情況下,它是算術加號,有些情況下,是字符串連接符號,具體的要看它的操作數,如下:

2 + 3; // 5'hello' + ' world'; // 'hello world'

但是,如果字符串和數字相加,會是怎樣的結果呢?JavaScript會自動把數字轉換成字符的,不管數字在前還是字符串在前,如下:

'2' + 3; // '23'2 + '3'; // '23'

字符串和數字相加結果是字符串,字符串和數字相加結果是字符串,字符串和數字相加結果是字符串,重要的事情說三遍!!!!!!

此外,需要注意的是,“+”的運算方向是從左到右的,如下:

1 + 2 + '3'; // '33'

這與下面是等價的:

(1 + 2) + '3'; // '33'

相比之下,下面的結果是不一樣的:

1 + '2' + 3; // '123'

但是,隱式類型轉換,有時候,會隱藏一些錯誤的,比如,null會轉換成0,undefined會轉換成NaN。需要注意的是,NaN和NaN是不相等的(這是由于浮點數的精度決定的),如下:

var x = NaN;x === NaN; // false

雖然,JavaScript提供了isNaN來檢測某個值是否為NaN,但是,這也不太精確的,因為,在調用isNaN函數之前,本身就存在了一個隱式轉換的過程,它會把那些原本不是NaN的值轉換成NaN的,如下:

isNaN('foo'); // trueisNaN(undefined); // trueisNaN({}); // trueisNaN({ valueOf: 'foo' }); // true

上面代碼,我們使用isNaN來測試后,發現字符串,undefined,甚至對象,結果都返回真!!!但是,我們總不能說他們也是NaN吧?總而言之,得出的結論是:isNaN檢測NaN并不可靠!!!

幸運的是,有一種可靠的并且準確的方法可以檢測NaN。我們都知道,只有NaN是自己不等自己的,那么,我們就以使用不等于號(!==)來判斷一個數是否等于自身,從而,可以檢測到NaN了,如下:

var a = NaN;a !== a; // truevar b = 'foo';b !== b; // falsevar c = undefined;c !== c; // falsevar d = {};d !== d; // falsevar e = { valueOf: 'foo' };e !== e; // false

我們也可以把這種模式定義成一個函數,如下:

function isReallyNaN(x) { return x !== x;}

OK,NaN的檢測方法就是這么簡單,我們下面繼續討論對象的隱式轉換!

對象是可以轉換成原始值的,最常見的方法就是把它轉換成字符串,如下:

'the Math object: ' + Math; // 'the Math object: [object Math]''the JSON object: ' + JSON; // 'the JSON object: [object JSON]'

對象轉換成字符串是調用了他的toSting函數的,你可以手動的調用它來檢測一下:

Math.toString(); // '[object Math]'JSON.toString(); // '[object JSON]'

類似的,對象也是可以轉換成數字的,他是通過valueOf函數的,當然,你也是可以自定義這個valueOf函數的,如下:

'J' + { toString: function() { return 'S'; } }; // 'JS'2 * { valueOf: function() { return 3; } }; // 6

如果,一個對象同時存在valueOf方法和toString方法,那么,valueOf方法總是會被優先調用的,如下:

var obj = { toString: function() { return '[object MyObject]'; }, valueOf: function() { return 17; }};'object: ' + obj; // 'object: 17'

但是,多數情況下,這都不是我們想要的,一般的,盡可能使valueOf和toString表示的值相同(盡管類型可以不同)。

最后一種強制類型轉換,我們常常稱之為“真值運算”,比如,if, ||, &&,他們的操作數不一定是布爾型的額。JavaScript會通過簡單的轉換規則,將一些非布爾類型的值轉換成布爾型的。大多數的值都會轉換成true,只有少數的是false,他們分別是:false, 0, -0, '', NaN, null, undefined,因為存在數字和字符串以及對象的值為false,所以,直接用真值轉換來判斷一個函數的參數是否傳進來了,這是不不太安全的。比如,有一個可以具有默認值得可選參數的函數,如下:

function point(x, y) {if (!x) { x = 320;}if (!y) { y = 240;} return { x: x, y: y };}

這個函數會忽略任何的真值為假的參數的,包括0,-0;

point(0, 0); // { x: 320, y: 240 }

檢測undefined的更加準確的方法是用typeof操作:

function point(x, y) {if (typeof x === 'undefined') { x = 320;}if (typeof y === 'undefined') { y = 240;} return { x: x, y: y };}

這種寫法,可以區分開0和undefined的:

point(); // { x: 320, y: 240 }point(0, 0); // { x: 0, y: 0 }

另外一種方法是利用參數跟undefined作比較,如下:

if (x === undefined) { ... }

總結:

1. 類型錯誤有可能會被類型轉換所隱藏。2. “+”既可以表示字符串連接,又可以表示算術加,這取決于它的操作數,如果有一個為字符串的,那么,就是字符串連接了。3. 對象通過valueOf方法,把自己轉換成數字,通過toString方法,把自己轉換成字符串。4.具有valueOf方法的對象,應該定義一個相應的toString方法,用來返回相等的數字的字符串形式。5.檢測一些未定義的變量時,應該使用typeOf或者與undefined作比較,而不應該直接用真值運算。

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《JavaScript數學運算用法總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript數組操作技巧總結》、《JavaScript排序算法總結》、《JavaScript遍歷算法與技巧總結》、《JavaScript查找算法技巧總結》及《JavaScript錯誤與調試技巧總結》

希望本文所述對大家JavaScript程序設計有所幫助。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩欧美另类中文字幕| 视频一区二区欧美| 国产精品第一| 国产精品nxnn| 免费一级欧美片在线观看网站 | 色吊丝一区二区| 成人在线丰满少妇av| 丰满少妇一区| 成人日韩av| 精品国产成人| 成人欧美一区二区三区的电影| jizzjizz中国精品麻豆| 成人va天堂| 欧美在线网站| 亚洲精品乱码日韩| 国产精品一区二区美女视频免费看 | 免费视频最近日韩| 亚洲乱码一区| 国产日产精品_国产精品毛片 | 少妇精品久久久一区二区三区| 日韩精选在线| 国产精成人品2018| 日韩毛片视频| 爽好久久久欧美精品| 亚洲图片久久| 国产精品久久久久9999高清| 视频在线不卡免费观看| 欧美精品资源| 蜜臀久久99精品久久久久久9| 无码日韩精品一区二区免费| 国产精品巨作av| 深夜福利视频一区二区| 国产亚洲欧洲| 欧美欧美黄在线二区| 精品成人18| 欧美午夜精品一区二区三区电影| 亚洲中字黄色| 国产精品一线天粉嫩av| 精品日韩视频| 日精品一区二区三区| 精品一区二区三区中文字幕| 91精品国产成人观看| 免费观看在线综合色| 国产精品大片免费观看| 欧美天堂视频| 综合五月婷婷| 国产成人免费视频网站视频社区| 欧美丝袜一区| 欧美日韩夜夜| 国内激情久久| 国产日韩1区| 激情久久中文字幕| 国产日韩中文在线中文字幕| 欧美日韩尤物久久| 日韩一区二区三区免费视频| 高清一区二区| 亚洲精品乱码久久久久久蜜桃麻豆 | 免费看一区二区三区| 激情欧美国产欧美| 国产精品欧美日韩一区| 99精品视频在线| 久久国产人妖系列| 亚洲精品在线观看91| 欧美一区二区三区免费看| 免费污视频在线一区| 欧美偷窥清纯综合图区| 亚洲高清激情| 国产精品黄网站| 午夜在线精品偷拍| 免费在线亚洲| 亚洲专区视频| 91看片一区| 欧美日本一区| 99xxxx成人网| 91亚洲自偷观看高清| 日韩中文字幕| 激情欧美一区二区三区| 国产精品丝袜在线播放| 午夜亚洲精品| 欧美中文一区二区| 精品久久久网| 人人爱人人干婷婷丁香亚洲| 亚洲性图久久| 黄色aa久久| 久久99偷拍| 91免费精品国偷自产在线在线| 成人自拍av| 国产一区二区视频在线看| 日韩精品社区| 免费观看久久久4p| 欧美精选一区二区三区| 国产成人精品一区二区免费看京 | 黄色在线观看www| 国产精品久久久亚洲一区| 免费一级片91| 国产手机视频一区二区| 神马久久午夜| 色婷婷综合网| 国产一区2区| 久久精品一区二区三区中文字幕| 日本成人中文字幕| 亚洲视频国产精品| 中文日韩在线| 欧美午夜不卡| 免费av一区二区三区四区| 日韩久久精品| 日韩电影免费网址| 久久久久久自在自线| 老司机精品视频在线播放| 欧美精品三级在线| 日韩精品中文字幕一区二区| 视频一区二区三区入口| 国产精品三上| 在线亚洲免费| 亚洲欧美日韩国产一区| 国产精品美女| 国产精品婷婷| 亚洲一区二区成人| 性欧美长视频| 免费在线观看一区二区三区| 日韩制服丝袜av| 日韩在线卡一卡二| 在线国产精品一区| 婷婷久久免费视频| 日韩av一区二| 日韩av成人高清| 涩涩涩久久久成人精品| 欧美一区成人| 欧美a级一区二区| 国产成人免费精品| 欧美精品资源| 国产亚洲精品久久久久婷婷瑜伽| 久久国产66| 亚洲精品第一| 国产精品调教| 黄色aa久久| 午夜国产精品视频免费体验区| 欧美特黄a级高清免费大片a级| 美女被久久久| 奇米亚洲欧美| 麻豆精品视频在线观看| 老色鬼精品视频在线观看播放| 精品精品久久| 秋霞国产精品| 性一交一乱一区二区洋洋av| 亚洲精品国产日韩| 国产精品久久久久久妇女| 国产精品麻豆久久| 五月婷婷亚洲| 亚洲视频二区| 国产美女精品视频免费播放软件| 欧美1区二区| 久久亚洲国产| 国产精品日韩久久久| 青青草伊人久久| 在线一区av| 国产精品毛片| 国产精品一区二区免费福利视频 | 中文字幕成在线观看| 欧美亚洲国产一区| 免费人成黄页网站在线一区二区| 国产日本精品| 超级白嫩亚洲国产第一| 日本在线一区二区三区| 亚洲欧美日韩在线观看a三区| 国产亚洲精品美女久久| 国产传媒在线观看| 国产精品婷婷| 国产96在线亚洲| 激情欧美丁香| 久久gogo国模啪啪裸体| 国产日韩专区| 精品久久福利| 蜜桃国内精品久久久久软件9| 亚洲爱爱视频| 波多野结衣一区| 精品久久影院| 国产精品一国产精品| 成人在线免费观看网站| 亚洲精选av| 蜜桃视频欧美| 国产精品一区二区三区美女 | 久久99国产精品视频| 麻豆91在线播放| 不卡av一区二区| 日韩国产欧美视频| 国产成人精品亚洲线观看| 三级亚洲高清视频| 国产精品伦一区二区| 亚洲www啪成人一区二区| 亚洲深夜福利在线观看| 欧美激情福利| 亚洲一区日韩| 国产亚洲一区| 国产一区成人| 色婷婷精品视频| 国产精品入口久久| 视频二区不卡| 国产精品白丝久久av网站| 亚洲www免费|