久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

深入了解JS中的原始類型(primitive type)

深入了解JS中的原始類型(primitive type)

JavaScript中的原始類型(primitive type)包括Undefined、Null、Number、Boolean和String,其他變量均為引用類型,也就是Object Type。原始類型保存位置是“棧內存”,而引用類型保存在“堆內存”中,但通常JavaScript中對變量的使用,并不十分關心變量在內存中的位置。

“typeof”操作符用以獲取變量的值的數據類型。typeof可以接受變量名或字面量值作為操作數,返回一個描述變量類型信息的字符串。需要注意的是,typeof的返回值與JavaScript中的類型并不是一一對應的:

  • “undefined” ——變量值未定義

  • “number” ——變量值是數值

  • “boolean” ——變量值是布爾值

  • “string” ——變量值是字符串

  • “object” ——變量值是對象或者null

  • “function” ——變量值是函數

另外,typeof是一個像(+,-)一樣的操作符,而不是函數,雖然形如“typeof(12)”的用法不會產生錯誤,但對于操作符來說“typeof 12”才是合適的使用方法。

1、undefined和null

Undefined Type在ECMA-262文檔中的定義是:

The Undefined type has exactly one value, called undefined. Any variable that has not been assigned a value has the value undefined.

Undefined類型只有一個唯一的值“undefined”,變量的值為undefined意味著變量沒有被初始化。對于尚未使用var聲明的變量,使用它會產生錯誤,但使用typeof操作符會返回“undefined”:

var foo; alert(foo);        // undefined alert(bar);        // 錯誤 alert(typeof foo); // undefined alert(typeof bar); // undefined

undefined被實現為一個全局變量(而不是像null一樣的字面值),它的值是“未定義”。在ECMAScript 3中,undefined可以被賦予其它值,在ECMAScript 5中已被修正為只讀的。

Null Type 也只有一個值null,用來表示“空值”。多數編程語言中的都有類似null、nil等用來表示空值的字面量。但與其他編程語言不同的是,JavaScript并不使用null表示未初始化的變量的值(由undefined表示)。

null的邏輯意義是表示一個空對象指針。JavaScript中通常意義的對象并不包括簡單數據類型,所以邏輯上null表示變量指向了一個空值的Object類型(不是字面量“{}”)。

出于這個原因,便可理解為什么使用typeof操作符獲取null值的類型會得到“object”了。JavaScript里null值對Object類型的意義,類似于0對Number類型,“”對于String類型。

undefined和null都用來描述“空值”,但在邏輯意義上,undefined比null要更為“底層”一些。一般情況下,不需要顯示的把變量值指定為undefined。

而對于一個意在保存Object但還沒有真正指向一個對象的變量,則應該把變量值設置為null,體現null作為空對象指針的作用并且與undefined區分開來。

2、數值

ECMAScript使用了簡化的數字模型。它只有一個數字類型Number,而沒有分離出單獨的整數類型。在實現上,Number類型采用了IEEE 754標準定義的64位雙精度浮點數格式。

64位的浮點數格式中,52位用來表示尾數,11位表示指數,1位符號。因此在表示整數時,JavaScript能夠表示的整數范圍在-Math.pow(2,53)和Math.pow(2,53)之間,超過這個范圍,低位數字的精度便無法保證了。

var n = Math.pow(2,53); // 9007199254740992 alert(n === n + 1);     // true, 9007199254740992 + 1得到的值還是9007199254740992

在實際的Web開發中,若需要在后臺(如Java)傳遞一個Long Int類型給Javascript處理,很可能JavaScript把JSON數據解析為Number類型后,得到的結果并不是你想要的:它的后面幾位數字發生了變化。

JavaScript使用浮點數值進行運算,因此小數部分會出現精度問題,這跟所有其他采用IEEE 754標準格式表示浮點數的編程語言一樣。避免在代碼中出現對小數部分的相等判斷。(整數部分是精確的)

