狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
版主

Javascript 類型轉(zhuǎn)換

tercel
2011年4月30日 9:2 本文熱度 2865

Javascript 類型轉(zhuǎn)換



介紹


Javascript (ECMA Script)是一種弱類型的語言.這并不意味著它沒有數(shù)據(jù)類型,只是變量或者Javascript對象屬性不需要一個特定類型的值分配給它或者它始終使用相同的值.Javascript中的變量同樣支持自由類型轉(zhuǎn)換成為適用(或者要求)的內(nèi)容以便于使用.


弱類型的Javascript不會按照程序員的愿望從實際的變量類型到所需要的數(shù)據(jù)類型轉(zhuǎn)換,例如一個非常常見的錯誤,在瀏覽器腳本中,從表單控件中獲取用戶將要輸入的一個數(shù)值類型的變量與另一個數(shù)值變量的和.因為變量類型在表單控件中是字符串類型(計時字符串序列包含一個數(shù)字)這種嘗試將會添加那個字符串到變量,即使這些值碰巧是一些數(shù)字,結(jié)果在第二個變量將會被轉(zhuǎn)換為字符串類型,在最后只會把從表單控件中得到的變量添加到第一個字符串末尾.


這個問題實際上就是"+"操作符,數(shù)字和與字符串連接問題.操作結(jié)果完全取決于被操作參數(shù),只有在 +  操作兩者參數(shù)都為數(shù)值時才會作取和操作,否則,參數(shù)就會被自動轉(zhuǎn)換為字符串進行連接操作.


接下來討論在Javascript 工作中在類型轉(zhuǎn)換操作的變量返回情況.下表反應(yīng)了在Javascript 中所有的類別,比如 123e-2 作為數(shù)值類型,對于不同的類型賦予了不同的顏色.在接下來的章節(jié)中,我們將遵循這一規(guī)則.


