JS數據類型

其它
1.強烈推薦閱讀《我用了兩個月的時間才理解 let》
2.markdown如何輸入上下標 輸入上標,如x^2 , 則輸入x^2
3.鍵盤怎么打頓號?中文狀態下點擊"|"鍵
4.二進制只有0和1
5.前6種類型都是簡單類型,只有object叫做復雜類型
6.JS秘密花園收錄了JS的各種bug
7.JS新增了一種類型bigint 因為太新了用得很少,面試基本不考。

數據為什么需要類型?
數字與字符串
(1)功能不同
數字是數字,字符串是字符串,要嚴謹
數字能加減乘除,字符串不行
字符串能表示電話號碼(有時候電話號碼還可以有字母),數字不同
(2)存儲形式不同
JS中,數字是用64位浮點數的形式存儲的
JS中,字符串是用類似UTF8形式存儲的(UCS-2)

JS是如何存數字的?

就是把所有數字變成二進制存下來,再用十六進制簡化。
把所有的十進制都轉為二進制
補充:內存里只能存0和1,2都存不了。2就要把它變成1或0。

二進制
1.十進制轉二進制
例子:31變成二進制 31 = ?x2^5 + ?x2^4 + ?x2^3 + ?x2^2 + ?x2^1 + ?x2^0
經過一番嘗試 31=0x2^5 + 1x2^4 + 1x2^3 + 1x2^2 + 1x2^1 + 1x2^0
所以31(十進制)=01 1111(二進制)
2.二進制轉十進制
例子:100011變成十進制

在這里插入圖片描述

每位數乘以2的N次方,然后加起來即可
100011=2^5 + 2^1 + 2^0=35

用十六進制表示二進制
十六進制是二進制的簡寫(把每4位改寫成1位)
十六進制:0 1 2 3 4 5 6 7 8 9 A B C D E F
十六進制沒有大于9的數字,后面是字母替代

在這里插入圖片描述

在這里插入圖片描述

JS如何存字符?

1.英文編號
轉成數字,但是注意‘1’不能用1來表示
編號表示,用0~127表示所有符號
最常用的:0是48,A是65,a是97
上面是外國的編號只能存128個字符,于是中文也開始編號了。

在這里插入圖片描述

2.中文編號「國標2312」
中文編號由中國國家標準局來編,名稱「國標2312」
國標是16位,也就是2個字節。

在這里插入圖片描述

3.國標擴簡稱GBK
怎么表示生僻字,繁體字,韓文?之前忘了編進取。微軟推出了一個國標擴展,簡稱GBK。
在這里插入圖片描述

國標局推出GB18030想取代微軟的GBK但由于不兼容GB2312,所以沒人愿意使用。

4.藏文泰語還是沒法支持,于是推出了萬國碼 Unicode
Unicode優點:已收錄13萬字符(大于16位),全世界通用。以后還會繼續擴充不會停止。
缺點:兩個字節不夠用,每個字符要用3個及以上字節。這樣所有文件都擴大50%不劃算。
那怎么辦?
雖然用Unicode但存的時候偷懶,UTF-8就被發明出來了。

在這里插入圖片描述

UTF-8就是通過"讓前面那個人告訴計算機我有多少位"來把這個變長得以實現,從而得到節省空間的目的。

字符也是存數字,數字也是存數字。計算機怎么知道存的是字符還是數字呢?
很簡單,計算機根本不知道,它看你的文件格式。文件后綴是txt那存的就是字符串。

js中的數據類型

8種
數字number
字符串string
布爾bool, 只有兩個值true和false(注意大小寫)
符號symbol
空undefined
空null
對象object
BigInt

總結:4基2空1對象
前6種類型都是簡單類型,只有object叫做復雜類型
以下不是數據類型
數組,函數,日期
它們都屬于object

一.數字number 64位浮點數