var a = 0.1; var b = 0.2; alert(a + b === 0.3); // false

如果數值超過了JavaScript所能表示數字上限(overflow),將被自動轉換為一個代表無窮大的Infinity(或-Infinity,負無窮)值;如果數值無限接近0并且超過JavaScript表示范圍(underflow),將被設置為0(或-0,同0)。JavaScript不會出現溢出錯誤(包括被零整除的時候)。

var a = Number.MAX_VALUE * 2;          //Infinity var b = Number.MIN_VALUE / 2;          //0 var c = 1 / 0;                         //Infinity or NaN, 依JS執行環境不同 var d = 0 / 0;                         // NaN

Number類型定義了一個特殊的值NaN,即not-a-number。NaN的意義代表一個本該得到數值的地方沒有得到任何數值。任何使用NaN做操作數的算術運算,都會得到NaN。

另外NaN也是唯一一個使用對自身進行相等判斷會得到false的數值。NaN的這個怪異之處破壞了JavaScript運算符的對稱性。如果在代碼中需要通過比較數值大小進行分支判斷,就需要注意可能出現NaN的情況,因為使用NaN與其他數值進行大小比較總會得到false,而這可能不是你想要的結果。

var a = 10;    a = a - "not number"         // NaN alert(a === a);             // false var b = 12 + a;              // NaN var c = 10; alert(b >= c || b < c);      // false

另一個Number類型中不常引人注目的地方是位運算。JavaScript中提供了按位操作運算符。在很多其他編程語言中,按位操作可以進行硬件級處理,所以非常快。

但是JavaScript沒有整數類型,它的位操作是先把數值轉換為32位整數,然后進行計算,然后再轉換回去,JavaScript絕大部分運行環境是在瀏覽器中,與硬件相隔較遠,因此位操作執行很慢。

3、字符串

與很多其他編程語言中一樣,JavaScript中的字符串值也是不可變的,改變一個字符串變量的值,相當于重新生成了一個字符串并把它賦值給變量。JavaScript中的簡單類型無法進行方法調用(作為this調用函數),但我們還是可以進行諸如

"abcdefg".toUpperCase();

這樣的操作。這是因為JavaScript為簡單數據類型提供了一種方式,把它們包裝為對象類型,然后進行方法調用。”"abcdefg"“先被隱式地包裝為對象,然后使用包裝出的對象調用toUpperCase方法,待方法調用結束后,JavaScript再隱式地把包裝對象回收。

其它簡單數據類型也使用同樣的方式。也可以使用JavaScript提供的構造函數顯示地創建包裝對象,JavaScript提供了String()、Number()和Boolean()三個構造函數,分別用于構建String、Number和Boolean類型的包裝對象。

4、類型轉換

ECMA-262中對數據類型的轉換有詳細的定義,很多JavaScript的參考資料也會列出類型轉換的詳細規則,這里就不再贅述了,下面只討論一些值得注意的問題。

JavaScript有兩組相等比較運算符:”===“和”!==“、”==“和”!=“。Crockford在著作《JavaScript:The Good Parts》里面列舉的Bad Parts中的第一個就是”==“運算符。

原因在于”==“運算符會執行隱式的類型轉換,而JavaScript中類型轉換的規則又非常復雜,很容易導致代碼中出現不易發現的bug。與”===“和其他編程語言中的”==“不同,JavaScript中的”==“運算符并不具備傳遞性: ?x?y?z(x == y ∧ y == z → x == z)并不成立:

"" == "0";             // false "" == 0;               // true "0" == 0;              // true

Crockford和Zakas都建議不要使用“==”運算符,而使用“===”代替。若不遵循這個建議,使用“==”運算符時,請務必確保你明確知道兩個比較變量的類型信息,以免發生預料之外的類型轉換。

