日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Javascript类型转换的规则

發布時間:2025/6/15 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Javascript类型转换的规则 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Javascript的變量是松散類型的,它可以存儲Javascript支持的任何數據類型,其變量的類型可以在運行時被動態改變。請看示例:

1 2 3 var?n = 10; n = "hello CSSer!"; n = {};

上面的示例中,首先聲明n變量并初始化其值為10(整數類型),接著將字符串“hello?CSSer!”賦值給n,接著再賦一個對象給它,最后n的類型是對象類型。可以看出變量n的類型具有動態性,實際編程中,我們建議不要頻繁改變變量的類型,因為這對調試沒有好處。

正因為Javascript中變量類型具有動態性,在程序實際執行的過程中就需要用到類型轉換的概念。類型轉換可以分為隱式轉換和顯式轉換,所謂隱 式轉換即程序在運行時進行的自動轉換,顯式轉換則是人為的對類型進行強制轉換。本文將對Javascript的類型轉換進行總結。

顯式轉換

通過手動進行類型轉換,Javascript提供了以下轉型函數:

轉換為數值類型:Number(mix)、parseInt(string,radix)、parseFloat(string)
轉換為字符串類型:toString(radix)、String(mix)
轉換為布爾類型:Boolean(mix)

1、Number(mix)函數,可以將任意類型的參數mix轉換為數值類型。其規則為:

  • 如果是布爾值,true和false分別被轉換為1和0
  • 如果是數字值,返回本身。
  • 如果是null,返回0.
  • 如果是undefined,返回NaN。
  • 如果是字符串,遵循以下規則:
  • 如果字符串中只包含數字,則將其轉換為十進制(忽略前導0)
  • 如果字符串中包含有效的浮點格式,將其轉換為浮點數值(忽略前導0)
  • 如果是空字符串,將其轉換為0
  • 如果字符串中包含非以上格式,則將其轉換為NaN
  • 如果是對象,則調用對象的valueOf()方法,然后依據前面的規則轉換返回的值。如果轉換的結果是NaN,則調用對象的toString()方法,再次依照前面的規則轉換返回的字符串值。
  • 下表列出了對象的valueOf()的返回值:

    對象 返回值
    Array 數組的元素被轉換為字符串,這些字符串由逗號分隔,連接在一起。其操作與?Array.toString?和?Array.join?方法相同。
    Boolean Boolean?值。
    Date 存儲的時間是從?1970?年?1?月?1?日午夜開始計的毫秒數?UTC。
    Function 函數本身。
    Number 數字值。
    Object 對象本身。這是默認情況。
    String 字符串值。

    下面提供幾個例子,你能寫出它的正確結果嗎:

    • Number(“hello?CSSer!”);
    • Number(“0×8″);
    • Number(“”);
    • Number(“020dd”);
    • Number(“070″);
    • Number(true);

    2、parseInt(string,?radix)函數,將字符串轉換為整數類型的數值。它也有一定的規則

  • 忽略字符串前面的空格,直至找到第一個非空字符
  • 如果第一個字符不是數字符號或者負號,返回NaN
  • 如果第一個字符是數字,則繼續解析直至字符串解析完畢或者遇到一個非數字符號為止
  • 如果上步解析的結果以0開頭,則將其當作八進制來解析;如果以0x開頭,則將其當作十六進制來解析
  • 如果指定radix參數,則以radix為基數進行解析
  • 小測驗:

    • parseInt(“hello?CSSer!”);
    • Number(“0×8″);
    • parseInt(“”);
    • parseInt(“020dd”);
    • parseInt(“070″);
    • parseInt(“22.5″);

    3、parseFloat(string)函數,將字符串轉換為浮點數類型的數值

    它的規則與parseInt基本相同,但也有點區別:字符串中第一個小數點符號是有效的,另外parseFloat會忽略所有前導0,如果字符串包含一個可解析為整數的數,則返回整數值而不是浮點數值。

    4、toString(radix)方法。除undefined和null之外的所有類型的值都具有toString()方法,其作用是返回對象的字符串表示

    對象 操作
    Array 將?Array?的元素轉換為字符串。結果字符串由逗號分隔,且連接起來。
    Boolean 如果?Boolean?值是?true,則返回?“true”。否則,返回?“false”。
    Date 返回日期的文字表示法。
    Error 返回一個包含相關錯誤信息的字符串。
    Function 返回如下格式的字符串,其中?functionname?是被調用?toString?方法函數的名稱:

    function?functionname(?)?{?[native?code]?}

    Number 返回數字的文字表示。
    String 返回?String?對象的值。
    默認 返回?“[object?objectname]”,其中?objectname?是對象類型的名稱。

    5、String(mix)函數,將任何類型的值轉換為字符串,其規則為

  • 如果有toString()方法,則調用該方法(不傳遞radix參數)并返回結果
  • 如果是null,返回”null”
  • 如果是undefined,返回”undefined”
  • 6、Boolean(mix)函數,將任何類型的值轉換為布爾值

    以下值會被轉換為false:false、”"、0、NaN、null、undefined,其余任何值都會被轉換為true。

    隱式轉換

    在某些情況下,即使我們不提供顯示轉換,Javascript也會進行自動類型轉換,主要情況有:

    1.?用于檢測是否為非數值的函數:isNaN(mix)

    isNaN()函數,經測試發現,該函數會嘗試將參數值用Number()進行轉換,如果結果為“非數值”則返回true,否則返回false。

    2.?遞增遞減操作符(包括前置和后置)、一元正負符號操作符

    這些操作符適用于任何數據類型的值,針對不同類型的值,該操作符遵循以下規則(經過對比發現,其規則與Number()規則基本相同):

  • 如果是包含有效數字字符的字符串,先將其轉換為數字值(轉換規則同Number()),在執行加減1的操作,字符串變量變為數值變量。
  • 如果是不包含有效數字字符的字符串,將變量的值設置為NaN,字符串變量變成數值變量。
  • 如果是布爾值false,先將其轉換為0再執行加減1的操作,布爾值變量編程數值變量。
  • 如果是布爾值true,先將其轉換為1再執行加減1的操作,布爾值變量變成數值變量。
  • 如果是浮點數值,執行加減1的操作。
  • 如果是對象,先調用對象的valueOf()方法,然后對該返回值應用前面的規則。如果結果是NaN,則調用toString()方法后再應用前面的規則。對象變量變成數值變量。
  • 小測驗:

    分別對以下類型的值執行后置遞增操作,結果是什么?

    “2″,?”02dd”,?”",?false,?22.5,?+”",?-false,?+new?Date()

    3.?加法運算操作符

    加號運算操作符在Javascript也用于字符串連接符,所以加號操作符的規則分兩種情況:

    • 如果兩個操作值都是數值,其規則為:
  • 如果一個操作數為NaN,則結果為NaN
  • 如果是Infinity+Infinity,結果是Infinity
  • 如果是-Infinity+(-Infinity),結果是-Infinity
  • 如果是Infinity+(-Infinity),結果是NaN
  • 如果是+0+(+0),結果為+0
  • 如果是(-0)+(-0),結果為-0
  • 如果是(+0)+(-0),結果為+0
    • 如果有一個操作值為字符串,則:
  • 如果兩個操作值都是字符串,則將它們拼接起來
  • 如果只有一個操作值為字符串,則將另外操作值轉換為字符串,然后拼接起來
  • 如果一個操作數是對象、數值或者布爾值,則調用toString()方法取得字符串值,然后再應用前面的字符串規則。對于undefined和null,分別調用String()顯式轉換為字符串。
  • 可以看出,加法運算中,如果有一個操作值為字符串類型,則將另一個操作值轉換為字符串,最后連接起來。

    4.?乘除、減號運算符、取模運算符

    這些操作符針對的是運算,所以他們具有共同性:如果操作值之一不是數值,則被隱式調用Number()函數進行轉換。具體每一種運算的詳細規則請參考ECMAScript中的定義。

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

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

    邏輯與(&&)操作符,如果一個操作值不是布爾值時,遵循以下規則進行轉換:

  • 如果第一個操作數經Boolean()轉換后為true,則返回第二個操作值,否則返回第一個值(不是Boolean()轉換后的值)
  • 如果有一個操作值為null,返回null
  • 如果有一個操作值為NaN,返回NaN
  • 如果有一個操作值為undefined,返回undefined
  • 邏輯或(||)操作符,如果一個操作值不是布爾值,遵循以下規則:

  • 如果第一個操作值經Boolean()轉換后為false,則返回第二個操作值,否則返回第一個操作值(不是Boolean()轉換后的值)
  • 對于undefined、null和NaN的處理規則與邏輯與(&&)相同
  • 6.?關系操作符(<,?>,?<=,?>=)

    與上述操作符一樣,關系操作符的操作值也可以是任意類型的,所以使用非數值類型參與比較時也需要系統進行隱式類型轉換:

  • 如果兩個操作值都是數值,則進行數值比較
  • 如果兩個操作值都是字符串,則比較字符串對應的字符編碼值
  • 如果只有一個操作值是數值,則將另一個操作值轉換為數值,進行數值比較
  • 如果一個操作數是對象,則調用valueOf()方法(如果對象沒有valueOf()方法則調用toString()方法),得到的結果按照前面的規則執行比較
  • 如果一個操作值是布爾值,則將其轉換為數值,再進行比較
  • 注:NaN是非常特殊的值,它不和任何類型的值相等,包括它自己,同時它與任何類型的值比較大小時都返回false。

    7.?相等操作符(==)

    相等操作符會對操作值進行隱式轉換后進行比較:

  • 如果一個操作值為布爾值,則在比較之前先將其轉換為數值
  • 如果一個操作值為字符串,另一個操作值為數值,則通過Number()函數將字符串轉換為數值
  • 如果一個操作值是對象,另一個不是,則調用對象的valueOf()方法,得到的結果按照前面的規則進行比較
  • null與undefined是相等的
  • 如果一個操作值為NaN,則相等比較返回false
  • 如果兩個操作值都是對象,則比較它們是不是指向同一個對象

  • 如果把通過函數或方法調用,明確的將某種類型轉換成另一種類型稱為顯示轉換 ,相反則稱為隱式類型轉換 。google和維基百科中沒有找到“顯示類型轉換”,“隱式類型轉換”的字眼。暫且這么稱呼。


    一、 運算中存在的隱式類型轉換?

    1, “+”運算符

    1 2 var?a = 11, b =?'22'; var?c = a + b;

    這里引擎將會先把a變成字符串"11"再與b進行連接,變成了"1122"。有人會有疑問,為什么不把b變成數字22再進行算術加運算呢,這樣的話c就是33了。沒有為什么,當運算符“+”兩邊一個是數字類型,一個是字符串類型時,js引擎規定進行字符串連接運算而非算術加運算。利用運算符“+”這個特性,可以很方便的將Number轉換成String。如

    1 2 3 4 var?a = 11; alert(typeof?a);?//-->number a = a +?''; alert(typeof?a);?//-->string

    2,“-”運算符

    “-”可以是一元運算符(取負),也可以是二元(減法運算)的。如

    1 2 3 var?a = 11, b =?'5'; var?c = a - b; alert(typeof?c);?//--> number

    這里與上面的“+”相反,會把字符串b隱式的轉換成數字5再進行算術減法運算。利用這個特性,可以很方便的將String轉換成Number

    1 2 3 var?a =?'11'; a = a -?''; alert(typeof?a);// -->number

    二、 語句中存在的隱式類型轉換

    1,if

    1 2 3 4 var?obj = {name:'jack'} if(obj){ ????//do more }

    這里會把obj隱式的轉換成Boolean類型

    2,while

    1 2 3 4 var?obj = {name:'jack'} while(obj){ ????//do more }

    同if

    3,for in時的類型轉換
    定義對象字面量時發生從標識符到字符串的隱式轉換。

    1 2 3 4 var?person = {'name':'jack',"age":20,school:'PKU'}; for(var?a?in?person){ ????alert(a +?": "?+?typeof?a); }

    這里name,age分別加單/雙引號以強調其為String類型,school沒有加單/雙引號。我們遍歷下該對象的屬性,查看其類型。發現school也被隱式的轉換成了String類型。

    數組的索引其實也是字符串類型。這著實令人驚嘆,但事實的確如此。如

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

    三、 alert時存在的隱式類型轉換

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

    給String原型上添加了個fn方法,該方法返回this,我們知道this可以理解成當前類的實例對象,既然是對象那么typeof a.fn()自然返回是object了。
    關鍵是最后的alert(a.fn()),a.fn()返回的明明是對象,但卻隱式的轉換成了字符串“hello”顯示。

    同樣的情況發生在數字類型上,如

    1 2 3 4 Number.prototype.fn =?function(){return?this}; var?a = 10; alert(typeof?a.fn());//-->object alert(a.fn());?//-->10
    a.fn()返回的是對象類型,但在alert(a.fn())時會隱式的將其轉換成數字。

    總結

    以上是生活随笔為你收集整理的Javascript类型转换的规则的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。