JS数据类型与类型转换
1.数字与字符串
功能不同
- 数字是数字,字符串是字符串,要严谨
- 数字能加减乘除,字符串不行
- 字符串能表示电话号码,数字不行
存储形式不同
- JS中,数字是用64位浮点数的形式存储的
- JS中,字符串是用类似UTF8形式存储的(UCS-2)
2.七种数据类型
- 数字 number
- 字符串 string
- 布尔 boolean
- 符号 symbol
- 未定义 undefined
- 空对象 null
- 对象 object
- 大数 bigint
- 口诀 五基两空一对象
数组,函数,日期,等等都属于object
3.布尔值
真或假 true / false
下列运算将会得到布尔值
- 否定运算 !value
- 相等运算 1==2 , 1!=2, 3<4 , 3<=4
4.数字 number 64位浮点数
写法
- 整数写法 1
- 小数写法 0.1
- 科学计数法 1.23e4
- 八进制写法 0123或00123或0o123
- 十六进制写法 0x3F 或 0X3F
- 二进制写法 0b11 或 0B11
特殊值
- 正0 和 负0 和 0 值都相等 只有在做分母时得到的值有区别
- 无穷大 infinity , +infinity, -infinity
- 无法表示的数字
- NaN(Not a Number) NaN != NaN true
- 属于number类型
JS数字存储形式
- 浮点就是浮动的点,意思就是小数点会移动
- 123.456可以表示为1.23456e10^2
- 也可以表示为12345.6e10^-2
浮点数.png
- 64位存储一个number
- 符号占1位
- 指数占11位(-1023~1024)
- 有效数字占52位(开头的1省略)
5.大数bigint
JS在2020年新出的一种数字类型,来看MDN对于这个数据类型的描述
BigInt
是一种内置对象,它提供了一种方法来表示大于 253 - 1
的整数。这原本是 Javascript中可以用 Number
表示的最大数字。BigInt
可以表示任意大的整数。
// 使用方法
// 可以用在一个整数字面量后面加 n 的方式定义一个 BigInt ,如:10n,或者调用函数BigInt()。
const theBiggestInt = 9007199254740991n;
const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n
const hugeString = BigInt("9007199254740991");
// ↪ 9007199254740991n
const hugeHex = BigInt("0x1fffffffffffff");
// ↪ 9007199254740991n
const hugeBin = BigInt("0b11111111111111111111111111111111111111111111111111111");
// ↪ 9007199254740991n
5.字符串string
每个字符两个字节( 阉割版UTF8 )
写法
- 单引号 '你好'
- 双引号 "你好"
- 反引号`你好`
转义
- \' 表示 '
- \ " 表示"
- \ n 表示换行
- \ r 表示回车
- \t 表示tab制表符
- \ 表示 \
- \uFFFF 表示对应的Unicode字符
- \ xFF 表示前256个Unicode字符
字符串的属性
string.length 获取字符串的长度
-
string[index] 通过下边读取字符
let s = "hello"; s[5] // undefined 不报错
window.btoa 正常字符串转为 Base64编码的字符串
6.布尔值的使用
if配合布尔值
if语句经常需要判断真假
- if( value ){... } else { ...}
特殊情况
- 五个相当于false的值
- undefined null 0 NaN ''
- JS中除了以上五个值还有false之外,其余值全是true
3.undefined 与 null
没有什么本质的区别
注意:
- 如果一个变量声明了但没有赋值,那么默认值就是undefined
- 如果一个函数,没有写return,那么默认return 的是 undefined
- 习惯上把非对象的空值写为undefined,对象的空值为null
7.symbol 唯一值
第一个作用是作为属性名避免属性名冲突,
第二个作用是替代代码中多次使用的字符串(例如:abc),多次使用的字符串在代码中不易维护,而这时候定义一个对象的属性(属性名用Symbol格式),值为abc,就可以作为全局变量来使用了。
第三个作用,由于以Symbol值作为名称的属性,不会被常规方法遍历得到。我们可以利用这个特性,为对象定义一些非私有的、但又希望只用于内部的方法。
第四个作用,有时,我们希望重新使用同一个Symbol值,Symbol.for方法可以做到这一点。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol值。如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。
var a1 = Symbol('a')
var a2 = Symbol('a')
a1 !== a2 // true
可以给每个 Symbol 起一个名字,不过这个名字跟 Symbol 的值并没有关系,可以认为这个名字就是个注释。
8.变量声明
三种方式
- var a = 1;
- let a = 1;
- const a = 1;
三者区别
- var是过时的、不好用的方式
- let是新的,更合理的方式
- const是声明时必须赋值,且不能再改的方式
let声明
规则
- 遵循块作用域,即使用范围不能超出{ }
- 不能重复声明
- 可以赋值,也可以不赋值
- 必须先声明再使用,否则报错
- 全局声明的let变量,不会变成 window下的属性
- for配合let使用有奇效
const声明
规则
- 跟let几乎一样
- 只有一条不一样: 声明时就要赋值,赋值后不能改
9.类型转换
number => string
- String(n)
- n + ''
string => number
-
Number(s)
var a = 10000000000000000000000; var b = Number(a); console.log(b); // 1e+22 数字过大会变成科学计数法
parseInt(s) / parseFloat(s)
s - 0 / +s
X = > bool
- Boolean(X)
- !!x 取原始布尔值
X => string
String(x)
-
x.toString()
1.toString();// Uncaught SyntaxError: Invalid or unexpected token // JS会认为1.toString是小数,所以会报错
(1).toString(); // "1" 加个括号就解决了 1..toString(); // "1" 多加个点也能解决