其它
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位時突然變成科學計數法就無法正常轉換字符串
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