1.寫法
(1)整數寫法 1
(2)小數寫法 0.1
(3)科學計數法 1.23e4(1.23x10^4 )
(4)八進制寫法 0123或00123或0o123
(5)十六進制寫法 0x3F或0X3F
(6)二進制寫法 0b11或0B11
2.特殊值
(1)正0和負0
(2)無窮大
infinity、+infinity、-infinity
(3)無法表示的數字
NaN(not a number)
無法表示的數字是數字(認知有限時的替代)
NaN==NaN
輸出結果是false
為什么是64位浮點數?

在這里插入圖片描述

要先轉為二進制,然后再改寫。

例子:0.5的存儲形式是? 
首先轉為二進制0.1,所以是 0 -1 0

64位浮點數最大/小存多少?
范圍和精度
范圍(忽略符號位)
指數拉滿2^1024、有效數字拉滿全是1,得到最大二進制數字。
轉化為十進制就是(1后面接300個0)
Number.MAX_VALUE:1.7976931348623157e+308
指數負方向拉滿2^-1023 、 有效數字最小1,得到最小值(0后面加300個小數點0)Number.MIN_VALUE:5e-324
精度(有效數字)
最多只能到52+1個二進制位表示有效數字
2^52 對應的十進制是9后面15個0,所以15位有效數字都能精確表示
16位有效數字如果小于90開頭也能精確表示
9110 0000 0000 0001就存不下來

二.字符串string

每個字符兩個字節(閹割版UTF8)
寫法

單引號'你好' 雙引號"你好" 反引號`你好`

注意
引號不屬于字符串的一部分,就像書名不屬于書名的一部分一樣
如果要在單引號里面包含單引號怎么辦?

例子:'it's ok'
正確寫法:'it\'s ok'  //這就是轉義
或者"it's ok"
或者`it's ok`

什么是轉義?
用另一種寫法表示你想要的東西(背下來)

\' 表示'
\" 表示"
\n 表示換行
\r 表示回車
\t 表示tab制表符
\\ 表示\
\uFFFF 表示對應的Unicode字符 
\xFF    表示前256個Unicode字符

例子: ??你 Unicode

控制臺: "\u4F60"
輸出:   '你'
 
控制臺: "\x33"
輸出:   '3'

多行字符串
用反引號可以做到

let s=`大家好
我是小紅
你是誰
 `
控制行輸入: s
輸出結果:
"大家好
我是小紅
你是誰"

字符串的屬性
等等,對象才有屬性,為什么字符串也有屬性?
只有對象才有屬性,字符串 數字 布爾沒有屬性這么一說的。
為什么字符串也屬性?等學完對象才能解答

字符串的長度
string.length

'123'.length    //3
'\n\r\t'.length //3
'\\\\\\'.length //3
''.length       //0
' '.length      //1

通過下標讀取字符
1.string[index]
let s='hello'
s[0]//"h"
2.注意index從0開始
s[0]是第一個字符
3.注意index到length
let s="hello"
s[5] //undefined,居然不報錯

base64轉碼
1.window.btoa
正常字符串轉為 Base64 編碼的字符串
編碼

例子:window.btoa('123')
輸出結果:'MTIz'

2.window.atob
Base64編碼的字符串轉為原來的字符串
反編碼

例子:window.atob('MTIz')
 輸出結果:'123'

3.一般用來隱藏招聘啟事里的簡歷
郵箱:ZmFuZ3lpbmdoYW5nQGZveG1haWwuY29t
有時候也用來自欺欺人
所謂的「加密」也就能騙過一部分外行

例子:window.atob('ZmFuZ3lpbmdoYW5nQGZveG1haWwuY29t')
輸出結果:'fangyinghang@foxmail.com'

三.布爾bool兩個值true和false

1.下列運算符會得到bool值
(1)否定運算
例如:!value
(2)相等運算
例如:1==2、1!=2、3===4、3!==4
(3)比較運算
例如:1>2、1>=2、3<4、3<=4