如果你接受這個頁面的變量類型CSS樣式設(shè)置,下表就是關(guān)于不同變量與不同顏色的搭配關(guān)系.操作符將會成為 typeof 這樣的樣式.( null 類型將會返回 "object" 當(dāng)現(xiàn)實中 null 指定了某個對象



















Key
string
number
boolean
object
function
null
undefined

布爾值同樣會有高亮背景 true 或者 false.


轉(zhuǎn)換到布爾類型 (Boolean)


當(dāng)表達式是 if 以及其他一些判斷情況時,類型轉(zhuǎn)換的結(jié)果將會是布爾型為了用于判斷.這些判斷包括邏輯運算比如 與 (&&), 或 (||) 以及 非 (!). 非運算轉(zhuǎn)換變量為波爾型并且如果變量是波爾型-真.那么將返回假,反之將返回真.兩次非操作將會返回等同于變量轉(zhuǎn)換成為波爾型的值.

var boolValue = !!x;

這個技巧將會后面將會用到.


另外一種可選擇的方法就是把目標作為參數(shù)傳遞給Boolean 構(gòu)造函數(shù).

var boolValue = Boolean(x);
































Double NOT (!!col) : Numeric Values.
-1.6 -0 +0 1 1.6 8 16 16.8 123e-2 -Infinity +Infinity NaN
!!col true false false true true true true true true true true false

當(dāng)數(shù)值類型轉(zhuǎn)換為布爾型時,數(shù)值零將會變成假而其他數(shù)值將會變成真.除開特殊數(shù)值 NaN (Not a Number), NaN 被用于其他類型轉(zhuǎn)換到數(shù)值類型時當(dāng)沒有返回一個有意義的數(shù)值時. NaN 總是返回假. 無論是無限大還是無限小或者是有限數(shù)值,只要不是零,在轉(zhuǎn)換為布爾型時總是返回 true..







































Double NOT (!!col) : String Values.
""
(empty
string)
"-1.6" "0" "1" "1.6" "8" "16" "16.8" "123e-2" "010"
(Octal)
"0x10"
(Hex)
"0xFF"
(Hex)
"-010" "-0x10" "xx"
!!col false true true true true true true true true true true true true true true

字符串類型轉(zhuǎn)換規(guī)則是簡單的,字符串類型轉(zhuǎn)換到布爾型除了空字符串外都是返回真,空字符串返回假.





















Double NOT (!!col) : Other Values.
undefined null true false new Object() function(){
return;
}
!!col false false true false true true

對于其他類型, undefinednull 將會返回假, Object以及function類型總是返回真.


當(dāng)需要判斷某一對象是否是未定義的對象時,這是最有價值的功能.如果調(diào)用未定義的變量(undefined 或者 null) 將會產(chǎn)生錯誤.當(dāng)這些都還不確定時(通常是網(wǎng)頁瀏覽器所關(guān)心的)為了避免代碼產(chǎn)生錯誤,需要對對象進行 if 判斷.建議把對象作為表達式,轉(zhuǎn)換為波爾型,如果返回 false 則說明對象不存在,如果返回 true 則說明對象存在.

if(document.documentElement){
scrollX = document.documentElement.scrollLeft;
}

兩次非操作可以判斷對象是否能被使用.

var hasDocEl = !!document.documentElement;
...
if(hasDocEl){
scrollX = document.documentElement.scrollLeft;
}

轉(zhuǎn)換到字符串類型 (String)


如上文所說的,其他類型轉(zhuǎn)換到字符串類型常常來自于 + 操作符,無論其中一個參數(shù)是否為數(shù)值.最簡單轉(zhuǎn)換到字符串的方法是,把目標變量連接到一個空字符串上.這種技巧的結(jié)果對應(yīng)如下表.


另外一種可選擇的方法就是把目標作為參數(shù)傳遞給 String 構(gòu)造函數(shù).

var stringValue = String(x);
































type-convert to string ("" + col) : Numeric Values.
-1.6 -0 +0 1 1.6 8 16 16.8 123e-2 -Infinity +Infinity NaN
"" + col -1.6 0 0 1 1.6 8 16 16.8 1.23 -Infinity Infinity NaN

注意上面數(shù)值 123e-2 已經(jīng)被轉(zhuǎn)換為字符串 "1.23" ,因為已經(jīng)由科學(xué)計數(shù)法轉(zhuǎn)換為普通表達式了.然而,Javascript 的本質(zhì)數(shù)值類型是來自于IEEE的雙精度浮點類型,這就意味著只能儲存有限的精度.數(shù)學(xué)操作結(jié)果可能只能產(chǎn)生近似的值,當(dāng)他們轉(zhuǎn)換到字符串時,可能會收到意想不到(指壞的)的結(jié)果.所以常常需要設(shè)置特定的定制函數(shù)用以獲得可接受的結(jié)果.這種類型轉(zhuǎn)換機制難以保證正常結(jié)果.























type-convert to string ("" + col) : Other Values.
undefined null true false new Object() function(){
return;
}
"" + col undefined null true false [object Object]
function(){
return;
}

當(dāng)一個對象或者函數(shù)被轉(zhuǎn)換為字符串時,他們的 toString 方法將會被調(diào)用.默認會執(zhí)行 Object.prototype.toString 以及Function.prototype.toString 除 除非重寫 "toString" 方法.把一個函數(shù)轉(zhuǎn)換到字符串,返回結(jié)果并非是必須的.Function.prototype.toString 方法就能完成大部分需要,它將會返回 "host objects" 和方法(這個對象和方法取決于不同環(huán)境,比如 DOM 元素).


轉(zhuǎn)換到數(shù)值型 (Number)


轉(zhuǎn)換到數(shù)值類型,特別是由字符串轉(zhuǎn)換到數(shù)值類型,有很多通用的方法,任何數(shù)學(xué)操作方法除了加法( + )都會執(zhí)行類型轉(zhuǎn)換.所以轉(zhuǎn)換字符串類型到數(shù)值類型可以使之與一個數(shù)值操作,比如減去零或者乘以一.

var numValue = stringValue - 0;
/* or */
var numValue = stringValue * 1;
/* or */
var numValue = stringValue / 1;

但是 + (取正)操作還是可以轉(zhuǎn)換字符串類型到數(shù)值類型.因為他不做任何計算操作,所以這種方法是最快的.


順便一提,相反數(shù)操作 - 同樣也會執(zhí)行類型轉(zhuǎn)換,使得目標成為相反的結(jié)果.

var numValue = (+stringValue);
/* 這是不必要的,在 + 操作后已經(jīng)被添加了括弧,只是為了使得代碼更容易被人理解并且使得他很清楚.特別是避免了與添加和連續(xù)操作相混淆.

比較:



var n = anyNumVar++ + +stringVar + ++anotherNumVar;
- 與 -
var n = (anyNumVar++) + (+stringVar) + (++anotherNumVar);
^^ ^ ^^
(后自增) + (取正數(shù)) + (前自增)
*/


最終 + (取正)操作是最快的轉(zhuǎn)換字符串類型到數(shù)值類型的方法.傳遞給 Number 構(gòu)造函數(shù)一個參數(shù),它將會執(zhí)行類型轉(zhuǎn)換并且返回一個數(shù)值類型.

var numValue = Number(stringValue);

Number構(gòu)造函數(shù)是最慢的類型轉(zhuǎn)換方法,但是當(dāng)速度不是所考慮的關(guān)鍵時,使用它能夠使得代碼變得很干凈.


接下來的表格展示了執(zhí)行 + (取正)操作時所對應(yīng)的結(jié)果.通過先前的選了,其他轉(zhuǎn)換操作同樣會返回相同的結(jié)果.(下表 Octal代表八進制,Hex代表十六進制. 譯者注)







































type-convert to number (+col) : String Values.
""
(empty
string)
"-1.6" "0" "1" "1.6" "8" "16" "16.8" "123e-2" "010"
(Octal)
"0x10"
(Hex)
"0xFF"
(Hex)
"-010" "-0x10" "xx"
+col 0 -1.6 0 1 1.6 8 16 16.8 1.23 10 16 255 -10 NaN NaN

需要考慮從的是當(dāng)轉(zhuǎn)換字符串類型到數(shù)值類型時,如果需要從不是表示數(shù)值的字符串中返回結(jié)果.空字符串將會返回數(shù)值零,這對于程序可能是無害的也可能是致命傷害,但這是應(yīng)該注意得到可能會發(fā)生的.在其他各項中都是遵循Javascript格式化結(jié)構(gòu)的,可能對于十六進制數(shù)有些疑問,因為最后還是將他們表示成為了十進制.然而字符串想要被解析為十六進制必須被認為十六進制(以 0x 或者 0X 起頭).字符串無法被識別為 NaN.它是 isNaN 函數(shù)返回結(jié)果.字符串類型數(shù)字是一個指數(shù)格式 ("123e-2") ,不再被理解為負號.





















type-convert to number (+col) : Other Values.
undefined null true false new Object() function(){
return;
}
+col NaN 0 1 0 NaN NaN

Objects 和 functions 總是被轉(zhuǎn)換為 NaN . undefinednull 同樣代表沒有東西,但是只有 null 被轉(zhuǎn)換為數(shù)值零.可能是因為他們先被轉(zhuǎn)換為波爾型,然后才轉(zhuǎn)換為數(shù)值型,在上文中轉(zhuǎn)換為波爾型的結(jié)果已經(jīng)很清楚了, null 轉(zhuǎn)換為波爾型將會返回 false . 它將會變?yōu)閿?shù)值零. 他們幾乎都不必轉(zhuǎn)換為數(shù)值類型.他們?nèi)绾芜M行轉(zhuǎn)換的真正意義在于為了考慮一些偶然的結(jié)果,要轉(zhuǎn)換一個字符串時,結(jié)果返回的是他們這些(或者是由于進行了一些數(shù)學(xué)計算操作才返回了這些).


