javascript是一門弱類型語言,意思就是語言中的數(shù)據(jù)類型,很輕易就能被改變
比如定義一個(gè)變量值為數(shù)字,然后重新給他賦值為字符串,類型就由數(shù)字類型轉(zhuǎn)為了字符串類型。
類型的轉(zhuǎn)換,可以有很多種方法,例如在js中常用的parseInt、toString、等方法,這些方法都是強(qiáng)制將某個(gè)類型轉(zhuǎn)為指定的類型。
除了這些方法,還有一些特殊應(yīng)用場(chǎng)景,會(huì)將類型悄悄的進(jìn)行轉(zhuǎn)換,如下幾種情況:
1、數(shù)學(xué)運(yùn)算
如果一個(gè)數(shù)字跟另一個(gè)其他類型的數(shù)據(jù)進(jìn)行數(shù)學(xué)運(yùn)算時(shí),另一個(gè)數(shù)據(jù)會(huì)被轉(zhuǎn)為數(shù)字類型進(jìn)行運(yùn)算,例:
var a = 1;
var b = true;
var c = a + b;
console.log(c); // 2 - 此時(shí)的布爾類型true被轉(zhuǎn)為了數(shù)字1,進(jìn)行了數(shù)學(xué)加法運(yùn)算
var a = 3;
var b = undefined;
var c = a + b;
console.log(c); // NaN - 此時(shí)的b被轉(zhuǎn)為了數(shù)字類型進(jìn)行了數(shù)學(xué)運(yùn)算
注意:加法比較特殊,因?yàn)榉?hào)+,除了可以進(jìn)行數(shù)學(xué)加法以外,還可以進(jìn)行字符串的拼接。例:
var a = 2;
var b = [1,2,3]
var c = a / b;
console.log(c); // NaN - 此時(shí)的b被轉(zhuǎn)為了數(shù)字類型
var a = 2;
var b = [1,2,3]
var c = a + b;
console.log(c); // 21,2,3 - 此時(shí)的a和b不再是加法運(yùn)算,而是進(jìn)行了拼接
2、字符串拼接
當(dāng)+符號(hào)左右兩邊有一個(gè)是字符串的時(shí)候,另一個(gè)也會(huì)轉(zhuǎn)為字符串進(jìn)行拼接,例:
var a = 2;
var b = '3';
var c = a + b;
console.log(c); // 23 - 此時(shí)的a被轉(zhuǎn)為了字符串,進(jìn)行了拼接
3、比較運(yùn)算
當(dāng)比較運(yùn)算符(除相等比較和全等比較)左右兩邊有一個(gè)是數(shù)字的時(shí)候,另一個(gè)也會(huì)轉(zhuǎn)為數(shù)字進(jìn)行比較大小,例:
var a = 2;
var b = '10';
console.log(a>b) // false - 說明b被轉(zhuǎn)為數(shù)字10進(jìn)行了大小比較
4、判斷條件
所有被放在if分支語句的小括號(hào)中的代碼會(huì)被轉(zhuǎn)為布爾類型,例:
var a = 2;
if(a){
console.log('a變量是true'); // a變量是true - 說明變量a的2被轉(zhuǎn)為了布爾值true
}else{
console.log('a變量是false');
}
var b;
if(b){
console.log('b變量是true');
}else{
console.log('b變量是false'); // b變量是false - 說明b變量undefined被轉(zhuǎn)為了布爾值false
}
5、date輸出
我們知道,new 一個(gè)構(gòu)造函數(shù)會(huì)得到一個(gè)對(duì)象,但是new Date()之后,輸出的卻是一個(gè)字符串,例:
var d = new Date();
console.log(d); // Mon Mar 15 2021 17:50:25 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)
// 這說明,new出來的對(duì)象d,在輸出的時(shí)候被悄悄的轉(zhuǎn)換成了字符串輸出了
6、對(duì)象數(shù)組輸出在頁面
當(dāng)在控制臺(tái)輸出一個(gè)數(shù)組或?qū)ο蟮臅r(shí)候,是本省的類型顯示,例:
var arr = [1,2,3,4];
var obj = {name:"張三",age:12}
console.log(arr);
console.log(obj);
輸出效果如下圖:
但是如果將數(shù)組或?qū)ο笤谖谋局休敵龅脑挘瑪?shù)組和對(duì)象會(huì)默認(rèn)調(diào)用自己原型中的toString方法,以字符串形式顯示在文本中,例:
var arr = [1,2,3,4];
var obj = {name:"張三",age:12}
document.write(arr)
document.write(obj)
文本中顯示如下:
數(shù)組和對(duì)象其實(shí)已經(jīng)調(diào)用了他們?cè)蜕系膖oString方法,被轉(zhuǎn)為了字符串,例:
var arr = [1,2,3,4];
var obj = {name:"張三",age:12}
console.log(arr.toString());
console.log(obj.toString());
控制臺(tái)顯示如下圖:
隱形轉(zhuǎn)換在多處出現(xiàn),我們?cè)诰幊痰臅r(shí)候,需要謹(jǐn)慎小心,熟悉后可以對(duì)之進(jìn)行利用,例如判斷一個(gè)數(shù)據(jù)或?qū)ο笾械闹凳欠翊嬖跁r(shí),可以利用分支語句的條件中的隱形轉(zhuǎn)換來搞定。