摘要:中有五種基本數據類型,以及一種復雜引用類型數據類型,中還細分了很多具體的類型,比如等等中又新增了一種類型。類型的數值范圍是,超出這個范圍的值為,可以使用函數來判斷數值是否在范圍內。
ECMAScript5中有五種基本數據類型:Undefined,Null,Boolean,Number,String,以及一種復雜(引用類型)數據類型:Object,Object中還細分了很多具體的類型,比如:Array, Function, Date等等;ECMAScript6中又新增了一種Symbol類型。
typeof操作符typeof是操作符,而不是函數,它可能返回:
"undefined":如果這個值未定義
"boolean":如果這個值是布爾值
"string":如果這個值是字符串值
"number":如果這個值是數值
"object":如果這個值是對象或者null
"function":如果這個值是函數
"symbol":如果這個值是Symbol值
函數在ECMAScript中是對象,不是一種數據類型;但是函數卻也有一些特殊的屬性,所以通過typeof來區分對象和函數是有必要的
Undefined類型Undefined類型只有一個值 —— undefined,當一個變量僅聲明而未初始化時,這個變量的值就是undefined(當一個變量未聲明(未定義)時,如果訪問它將會報錯)
var a; let b; console.log(a,b);//undefined undefined console.log(c);//ReferenceError: c is not defined
在ES6之前,typeof是一個百分之百安全的操作,因為即使是對于未聲明的變量,typeof會返回"undefined",而不會報錯。
但是ES6引入了let,const來聲明變量,這兩個命令沒有聲明提升,一定要在聲明語句之后才能使用,否則就會報錯;而且let,const還存在暫時性死區:
只要塊級作用域內存在let或const命令,它所聲明的變量就“綁定”(binding)這個區域,不再受外部的影響。
ES6 明確規定,如果區塊中存在let或const命令,這個區塊對這些命令聲明的變量,從一開始就形成了封閉作用域,凡是在聲明之前就使用這些變量,就會報錯
let tmp = 123; if (true) { tmp = "abc"; // ReferenceError: tmp is not defined let tmp; }
上面的代碼中存在全局變量tmp,但是塊級作用域內let又聲明了一個局部變量tmp,導致后者綁定這個塊級作用域,所以在let聲明變量前,對tmp賦值會報錯。
所以“暫時性死區”也意味著typeof不再是一個百分之百安全的操作,這樣的設計是為了讓大家養成良好的編程習慣,變量一定要在聲明之后使用,否則就報錯
Null類型Null類型只有一個值 —— null,從邏輯角度來看,null表示一個空對象指針,這也是用typeof操作符檢測null會返回"object"的原因。
undefined值是派生自null值的,所以undefined == null會返回true,但是它們兩者的用途完全不同。
只要意在保存對象的變量還沒有真正保存對象,就應該讓該變量保存null值,這樣做不僅可以體現null作為空指針對象的慣例,還有助于區分null和undefined。
Boolean類型Boolean類型有兩個字面值,表示真的true和表示假的false;ECMAScript中所有類型的值都有與這兩個Boolean值等價的值,可以通過Boolean()函數轉換
數據類型 | 轉換為true的值 | 轉換為false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | ""空字符串 |
Number | 任何非零數字值(包括無窮大) | 0和NaN |
Object | 任何對象 | null |
Undefined | 不適用 | undefined |
Symbol | 任何 | 不適用 |
Number類型的數值字面量格式有八進制(嚴格模式下使用八進制將會報錯)、十進制和十六進制,其中八進制字面值的第一位必須為0,十六進制前兩位必須為0x。在進行算術計算時,八進制和十六進制都會轉換為十進制。
Number類型使用IEEE754標準定義的64位浮點數表示,存儲為8字節,使用時不區分整數與浮點數,1與1.0是一樣的,存儲情況如下:
符號位S:第 1 位是正負數符號位(sign),0代表正數,1代表負
指數位E:中間的 11 位存儲指數(exponent),用來表示次方數
尾數位M:最后的 52 位是尾數(mantissa),超出的部分自動進一舍零
其中尾數位即有效數字部分,IEEE754規定,有效數字第一位默認總是1,即有效數字總是1.xx...xx的形式,其中第一位不進行存儲,而xx..xx的部分保存在64位浮點數之中,最長可能為52位。因此,JavaScript實際提供的有效數字最長為53個二進制位,一個數字可以表示為:
(-1)^符號位 * 1.xx...xx * 2^指數位
有效數字精度最多只能到53個二進制位,這意味著,絕對值小于2的53次方的整數,即在-(Math.pow(2, 53) - 1到 Math.pow(2, 53) - 1范圍內的整數都可以精確表示(安全整數),而不在該范圍內的整數則會喪失精度。
es6中增加了Number.MAX_SAFE_INTEGER及Number.MIN_SAFE_INTEGER來表示安全整數范圍的上下限,還增加了方法Number.isSafeInteger來判斷是否處于安全整數范圍內。
浮點數的最高精度是17位小數,但是計算時的精度遠遠不如整數,浮點數值計算會產生舍入誤差的問題,這是使用基于IEEE754數值的浮點計算的通病,所以永遠不要測試某個特定的浮點數數值。
Number類型的數值范圍是Number.MIN_VALUE ~ Number.MAX_VALUE,超出這個范圍的值為Infinity,可以使用isFinite()函數來判斷數值是否在范圍內。
Number類型有一個特殊的值——NaN(Not a Number)
他表示一個本來要返回數值的操作數卻未返回數值的情況,NaN是數字類型 但是不是數字,他有兩個特點
任何涉及NaN的操作都會返回NaN
NaN與任何值都不相等,包括它自己
0處于0返回NaN,其他的除以0返回infinity或-infinity
NaN的布爾值是false
isNaN()函數可以判斷傳入的參數是否“不是數值”,判斷前會自動調用Number()進行轉換,轉換后再進行判斷,任何不能轉換為數值的值都會導致這個函數返回true;這個函數也適用于對象,在基于對象調用它時,會先調用對象的valueOf()方法,然后確定該方法的返回值是否可以轉換為數值。如果不能,則基于這個返回值再調用toString()方法,再測試返回值
有以下幾種方法可以把非數值轉換為數值
Number()函數
可以用于任何類型,包括對象
如果是undefined值,返回NaN
對于字符串,數字的前導0會忽略,如果字符串包含了除數值,0x以外的字符將會返回NaN
如果是對象,先調用對象的valueOf()方法,然后確定該方法的返回值是否可以轉換為數值。如果不能,即返回值是NaN,則基于這個返回值再調用toString()方法,再去轉換返回的字符串值
parseInt()函數
字符串轉整數
忽略字符串前面的空格,直到找到第一個非空格字符,如果第一個字符不是數字字符或者正負號(小數點不是有效的數字字符),返回NaN。所以轉換空字符串返回NaN
可以識別并指定進制數,然后按照相應進制數轉換為相同大小的十進制。(因為ECMAScript 3和ECMAScript 5在解析八進制字面量字符時有分歧,ECMAScript 5 中的parseInt()已經不具備解析八進制的能力,前導0會被忽略,所以最好指定進制數,也就是第二個參數)
parseFloat()函數
字符串轉浮點數
忽略字符串前面的空格,直到找到第一個非空格字符,如果第一個字符不是浮點數字字符(字符中第一個小數點是有效的,后面的小數點都是無效的)或者正負號,返回NaN。
始終忽略前導0,它只解析十進制值,所以它只有一個參數。如果是十六進制會返回0,因為十六進制的0x,parseFloat()函數只會解析到0
字符串里如果是可以解析為整數的數,那會返回整數
~符號(按位非)
按位非的本質是 操作數的負值減1
對于NaN、Infinity,應用位操作符會被當做0來處理
console.log(~NaN);// -1 console.log(~Infinity);// -1
非數值應用位操作符時會先使用Number()函數將該值轉換為數值,在應用位操作符
console.log(~"12");// -13 console.log(~"w12");// -1
如果是對浮點數應用位操作符,將會對其取整(直接把小數點舍去的這種取整),再應用位操作符
console.log(~1.2);// -2 console.log(~-1.2);// 0
~~符號(兩次按位非)
執行兩次按位非,可以實現取整效果,直接把小數點舍去的這種取整
++、-- ,可以轉換數據類型,是按Number()函數來轉換的
先將++/--后面的內容按Number函數轉換,再加減
var a = "0xf"; a++; console.lgo(a);// 16
+、- 可以轉換數據類型,將其他的轉為數字類型
按Number()函數來轉換的
當+號前面沒有其他東西時,+字符串會按照Number()函數來轉換字符串,其他的時候是字符串連接
-轉換后,會在轉換后的數值前加上負號,所以都是用+好來轉換
String類型String類型表示由零個或多個16位Unicode字符組成的字符序列——字符串,JavaScript創建的時候,Unicode是一個16位字符集,所以JavaScript中的字符都是16位的,采用UCS-2編碼方式(關于Unicode的知識可以參見)
字符串是不可變的,一旦創建,值就不能改變;要改變就要先銷毀原來的字符串(銷毀過程在后臺完成),再用另一個包含新值的字符串填充該變量
String類型包含一些特殊的字符字面量,比如 , ,,xnn,unnnn等,他們稱為轉義序列,可以出現在字符串的任意位置,將被當做一個字符來解析;但是如果包含雙字節字符,字符串將解析錯誤,length也將返回錯誤的結果
var a = "Look this: "; var b = "Look this: u20BB7"; console.log(a,a.length);//"Look this: " 12 console.log(b,b.length);//"Look this: 7" 13
為了解決這個問題,ES6中對字符的Unicode表示法做了改進,只要將Unicode碼點放入大括號,就能正確解讀該字符,但是length屬性還是返回錯誤,若想要正確的可以通過Array.form(xx).length
var b = "Look this: u{20BB7}"; console.log(b,b.length);//"Look this:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95534.html
摘要:它們的區別之一就是在計算機中的存儲方式不同基本類型數據是將變量名及值存儲在變量對象中,而引用類型的數據是將變量名和地址存儲在變量對象中,真正的值是存儲在堆內存中。 showImg(https://segmentfault.com/img/remote/1460000017151449); 說點別的 這是《關于 JavaScript 你必須要知道的 33 個概念 》系列的第三篇文章,今天...
摘要:設計模式是以面向對象編程為基礎的,的面向對象編程和傳統的的面向對象編程有些差別,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續了解設計模式必須要先搞懂面向對象編程,否則只會讓你自己更痛苦。 JavaScript 中的構造函數 學習總結。知識只有分享才有存在的意義。 是時候替換你的 for 循環大法了~ 《小分享》JavaScript中數組的那些迭代方法~ ...
摘要:基本值原始值原始的布爾類型有兩個值和。創建布爾值的方式直接用字面量用函數,將其他任意值轉換成對應的原始布爾值。使用兩次非運算符,將其轉換成對應的布爾類型。下面來看一些將其他類型轉換成布爾類型的例子。 基本值(原始值) 原始的布爾類型boolean有兩個值: false 和 true。 > typeof false boolean > typeof true boolean 創建布爾值的...
摘要:但對于引用類型的數據主要是對象和數組,變量指向的內存地址,保存的只是一個引用地址指針,只能保證這個引用地址指針是固定的,至于它指向的堆內存中的存儲的值是不是可變的,就完全不能控制了。 基礎概念 變量是存儲信息的容器,這里需要區分一下:變量不是指存儲的信息本身,而是指這個用于存儲信息的容器,可以把變量想象成一個個用來裝東西的紙箱子 變量需要聲明,并且建議在聲明的同時進行初始化,如下所...
摘要:模塊化是隨著前端技術的發展,前端代碼爆炸式增長后,工程化所采取的必然措施。目前模塊化的思想分為和。特別指出,事件不等同于異步,回調也不等同于異步。將會討論安全的類型檢測惰性載入函數凍結對象定時器等話題。 Vue.js 前后端同構方案之準備篇——代碼優化 目前 Vue.js 的火爆不亞于當初的 React,本人對寫代碼有潔癖,代碼也是藝術。此篇是準備篇,工欲善其事,必先利其器。我們先在代...
閱讀 4122·2022-09-16 13:49
閱讀 1398·2021-11-22 15:12
閱讀 1519·2021-09-09 09:33
閱讀 1039·2019-08-30 13:15
閱讀 1720·2019-08-29 15:30
閱讀 654·2019-08-27 10:52
閱讀 2643·2019-08-26 17:41
閱讀 1896·2019-08-26 12:11