解析數(shù)值


一種轉(zhuǎn)換字符串類型到數(shù)值類型的可以選擇方法是使用全局函數(shù),它是一個已經(jīng)設(shè)計好的解析字符串返回數(shù)值的函數(shù). parseFloat 函數(shù)接受一個字符串參數(shù),返回一個單精度數(shù)值.這是一種快速的轉(zhuǎn)換非字符串參數(shù)的方法.


字符解析函數(shù)獲取每一個字符直到遇到不屬于數(shù)值的字符,然后返回它已獲取的數(shù)值.這個特性常常被用于開發(fā)中.比如一個代表CSS長度的字符串,它的值是 "34.5em" parseFloat 函數(shù)不會理會 "em" 因為這些字符無法與之前的數(shù)字產(chǎn)生有效的值.它將會返回 34.5.這個CSS字符串中的數(shù)字部分.


parseFloat







































parseFloat(col) : String Values.
""
(empty
string)
"-1.6" "0" "1" "1.6" "8" "16" "16.8" "123e-2" "010"
(Octal)
"0x10"
(Hex)
"0xFF"
(Hex)
"-010" "-0x10" "xx"
parseFloat(col) NaN -1.6 0 1 1.6 8 16 16.8 1.23 10 0 0 -10 0 NaN

對于 parseFloat 解析空字符串將會返回 NaN ,是因為空字符串不屬于數(shù)字表達式.指數(shù)可以被解析,由0起頭的八進制不會阻止字符串解析為十進制數(shù).十六進制數(shù)卻因為 "x" 無法作為數(shù)字被解析而停止解析而返回一個零.





