2.if配bool
(1)if語句常常需要判斷真假
if(value){...}else{...}
(2)問題來了
如果value是bool值還好說
如果value不是bool值咋辦,誰真誰假?
1是真還是假,0是真還是假?
命令行:成功返回0,失敗返回12345
主要還是由程序員決定的
'1'是真還是假,'0'是真還是假?
那怎么判斷呢?

5個falsy值(背下來)

falsy就是相當于false但是又不是false的值
分別是undefined null 0 NaN ''(注意沒空格)
假:2個空2個數字1個字符串

2個空undefined null,2個數字0 NaN,1個字符串''。

判斷1:1是真還是假,0是真還是假?
1不屬于2個數字所以是真,0屬于2個數字所以是假
1是真,0是假

判斷2:'1'是真還是假,'0'是真還是假?
'1'和'0'都是真

總結:
7個數據類型
數字number 字符串string 布爾bool 符號symbol 空undefined 空null 對象object
4基2空1對象
5個falsy值
undefined null 0 NaN ''
2空2數字1字符串

undefined和null兩種空類型

為什么有兩個空,這就是js原(la)創(ji)之處

區別
沒有本質區別
細節一
如果一個變量聲明了但沒有賦值,那么默認值就是undefined,而不是null

var a  //a的值就是undefined

細節二
如果一個函數沒有寫return,那么默認return undefined,而不是null
細節三
前端程序員習慣把非對象的空值寫為undefined,把對象的空值寫為null

四.符號symbol(很少用,沒用)

變量聲明

三種聲明方式

var a=1
let a=1
const a=1
a=1

區別
var是過時的、不好用的方式
let是新的,更合理的方式
const是聲明時必須賦值,且不能再改的方式
最后這種方式時錯誤的不準這樣聲明

總結:
以后就用let或const,不要用var!
let聲明變量 const聲明常量(不能變的量)
var變量提升押題時再講

let聲明
規則
1.遵循塊作用域,即使用范圍不能超出{}
2.不能重復申明

let a=1
let a=2 //錯誤

3.可以賦值也可以不賦值
4.必須先聲明再使用,否則報錯
5.全局聲明的let變量,不會變成window的屬性(var可以)
6.for循環配合let有奇效
面試題

 for(var i=0;i<5;i++){
   setTimeout(()=>console.log(i),0)
 }
 輸出結果:5
         5
         5
         5
         5
 for(let i=0;i<5;i++){
   setTimeout(()=>console.log(i),0)
 }
 輸出結果:0
         1
         2
         3
         4

const聲明
const變量是只讀變量,又叫做常量,不會變

規則
跟let幾乎一樣
只有一條不一樣:聲明時就要賦值,賦值后不能改

const i=1
i=2 //錯誤,不能修改

變量聲明時,既指定了值又指定了類型!(重要)

name和'name'的區別?
name是變量
值可變,可能是'name',也可能是'hello'
'name'是字符串常量
常量就是不變量
'name'只能是'name',不能是其他值

類型轉換

1.number=>string
1' String(n)
2' n+''(前端流行做法)
例子

1' var n=1
   String(n)
   輸出結果:"1"

2' var n=1
   n+''
   輸出結果:"1"

補充
js有個bug:String(100000000)
當括號內位數達到22位時突然變成科學計數法就無法正常轉換字符串


在這里插入圖片描述

解決js數字過大表現為科學計數法的問題

2.string=>number
1' Number(s)
2' s-0(前端流行做法)
3' parseInt(s)/parseFloat(s)
例子

1' var s='123'
   Number(s)
   輸出結果:123

2' var s='123'
   s-0
   輸出結果:123
   
3' parseInt(s)  

3.x=>bool
1' Boolean(x)
2' !!x(前端流行做法)

4.x=>string
1' String(x)
2' x.toString()
toString有個bug: 1.toString()

改為(1).toString()或者1..toString()

JS秘密花園收錄了JS的各種bug

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容