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,501评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,673评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,610评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,939评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,668评论 6 412
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,004评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,001评论 3 449
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,173评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,705评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,426评论 3 359
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,656评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,139评论 5 364
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,833评论 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,247评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,580评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,371评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,621评论 2 380

推荐阅读更多精彩内容