當(dāng)前位置:
首頁 >
js隐式转换
發(fā)布時間:2025/4/14
28
豆豆
JavaScript的數(shù)據(jù)類型分為六種,分別為null,undefined,boolean,string,number,object。object是引用類型,其它的五種是基本類型或者是原始類型。我們可以用typeof方法打印來某個是屬于哪個類型的。不同類型的變量比較要先轉(zhuǎn)類型,叫做類型轉(zhuǎn)換,類型轉(zhuǎn)換也叫隱式轉(zhuǎn)換。隱式轉(zhuǎn)換通常發(fā)生在運(yùn)算符加減乘除,等于,還有小于,大于等。。
typeof '11' ?//string ? ? ?? typeof(11) //number '11' < 4 ? ? //false 基本類型的轉(zhuǎn)換 下面先講加減乘除: 1.字符串加數(shù)字,數(shù)字就會轉(zhuǎn)成字符串。 2.數(shù)字減字符串,字符串轉(zhuǎn)成數(shù)字。如果字符串不是純數(shù)字就會轉(zhuǎn)成NaN。字符串減數(shù)字也一樣。兩個字符串相減也先轉(zhuǎn)成數(shù)字。 3.乘,除,大于,小于跟減的轉(zhuǎn)換也是一樣。 //隱式轉(zhuǎn)換 + - * == /? // +? 10 + '20' ? ?//2010 // - 10 - '20' ? ?//-10 10 - 'one' ? //NaN 10 - '100a' ?//NaN // * 10*'20' ? ? ?//200 '10'*'20' ? ?//200 // / 20/'10' ? ? ?//2 '20'/'10' ? ?//2 '20'/'one' //NaN 再來看看一組 == 的。 1.undefined等于null 2.字符串和數(shù)字比較時,字符串轉(zhuǎn)數(shù)字 3.數(shù)字為布爾比較時,布爾轉(zhuǎn)數(shù)字 4.字符串和布爾比較時,兩者轉(zhuǎn)數(shù)字 // == undefined == null; ? ?//true '0' == 0; ? ? ? ? ?//true,字符串轉(zhuǎn)數(shù)字 0 == false; ? ? ? ? ? //true,布爾轉(zhuǎn)數(shù)字 '0' == false; ? ? //true,兩者轉(zhuǎn)數(shù)字 null == false; ? ? //false undefined == false; //false 引用類型的轉(zhuǎn)換 基本類型間的比較相對簡單。引用類型和基本類型的比較就相對復(fù)雜一些,先要把引用類型轉(zhuǎn)成基本類型,再按上述的方法比較。引用類型轉(zhuǎn)布爾全是true。比如空數(shù)組,只要是對象就是引用類型,所以[]為true。引用類型轉(zhuǎn)數(shù)字或者字符串就要用valueOf()或者toString();對象本身就繼承了valuOf()和toString(),還可以自定義valueOf()和toString()。根據(jù)不同的對象用繼承的valueOf()轉(zhuǎn)成字符串,數(shù)字或本身,而對象用toString就一定轉(zhuǎn)為字符串。一般對象默認(rèn)調(diào)用valueOf()。 1.對象轉(zhuǎn)數(shù)字時,調(diào)用valueOf(); 2.對象轉(zhuǎn)字符串時,調(diào)用toString(); 先看看下面的例子: 0 == []; ? ? ? ?// true, 0 == [].valueOf(); -> 0 == 0; '0' == []; ? ? ?// false, '0' == [].toString(); -> '0' == ''; 2 == ['2']; ? ? // true, 2 == ['2'].valueOf(); -> 2 == '2' -> 2 == 2; '2' == [2]; ? ? // true, '2' == [2].toString(); -> '2' =='2'; [] == ![]; ? ? ?//true, [].valueOf() == !Boolean([]) -> 0 == false -> 0 == 0; 對象轉(zhuǎn)成數(shù)字時,調(diào)用valueOf(),在這之前先調(diào)用的是toString();所以我猜valueOf方法是這樣的。So上面的例子 0 == []要改成下面更合理。無論如何,[]最后是轉(zhuǎn)成0的。 var valueOf = function (){ var str = this.toString(); ? ?//先調(diào)用toString(),轉(zhuǎn)成字符串 //... } 0 == []; ? ? ? ?// true, 0 == [].valueOf(); -> 0 == '0' -> 0 == 0; 自定義的valueOf()和toString(); 1.自定義的valueOf()和toString()都存在,會默認(rèn)調(diào)用valueOf(); 2.如果只有toString(),則調(diào)用toString(); var a = [1]; a.valueOf = function (){ return 1;} a.toString = function (){ return '1';} a + 1; ? ? ? ? // 2, valueOf()先調(diào)用 去掉valueOf()就會調(diào)用toString()。 var a = [1]; a.valueOf = function (){ return 1;} a.toString = function (){ return '1';} a + 1; ? ? ? ? // 2, 先調(diào)用valueOf() //去掉valueOf delete a.valueOf; a + 1; ? ? ? ?// '11', 調(diào)用toString() 如果返回其它會怎么樣呢? var a = [1]; a.valueOf = function (){return ;} a.toString = function (){return 1 ;}; 1 - a; ? ? ? ?//NaN 其它對象 調(diào)用valueOf()轉(zhuǎn)成不同的類型: var a = {}; a.valueOf(); ? ?//Object {} var a = []; a.valueOf(); ? ?//[] ? ?自己本身 var a = new Date(); a.valueOf(); ? ?//1423812036234 ?數(shù)字 var a = new RegExp(); a.valueOf(); ? ?// ? ?/(?:)/ ?正則對象 引用類型之間的比較是內(nèi)存地址的比較,不需要進(jìn)行隱式轉(zhuǎn)換,這里不多說。 [] == [] ?//false 地址不一樣 var a = []; b = a; b == a ? //true 顯式轉(zhuǎn)換? 顯式轉(zhuǎn)換比較簡單,可以直接用類當(dāng)作方法直接轉(zhuǎn)換。 Number([]); ? ? ? ?//0 String([]); ? ? ? ?//'' Boolean([]); ? ? ? //true 還有更簡單的轉(zhuǎn)換方法。 3 + '' ? ?// 字符串'3' +'3' ? ? ?// 數(shù)字3 !!'3' ? ? // true轉(zhuǎn)載于:https://www.cnblogs.com/wangqiangweb/p/6093040.html
總結(jié)
- 上一篇: 如何带领新人
- 下一篇: SqlSugar-事务操作