對象到其他類型之間的數(shù)據(jù)轉(zhuǎn)換
對象到boolean
- 非空對象 是true
- 空對象(是null门驾,不是{}) false
對象到字符串
- 調(diào)用對象的toString方法实夹。
String(o);//String()調(diào)用o的toString();
o.toString();//o調(diào)用自身的toString()方法
對象到number
- 使用Number()轉(zhuǎn)換
- 如果對象既沒有重寫toString()方法鸳碧,也沒有重寫valueOf()的猛,返回NaN
var o = {
name : "briup",
age :22
};
Number(o); // NaN - 如果對象只重寫了toString()方法颓帝,沒有重寫valueOf()方法脓恕,將獲
取到toString()返回的值驯杜,然后對該值進(jìn)行轉(zhuǎn)換
var o = {
name : "briup",
age :22,
toString:function(){
return "1";
}
};
Number(o);
// 默認(rèn)轉(zhuǎn)換o.toString(),既Number("1"),結(jié)果為 1 - 如果對象既重寫了toString()方法受啥,也重寫了valueOf()方法,或者僅
重寫了valueOf()方法鸽心,將調(diào)用valueOf(),并且取得返回值滚局,對該返回
值進(jìn)行轉(zhuǎn)換
var o = {
name : "briup",
age :22,
toString:function(){
return "1";
},
valueOf:function(){
return false;
}
};
Number(o); // 默認(rèn)轉(zhuǎn)換o.valueOf(),既Number(false),結(jié)果為 0 - parseInt()/parseFloat()
始終調(diào)用toString()將其返回值進(jìn)行parseInt()轉(zhuǎn)換
操作符
一元操作符
++,--,+,-操作符應(yīng)用任何類型數(shù)值都返回一個(gè)數(shù)值類型顽频,先將任意類型的值轉(zhuǎn)換為Number
然后進(jìn)行運(yùn)算
遞增 ++
- 前置:操作該變量之前進(jìn)行遞增或者遞減操作
- 后置:操作該變量之后進(jìn)行遞增或者遞減操作
對任意數(shù)據(jù)類型的操作數(shù)都適用藤肢,使用前先將其轉(zhuǎn)換為數(shù)字(Number()),然后再進(jìn)行運(yùn)算
在應(yīng)用于對象的時(shí)候糯景,優(yōu)先先調(diào)用對象的valueOf方法嘁圈,以取得一個(gè)可供操作的值,如果子類
對象僅重寫了toString(),調(diào)用該方法。
遞減 --
前置:操作該變量之前進(jìn)行遞增或者遞減操作
-
后置:操作該變量之后進(jìn)行遞增或者遞減操作
對任意數(shù)據(jù)類型的操作數(shù)都適用蟀淮,使用前先將其轉(zhuǎn)換為數(shù)字最住,然后再進(jìn)行運(yùn)算
在應(yīng)用于對象的時(shí)候,先調(diào)用對象的valueOf方法怠惶,以取得一個(gè)可供操作的值,如果子類
對象僅重寫了toString(),調(diào)用該方法涨缚。
加 +
相當(dāng)于調(diào)用Number();
var a = "12"
+a ; // 12 相當(dāng)于調(diào)用了Number("12")
減 -
將一元減應(yīng)用于數(shù)值時(shí),數(shù)值會變成負(fù)數(shù)策治。
將一元減應(yīng)用于非數(shù)值時(shí)脓魏,
遵循與一元加操作符相同的規(guī)則兰吟,最后將得到的數(shù)值轉(zhuǎn)化為負(fù)數(shù)
布爾操作符, 非(NOT),與(and)茂翔,或(OR)
邏輯非 !
該操作符應(yīng)用任何類型數(shù)值都返回一個(gè)布爾值混蔼。先將任意類型的數(shù)值轉(zhuǎn)換為Boolean,
然后取反珊燎,!a ==> !Number(a)
!0 //true
!"" //true
!NaN //true
!false //true
連用兩次邏輯非 惭嚣,就可以將任意數(shù)據(jù)類型轉(zhuǎn)化為Boolean類型,!!a ==> Number(a)
!!"" //false
邏輯與 && (同真才真俐末,有假則假)
短路
可應(yīng)用于任意數(shù)值料按。如果有一個(gè)操作數(shù)不是布爾類型,邏輯與就不一定返回boolean類型
如果第一個(gè)操作數(shù)是
null,NaN,undefined,false,0,""可被轉(zhuǎn)換
為false的值的時(shí)候返回該值-
如果第一個(gè)數(shù)其他卓箫,返回第二個(gè)數(shù)
var s1 = 8; var s2 = "briup"; var s3 = ""; var result = s1 && s2; //briup var result2 = s3 &&s2; //空字符串
邏輯或 ||(有真則真载矿,同假才假)
false ||
如果兩個(gè)操作數(shù)都是null,NaN,undefined,false,0,""可被轉(zhuǎn)換為false的值的時(shí)候返回該值
如果第一個(gè)操作數(shù)是null,NaN,undefined,false,0,"" 則返回第二個(gè)操作數(shù)
加性操作符
加法 +
m + n
-
當(dāng)m,n不為String,Object類型的時(shí)候,先將m,n轉(zhuǎn)換為Number類型烹卒,然后再進(jìn)行計(jì)算
true + false; //1闷盔;Number(true)+Number(false); true + 1; //2;Number(true) + 1 null + undefined; //NaN旅急;Number(undefined) -> NaN
-
當(dāng)m,n有一個(gè)為String,無論另一個(gè)操作數(shù)為何(但不為對象)都要轉(zhuǎn)換為String逢勾,然后再進(jìn)行拼接
"1" + true; // 1true "1" + undefined;// 1undefined "1" + 1; // 11
當(dāng)m,n 有一個(gè)為對象,如果該對象既重寫toString,又重寫了valueOf方法藐吮,調(diào)用valueOf方法獲取返回值溺拱,
將該返回值和另外一個(gè)操作數(shù)進(jìn)行運(yùn)算。如果該對象沒有重寫valueOf方法谣辞,將調(diào)用toString方法獲取返回值迫摔,
將該返回值和另外一個(gè)操作數(shù)進(jìn)行運(yùn)算。
var o = {
name:"briup",
valueOf:function(){
return "1";
}
}
o+1; //2泥从;o+1
減法 -
返回值為Number
無論操作數(shù)為任何類型句占,先將其使用Number()轉(zhuǎn)換器轉(zhuǎn)換為Number類型,然后再計(jì)算躯嫉。
true - 1; //0; 1-1
null - true; //-1 ; 0-1
1 - undefined //NaN
var o = {
name:"briup",
valueOf:function(){
return 1;
}
}
o-1; //0; 1-1
乘性操作符
當(dāng)操作數(shù)為非數(shù)值的時(shí)候執(zhí)行自動的類型轉(zhuǎn)化Number()
乘法 *
- 如果兩個(gè)數(shù)都是數(shù)值纱烘,執(zhí)行常規(guī)的乘法計(jì)算
- 如果一個(gè)操作數(shù)是NaN,結(jié)果為NaN
超過數(shù)值范圍返回Infinity(Infinity 屬性用于存
放表示正無窮大的數(shù)值。 - 如果有一個(gè)操作數(shù)不是數(shù)值祈餐,則在后臺先調(diào)用Number()將其轉(zhuǎn)換為數(shù)值擂啥。
除法 /
如果一個(gè)操作數(shù)是NaN,結(jié)果為NaN (0/0 ; NaN)
一個(gè)非0值除0 Infinity-
如果有一個(gè)操作數(shù)不是數(shù)值,則在后臺先
調(diào)用Number()將其轉(zhuǎn)換為數(shù)值帆阳。var s1 = 5; var s2 = 2; var result = s1/s2; //2.5
取余 %
- 如果兩個(gè)數(shù)都是數(shù)值啤它,執(zhí)行常規(guī)的取余計(jì)算
- 如果一個(gè)操作數(shù)是NaN,結(jié)果為NaN(任意數(shù)%0 ; NaN)
- 如果有一個(gè)操作數(shù)不是數(shù)值,則在后臺先調(diào)用Number()將其轉(zhuǎn)換為數(shù)值。
關(guān)系操作符
< > <= >= ,返回一個(gè)boolean值
-
如果兩個(gè)操作數(shù)是字符串变骡,比較字符串中對應(yīng)位置的每個(gè)字符的字符編碼值
a -> z "10" -> "9" "a">"b" //false "1">"a" //false
-
如果一個(gè)操作數(shù)是數(shù)值,將另外一個(gè)操作數(shù)也轉(zhuǎn)換為數(shù)值進(jìn)行比較
"3">1; //true 3>true; //true 3>Number(true) 3>undefined; //false Number(undefined)=NaN ;任何數(shù)和NaN比較結(jié)果都為false
-
如果一個(gè)操作數(shù)是對象芭逝,先調(diào)用valueOf(),再調(diào)用toString()將返回值與另外一個(gè)操作數(shù)比較
如果沒有重寫toString() valueOf()則始終為falsevar o = { name:"briup", valueOf:function(){ return "13"; } } o>2 // true ; "13">2
相等操作符
相等和不相等 ==, != (先轉(zhuǎn)換在比較)
- 如果有一個(gè)數(shù)為boolean類型塌碌,比較前先轉(zhuǎn)換為數(shù)值。
- 如果一個(gè)數(shù)為字符串旬盯,另外一個(gè)數(shù)為數(shù)值台妆,比較前先將字符串轉(zhuǎn)換為數(shù)值
- 如果兩個(gè)都是字符串,比較字符序列
- 如果一個(gè)數(shù)是對象胖翰,另外一個(gè)數(shù)不是接剩,則調(diào)用valuesOf()方法,用得到的基本數(shù)據(jù)類型進(jìn)行比較
null == undefined //true - 如果一個(gè)數(shù)為NaN,相等操作返回為false萨咳,不等操作返回true
- 如果兩個(gè)數(shù)都為對象懊缺,則比較他們是不是同一個(gè)對象,如果兩個(gè)操作數(shù)都指向同一個(gè)對象培他,返回true
全等和不全等
僅比較不轉(zhuǎn)換鹃两,先比較兩個(gè)數(shù)所屬的數(shù)據(jù)類型,如果類型不同則不同舀凛,如果類型相同
再繼續(xù)比較兩個(gè)數(shù)的值
console.log("55" == 55); true
console.log("55" === 55);false
null == undifined; //false
三目運(yùn)算符 ? :
variable = boolean_expression ? true_value : false_value;
如果boolean_expression為true,將true_value賦給variable俊扳,
否則將false_value賦給variable
求任意兩個(gè)數(shù)之間最大值
function max(m,n){
return m>n?m:n; //如果m>n為true返回m,如果m>n為false,返回n
}
賦值運(yùn)算符 =
將右側(cè)的值賦給左側(cè)的變量
可以和其他算術(shù)運(yùn)算符連用 *= /= %= += -=
a *= 3;
逗號操作符
可以在一條語句中執(zhí)行多個(gè)操作
var num1=1,num2 = 2, num3 = 3;