parseFloat(col) : Other Values.
undefined null true false new Object() function(){
return;
}
parseFloat(col) NaN NaN NaN NaN NaN NaN

非字符串類型轉(zhuǎn)換成為快速轉(zhuǎn)換,作為一個字符串傳遞給 parseFloat .當(dāng)那些類型轉(zhuǎn)換作為字符串時不在是正常的結(jié)果,它的解析結(jié)果是 NaN. Objects 和 functions 可能有自定義 toString 方法返回字符串將會被解析成為數(shù)值,這是一個特殊的要求.


parseInt


parseInt 函數(shù)的工作方式和 parseFloat 有些相似.不同之處在于它是嘗試把字符串轉(zhuǎn)換為整型數(shù)值,只能辨認幾個少數(shù)作為數(shù)字的符號.


parseInt 函數(shù)偶爾被用作轉(zhuǎn)換單精度浮點數(shù)值類型為整型.由于這種轉(zhuǎn)換首先要從字符串類型轉(zhuǎn)換到單精度數(shù)值類型所以是不太適用的,另外,由于它會產(chǎn)生一些錯誤,所以變得非常沒有效率,比如 2e-200 這個科學(xué)計數(shù)法的數(shù)值正確的返回因該是零,但是 parseInt 返回 2 .并且由于是Javascript 格式化,數(shù)值常常返回的是一些近似值.比如 1/2 + 1/3 + 1/6 = 0.9999999999999999 ,這個表達式的結(jié)果的近似值應(yīng)該是 1 ,但 parseInt 竟會返回 0.


可以取得近似值的 Math.round, Math.ceilMath.floor 都比較合適這個工作,為了取得結(jié)果,表達式將會被作為32位有符號整型,這個規(guī)則同樣適用于下面這些情況.(譯者注 Math.round 函數(shù)執(zhí)行的是常見的四舍五入,0.4以及一下將會被忽略,0.5以及以上將會被加1. Math.ceil 函數(shù)在只要有小數(shù)的情況是就加1 . Math.floor 函數(shù)則無論小數(shù)大小都會被忽略.由這些函數(shù)的定義可知 parseInt 方法對于小數(shù)采取的是同 Math.floor 一樣的處理方式)

































parseInt(col) : Numeric Values.
-1.6 -0 +0 1 1.6 8 16 16.8 123e-2 -Infinity +Infinity NaN
parseInt(col) -1 0 0 1 1 8 16 16 1 NaN NaN NaN

