Javascript中的原始值
目前Javascript中有7种基础不可变数据类型,称之为原始值
原始值一旦创建就无法更改,重新赋值是为变量重新分配一个值,之前的值并未改变,会被垃圾回收机制回收
Null、Undefined、Boolean、Number、BigInt、String、Symbol
Javascript不支持任何创建自定义类型,所有值都必须为以上7中数据类型之一
使用typeof运算符可以获取数据的类型
有一个特殊的就是null,返回object,所以判断null时使用"===null"
Null
只有一个值null,表示没有任何对象
Undefined
只有一个值undefined,表示没有任何值
当需要显式的为一个变量赋值undefined时,使用void val语句
因为在javascript中,undefined不是保留关键字,也就是说可以作为变量名
let undefined = 2;
let name = undefined;
//此时name的值是2,而并不是我们预期的undefined
void val语句不管val为什么值,都会返回undefined,可以理解成这是一个专门用来生成undefined值的运算符
let undefined = 2;
let name = void 0;
通常情况下我们一般使用0,当然你也可以使用其他值
Boolean
有true和false两个值
任何其他类型值的都可以转化为bool值(Null和Undefin)
String:任何非空字符串为ture,空字符串为false;
Number:任何非零数字值(包括无穷大)为ture,0和NaN为false
Object:任何非null的对象为ture,null为false
Undefined:为false
Number
表示2-1074和21024之间的正浮点数和-2-1074和-21024之间的负浮点数
首先浮点数由于计算机的存储机制问题本身就无法保证精度
其次对于整数来讲,javascript中仅能安全的存储在-(253 − 1)到(253 − 1)范围的整数,超出这个范围将使用双精度浮点数的指数方式近似表示
Number.isSafeInteger(num):确定一个整数是否在安全存储范围内
Number.isInteger():确定传递的值类型是Number,且是整数
isFinite(num):测试一个数值是否在规定范围内
Javascript会自动将可以转换为整型的浮点数值转成为整型
var box = 12.0; //小数点后面是0,转成为整型12
在定义比较长的Number时,可以使用下划线进行分割用来更加容易阅读,在编译时会忽略下划线
let num = 12_3456_7890;
console.log(num); //1234567890
指定整数的进制(浮点数只能是十进制)
前导0表示8进制
var box = 070; //八进制,56
var box = 079;//无效的八进制,解析为十进制
前导0x或0X表示十六进制(不区分大小写)
var box = 0xA;//十六进制,10
var box = 0x1f;//十六进制,31
一些相关的常量
Number.MIN_SAFE_INTEGER:表示-(253 − 1)的值
Number.MAX_SAFE_INTEGER:表示(253 − 1)的值
Number.MAX_VALUE:表示21024的值
大于该值被转换为+Infinity
小于-Number.MAX_VALUE的值被转为为-Infinity
Number.MIN_VALUE:表示2-1074的值
小于该值的正数被转换为+0
大于-Number.MIN_VALUE的值被转换为-0
Number.POSITIVE_INFINITY:表示Infinity
Number.NEGATIVE_INFINITY:表示-Infinity
0同时表示 -0 和 +0 ( 0 是 +0 的别名)
+0 === -0 表达式返回的是 true
然而,当0为除数时:
console.log(42 / +0); // Infinity
console.log(42 / -0); // -Infinity
NaN是一个特殊种类的数值,当算术运算的结果不能用数值表达时,会返回NaN,它是JavaScript中唯一不等于自身的值
isNaN(num)用来判断num是不是NaN,在接收到一个值之后,会尝试将这个值转换为数值
Number.NaN表示NaN值
toString()方法可以把所有类型的数据转换成字符串,一般不需要传参,但在数值转成字符串的时候,可以传递进制参数
var box = 10;
console.log(box.toString()); //10,默认输出
console.log(box.toString(2)); //1010,二进制输出
console.log(box.toString(8)); //12,八进制输出
console.log(box.toString(10)); //10,十进制输出
console.log(box.toString(16)); //a,十六进制输出
parseFloat(val):将val转换为浮点数
Number和BigInt之外的数据类型会先转换为字符串类型,然后对字符串进行解析
识别正号(+)、负号(-)、数字(0-9)、第一个小数点(.)、科学记数法中的指数(e 或 E)
会将第一个不是以上字符之前的所有字符解析,之后的字符忽略
参数首位和末位的空白符会被忽略
如果第一个字符不能转换为数字,返回NaN
可以解析并返回 Infinity
解析BigInt为Numbers, 丢失精度,因为末位n字符被丢弃
parseInt(val,radix=0):将val转换为10进制整数
第2个参数指定要解析的val的进制,有效值2-36,不指定或为0会根据字符串内容推算
Number和BigInt之外的数据类型会先转换为字符串类型,然后对字符串进行解析
识别正号(+)、负号(-)、数字(0-9)、在指定进制中的英文字符、科学记数法中的指数(e 或 E)
会将第一个不是以上字符之前的所有字符解析,之后的字符忽略
参数首位和末位的空白符会被忽略
如果第一个字符不能转换为数字或radix在2-36范围之外,返回NaN
解析BigInt为Numbers, 丢失精度,因为末位n字符被丢弃
保留指定位小数,位与Number原型对象中的toFixed()方法
Number.prototype.toFixed(digits=0):将数字保留小数点后digits位(超过20可能会出错)并转化为字符串
BigInt
表示数字的原始值,它可以表示任意大小的整数
使用BigInt可以安全地存储和操作巨大的整数,甚至超过Number的安全整数限制(Number.MAX_SAFE_INTEGER)
BigInt是通过将 n 附加到整数末尾或调用 BigInt() 函数来创建的
let num1 = BigInt(Number.MIN_SAFE_INTEGER*2);
let num2 = 456541n; //最后有一个字母n
BigInt类型不能使用常规算术运算中的无符号右移运算符(>>>)
BigInt类型不会被隐式转换,如果在计算过程中必须进行隐式转换(如与Number类型进行运算)则抛出异常
String
表示文本数据并编码为UTF-16代码单位的16位无符号整数值序列
字符串中的每个元素在字符串中占据一个位置
第一个元素的索引为 0,下一个是索引 1,依此类推
字符串的长度是其中的UTF-16代码单元的数量,这可能与Unicode字符的实际数量不符
字符串可以由双引号(")、单引号(')或反引号(`)表示
1、反引号可以用来定义多行字符串
2、反引号中可以直接在字符串中间引用变量,使用${}包含变量,如`this is ${name}’s blog`
String类型包含了一些特殊的字符字面量,也叫 转义序列:
\n 换行 \t 制表 \b 空格
\r 回车 \f 进纸 \\ 斜杠
\' 单引号 \" 双引号
\xnn 十六进制,nn表示一个字符(0~F),例:\x41
\unnn 以十六进制代码nnn表示的一个Unicode字符(0~F),例:\u03a3
Symbol
是唯一并且不可变的原始值并且可以用来作为对象属性的键
在某些程序语言当中,Symbol也被称作“原子类型”(atom)
symbol的目的是去创建一个唯一属性键,保证不会与其它代码中的键产生冲突
Symbol类型不会被隐式转换,如果在计算过程中必须进行隐式转换则抛出异常
原始值类型互转:
使用类型名称直接运行即可转换一个值为指定的数据类型(Null和Undefined除外)
Boolean(val)
Number(val)
BigInt(val)
String(val)
Symbol(val)
类型转换
在Javascript中如果涉及到数据类型转换,原始值之间转换比较容易,如果一个对象要转换为原始值,那么
1、首先运行该对象的valueOf()方法,如果返回值为原始值那么就用该值
2、如果不是原始值那么使用toString()方法返回字符串类型