另外一個經常用到類型轉換的地方是分支判斷。if(和其它)語句并不要求進行分支判斷的表達式結果必須為Boolean類型,而會根據特定的規則把判斷表達式的結果轉換為true或false后再進行判斷。

if (obj !== undefined && obj !== null) {     // code }  // 上面的判斷條件可以替換為  if (obj) {     // code }

上面代碼中的obj代表一個對象變量,若其值為undefined或null,則被轉換為false,反之轉換為true。這種方式并不完全安全,若使用的變量是簡單數據類型,就需要注意一些特殊值的轉換規則,否則代碼可能不會按照預想的方式執行。

if (typeof num === "number" && num) {      // if num is 0, get false     //code }

上面代碼的本意是獲取一個有效的數值類型,屏蔽了其他類型和num的值為NaN的情況(NaN會轉換false)。但代碼中有一個紕漏,它忽略了num值為0的情況。

0值會被轉換為false,從而導致下面的代碼不會被執行,這可能與編碼者的本意相違背。同樣使用String類型作為分支條件,也要考慮""會被自動轉換為false的情況。

與分支判斷中的類型轉換相似的情況,是采用短路方式為變量賦值。由于JavaScript中”&&“和”||“操作符的特性,我們經常采用短路方式為變量賦值。

”&&“操作符會返回表達式中第一個可以轉換為false的操作數或最后一個操作數(全為true時);”||“操作符返回表達式中第一個可以轉換為true的操作數或最后一個操作數(全為false時)。

var obj = obj1 || obj2 || {};  var attr = obj && pro && attr;

與分支判斷一樣,需要警惕表達式中可能出現的特殊值:0,"",null等。

JavaScript的類型模型,提供了極大的靈活性的同時也帶來了很多陷阱,編碼過程中需要小心地規避這些陷阱,因為代碼審查很容易忽略它們,出現問題時,它們也往往很難被發現。

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
日韩欧美字幕| 国产精品美女久久久久久不卡| 最新亚洲一区| 欧美日韩亚洲在线观看| 欧美sm一区| 精精国产xxxx视频在线野外| 日韩免费视频| 国产成人77亚洲精品www| 精品国产a一区二区三区v免费| 亚洲激情黄色| 蜜臀91精品国产高清在线观看| 欧美黑人巨大videos精品| 欧美成人一二区| 国产 日韩 欧美 综合 一区| 高潮一区二区| 99久久精品网| 国产精品115| 一区二区亚洲视频| 亚洲三级毛片| 国产欧美三级| 日韩成人亚洲| 在线亚洲自拍| 日韩av网站在线免费观看| 亚洲欧洲日本mm| 亚洲精品成人一区| 亚洲婷婷在线| 亚洲激情社区| 国产精品密蕾丝视频下载| 国产精品多人| 久久国产日本精品| 另类av一区二区| 日韩精品免费观看视频| 丝袜亚洲另类欧美| 亚洲精品九九| 国产成人黄色| 亚洲区欧美区| 欧美日韩亚洲在线观看| 精品一区二区三区免费看| 日韩av网站在线观看| 亚洲制服少妇| 97精品国产| 亚洲制服欧美另类| 亚洲制服欧美另类| 日韩精品午夜视频| 美女国产精品久久久| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 精品资源在线| 红桃视频国产一区| 亚洲精品无播放器在线播放| 亚洲精品九九| 香蕉成人av| 免费视频一区二区三区在线观看 | 久久久久国产一区二区| 老牛国内精品亚洲成av人片| 91精品99| 91九色精品国产一区二区| 久久美女精品| 麻豆精品久久久| 亚洲午夜天堂| 久久中文在线| 亚欧成人精品| 欧美 日韩 国产一区二区在线视频| 亚洲深夜av| 国产高清亚洲| 国产精选久久| 国产va免费精品观看精品视频| 亚洲欧洲美洲av| 蜜臀av亚洲一区中文字幕| 国产伦精品一区二区三区视频| 久久av资源| 怡红院精品视频在线观看极品| 亚洲毛片在线免费| 成人污污视频| 中文字幕乱码亚洲无线精品一区| 麻豆国产欧美日韩综合精品二区| 九色porny丨国产首页在线| 伊人成人在线视频| 日韩制服丝袜av| 国产日韩精品视频一区二区三区| 日韩精品永久网址| 国产精品地址| 日韩在线欧美| 亚洲欧美久久| 91精品美女| 日本不卡高清| 日韩高清不卡一区二区| 日本精品不卡| 日韩欧美少妇| 日韩电影二区| 综合激情五月婷婷| 久久91导航| 国产精品成人**免费视频| 精品亚洲成人| 在线精品国产亚洲| 日本久久精品| 日韩国产在线一| 精品捆绑调教一区二区三区| 综合欧美精品| 国产欧美日韩亚洲一区二区三区| 久久久久美女| 精品国产一区二区三区2021| 亚洲精品精选| 天堂成人免费av电影一区 | 国产一区二区三区日韩精品| 亚洲性图久久| 狠狠久久伊人| 国产美女久久| 美女精品在线| 日韩精品专区| 欧美黄页在线免费观看| 久久国产婷婷国产香蕉| 青草国产精品| 另类欧美日韩国产在线| 国产欧美69| 亚洲欧美高清| 国产美女高潮在线观看| 国产精品jk白丝蜜臀av小说| 91精品视频一区二区| 亚洲资源网站| 免费精品视频最新在线| 国产美女一区| 亚洲深夜影院| 亚洲aa在线| 国产精品一区亚洲| 国产精品日本一区二区不卡视频| 国产精品密蕾丝视频下载| 久久免费福利| 婷婷激情一区| 99视频+国产日韩欧美| 国产精品日本| 国产高清精品二区| 久久不见久久见中文字幕免费| 免费一级欧美在线观看视频| 欧美一区91| 亚洲三区欧美一区国产二区| 免费在线欧美视频| 老司机久久99久久精品播放免费| 999久久久91| 欧美精品一区二区久久| 欧美91在线|欧美| av免费不卡国产观看| 欧美一级全黄| 天堂av一区| 午夜精品亚洲| 日韩av福利| 久久久91麻豆精品国产一区| 欧美综合国产| 亚洲午夜精品久久久久久app| 国产精品视频首页| 91精品国产成人观看| 国产精品色在线网站| 亚洲精品第一| 亚洲自啪免费| 日韩免费看片| 成人va天堂| 亚洲不卡系列| 日韩一区三区| 中文在线а√天堂| 精品九九久久| 精品国内亚洲2022精品成人| 欧美亚洲色图校园春色| 高清日韩中文字幕| 日韩精品水蜜桃| 国产成人黄色| 日本一区二区三区中文字幕| 中文在线一区| 日韩视频在线一区二区三区| 亚洲特级毛片| 四虎4545www国产精品| 国产一区二区三区亚洲综合| 国产精品黄色| 国产精品成人**免费视频 | 蜜桃av.网站在线观看| 久久亚洲专区| 在线日韩中文| 欧美网站在线| 欧美一级一区| 青青草91久久久久久久久| 亚洲精品动态| 国产精品久久久久久av公交车| 麻豆国产欧美一区二区三区| 欧美日韩1区2区3区| 黄色精品网站| 国产精品99一区二区三| 日韩在线麻豆| 亚洲精选成人| 国产综合视频| 国产成人精品一区二区免费看京 | 伊人久久亚洲影院| 国产精品99一区二区| 成人免费电影网址| 一区二区三区四区日本视频| 成人亚洲一区| 欧美肉体xxxx裸体137大胆| 欧美不卡视频| 欧美一级鲁丝片| 美国欧美日韩国产在线播放| 麻豆91精品视频| 激情综合五月| 国产一区丝袜|