在結(jié)果中我們可以很明顯的看到函數(shù)執(zhí)行時先把參數(shù)轉(zhuǎn)換為字符串型然后才進行解析.注意那個 123e-2 值,它就相當(dāng)于數(shù)值 1.23 ,執(zhí)行類型轉(zhuǎn)換時轉(zhuǎn)換到字符串類型 "1.23" ,所以這項在上表中看起來很奇怪,但是這是正確的.







































parseInt(col) : String Values.
""
(empty
string)
"-1.6" "0" "1" "1.6" "8" "16" "16.8" "123e-2" "010"
(Octal)
"0x10"
(Hex)
"0xFF"
(Hex)
"-010" "-0x10" "xx"
parseInt(col) NaN -1 0 1 1 8 16 16 123 8 16 255 -8 -16 NaN

進行格式化到整型中當(dāng)字符串是八進制或者十六進制數(shù)時, parseInt 函數(shù)可以以按符合Javascript代碼規(guī)則的方式解析他們,甚至當(dāng)他們帶有負號時.





















parseInt(col) : Other Values.
undefined null true false new Object() function(){
return;
}
parseInt(col) NaN NaN NaN NaN NaN NaN

As parseInt type-converts its non-string arguments to strings it always produces the same results for boolean, null, undefined, object and function arguments as parseFloat (assuming objects and functions do not have custom toString methods).
parseIntparseFloat 一樣在接受非字符串的其他類型參數(shù)時,都會產(chǎn)生相同的結(jié)果.比如 boolean, null, undefined, object and function (假定這些 objectes 和 functions 都沒有自定義 toString 方法).


parseInt 指定基數(shù)參數(shù)


這是一個少有讓人滿意的功能, parseInt 允許我們自定義接受參數(shù)的進制格式.比如以0開頭的字符串很少會被用于八進制格式化(特別是在用戶輸入中). 為了處理這類問題, parseInt 接受第二個參數(shù),基數(shù).它可以指出第一個字符串參數(shù)要被如何解析.特別指出,第二個參數(shù)如果是 10 , parseInt 函數(shù)將解析第一參數(shù)字符串只能為十進制.







































parseInt(col, 10) : String Values.
""
(empty
string)
"-1.6" "0" "1" "1.6" "8" "16" "16.8" "123e-2" "010"
(Octal)
"0x10"
(Hex)
"0xFF"
(Hex)
"-010" "-0x10" "xx"
parseInt(col, 10) NaN -1 0 1 1 8 16 16 123 10 0 0 -10 0 NaN

八進制字符串現(xiàn)在已經(jīng)被解析為 10 了,十六進制字符串則變成了 0 ,因為解析步驟停止在了 "x" 字符上.


Number bases 2 to 36 can be used with parseInt. The following is base 16.
parseInt 第二參數(shù)的合法值為 2 到 36.接下來是基于16進制的.







































parseInt(col, 16) : String Values.
""
(empty
string)
"-1.6" "0" "1" "1.6" "8" "16" "16.8" "123e-2" "010"
(Octal)
"0x10"
(Hex)
"0xFF"
(Hex)
"-010" "-0x10" "xx"
parseInt(col, 16) NaN -1 0 1 1 8 22 22 4670 16 16 255 -16 -16 NaN

十六進制 0x 可以被識別出,在基于十六進制數(shù)時.


最后,嘗試下基于3進制.

































parseInt(col, 3) : Numeric Values.
-1.6 -0 +0 1 1.6 8 16 16.8 123e-2 -Infinity +Infinity NaN
parseInt(col, 3) -1 0 0 1 1 NaN 1 1 1 NaN NaN NaN

結(jié)果很明顯,數(shù)字 8 輸出 NaN 是因為 "8" 字符在三進制數(shù)中無法被解析,這和下面一行中空字符串參數(shù)產(chǎn)生了相同的結(jié)果.







































parseInt(col, 3) : String Values.
""
(empty
string)
"-1.6" "0" "1" "1.6" "8" "16" "16.8" "123e-2" "010"
(Octal)
"0x10"
(Hex)
"0xFF"
(Hex)
"-010" "-0x10" "xx"
parseInt(col, 3) NaN -1 0 1 1 NaN 1 1 5 3 0 0 -3 0 NaN

ToInt32


ToInt32 是一個內(nèi)置函數(shù),雖然很有用,但是無法像 parseInt 一樣被直接調(diào)用.用它轉(zhuǎn)換Javascript變量到數(shù)值有一些不同尋常的方式.但是它能在一些有限的情況下被使用.位操作,比如按位OR(|)和 按位AND (&) 操作數(shù)值時,在使用它們操作時能被轉(zhuǎn)換為數(shù)值類型.但是他們只工作在32位有符號的整形中,所以我們可以通過調(diào)用內(nèi)置函數(shù) ToInt32 返回已轉(zhuǎn)換的32位有符號整形變量(進行類型轉(zhuǎn)換).


結(jié)果就像是 parseInt 函數(shù)調(diào)用后,只是結(jié)果被限定為32位,因此是數(shù)值,而沒有 NaN 或者 Infinity.


就算是用空值進行操作,結(jié)果返回的也是一個數(shù)值,使用一個位運算不會印象結(jié)果,卻可以調(diào)用 ToInt32 函數(shù).下表表示經(jīng)過按位OR 0 運算后的結(jié)果.

































ToInt32 (col|0) : Numeric Values.
-1.6 -0 +0 1 1.6 8 16 16.8 123e-2 -Infinity +Infinity NaN
col|0 -1 0 0 1 1 8 16 16 1 0 0 0

NaN 和 ±Infinity 變成了0, 浮點數(shù)被縮短成了整形.







































ToInt32 (col|0) : String Values.
""
(empty
string)
"-1.6" "0" "1" "1.6" "8" "16" "16.8" "123e-2" "010"
(Octal)
"0x10"
(Hex)
"0xFF"
(Hex)
"-010" "-0x10" "xx"
col|0 0 -1 0 1 1 8 16 16 1 10 16 255 -10 0 0

ToInt32 把字符串類型變量將原被應(yīng)該被轉(zhuǎn)換為 NaN 的結(jié)果變成了 0.





















ToInt32 (col|0) : Other Values.
undefined null true false new Object() function(){
return;
}
col|0 0 0 1 0 0 0

操作后甚至 undefined, objects 和 functions 都被轉(zhuǎn)換為 0,注意,布爾值 true 被轉(zhuǎn)換成了數(shù)值 1.


轉(zhuǎn)換用戶輸入


大多數(shù)的結(jié)構(gòu)都是為了獲取用戶輸入. <input type="text">prompt .例如在表單中他們的結(jié)果是字符串類型.即使期望用戶只輸入數(shù)字,他們?nèi)匀豢赡茌斎肴院蜄|西(至少他們可能會輸入一個制表符).如果想要把字符串類型轉(zhuǎn)換為數(shù)值類型,上文的最后一種方法是最合適的.但是有時仍然會有一些錯誤的輸入難以發(fā)現(xiàn)和控制.


把字符串類型轉(zhuǎn)換為數(shù)值類型一種更有利的方法是使用正則表達式(Regular Expression),使得字符串確保可以被正確的格式化.它也可以為剔除一些字符串變量而服務(wù).


正則表達式例子

/^\d+$/                 //所有數(shù)字
/^\s*[-+]?\d+\s*$/ //連續(xù)的數(shù)字
/^\d{1,5}$/ //由1到5組成的數(shù)字
/^\d+\.\d\d$/ //Money
/^\d+(\.\d{2})$/ //Money
/^\d{1,3}(,\d\d\d)*\.\d\d$/ //帶逗號的 money - 12,432.57
// 可帶逗號和不帶逗號的 money - 12,432.57 or 12432.57
/^\d{1,3}(,\d\d\d)*\.\d\d$|^\d+\.\d\d$/

 

該文章在 2011/4/30 9:02:36 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved