基本数据类型
一,number(数字)
1,数字分类:
整数:
let numInt=123
浮点数
let numFloat1=12.3
let numFloat2=12. // 小数点后没有数字,识别为12
let numFloat3=.123 //小数点前没有数字,识别为0.123,不建议这种写法
let numFloat4=123.0 //识别为123
特殊数字
Number.MAX_VALUE // 1.7976931348623157e+308->JavaScript中的最大值
Number.MIN_VALUE //5e-324->JavaScript中的最小值
Number.MAX_SAFE_INTEGER //9007199254740991->最大安全整数
Number.MIN_SAFE_INTEGER // -9007199254740991->最小安全整数
Number.POSITIVE_INFINITY //Infinity->正无穷
Number.NEGATIVE_INFINITY //-Infinity->负无穷
Number.EPSILON //2.220446049250313e-16->一个极小值,用于检测计算结果是否在误差范围内
Number.NaN //NaN->表示非数字
Infinity // 无穷大
-Infinity // 负无穷
NaN
console.log(typeof NaN) // number
//NaN与任何值都不相等,包括NaN本身
console.log(NaN===NaN) // false
//任意数和NaN进行计算都是NaN
console.log(NaN/1) //NaN
2.数据计算
浮点数字计算会出现精度差异,最高精度是17位,数字计算是先转换成二进制计算,再转换成十进制.
- 为什么0.1+0.3不等于0.3?
let num1=0.1,num2=0.2
//0.1,0.2转二进制会出现无限循环位数,超出位数会被舍弃
console.log(num1.toString(2)) // 0.0001100110011001100110011001100110011001100110011001101
console.log(num2.toString(2)) //0.001100110011001100110011001100110011001100110011001101
//0.1+0.2:0.0100110011001100110011001100110011001100110011001101->转换为十进制为0.30000000000000004
console.log(num1+num2) //0.30000000000000004
- 解决精度差问题
toFixed
console.log((0.1+0.2).toFixed(1)) // 0.3
// toFixed处理返回的数据类型是string类型,如果需要数字类型需要转换
console.log(typeof (0.1+0.2).toFixed(1)) //string
console.log(typeof Number((0.1+0.2).toFixed(1))) // number
Math.round
在处理已知位数的数据,又不想在小数点后多加0的场景,可以使用Math.round
console.log(Math.round((0.1+0.2)*10/10)//0.3
3.数据进制
十进制
let num1=123//123
二进制
二进制数字前面加上前缀’0b’
let num1=0b010//十进制的2
八进制
八进制的值第一位是0,后面每一位数的范围在0-7,如果某一位数超出范围,首位的0会被忽略,后面的数值会按照十进制解析.
let num1=060 //十进制的48
let num2=069 //无效的八进制数值->解析为十进制的69
let num3=08 // 无效的八进制数->解析为8
用前缀0表示的八进制字面量在严格模式下是无效的,会报错,需要用前缀0o表示.
十六进制
十六进制的值前两位是0x,后面每一位十六进制数字的范围在0-9及A-F,字母A-Fkeyi大写也可以小写.
let num1=0x60 // 十进制的96(16*6)
let num2=0x69 //解析为十进制105(16*6+9)
let num3=0xA //解析为十进制10
进制间转换
let a=123
// 十进制转其他进制
console.log(a.toString(2)) // 1111011
console.log(a.toString(8)) // 173
console.log(a.toString(16)) //7b
// 其他进制转十进制
console.log(parseInt(1111011,2)) // 123
console.log(parseInt(173,8)) // 123
console.log(parseInt('7b',16)) // 123
不同进制间计算,计算结果都会先转成十进制
//八进制与八进制数值相加
console.log(010+020) // 24
// 十六进制与十六进制数值相加
console.log(0x10+0x20) // 48
// 八进制与十六进制数值相加
console.log(0x10+020) // 32
//十六进制与二进制数值相加
console.log(0x10+0b101) // 21
// 十六进制与十进制数值相加
console.log(0x10+12) // 28
二,String(字符串)
1.字符串定义
字符串可以是插入到引号中的任何字符。双引号( " )、单引号( ’ )或反引号(`)标识
let name1 = "abc";
let name2 = 'abc';
let name3 = `abc`;
2.字符串常用方法
方法 | 描述 |
---|---|
charAt() | 返回指定索引位置的字符 |
charCodeAt() | 返回指定索引位置字符的 Unicode 值 |
concat() | 连接两个或多个字符串,返回连接后的字符串 |
fromCharCode() | 将 Unicode 转换为字符串 |
indexOf() | 返回字符串中检索指定字符第一次出现的位置 |
lastIndexOf() | 返回字符串中检索指定字符最后一次出现的位置 |
localeCompare() | 用本地特定的顺序来比较两个字符串 |
match() | 找到一个或多个正则表达式的匹配 |
replace() | 替换与正则表达式匹配的子串 |
search() | 检索与正则表达式相匹配的值 |
slice() | 提取字符串的片断,并在新的字符串中返回被提取的部分 |
split() | 把字符串分割为子字符串数组 |
substr() | 从起始索引号提取字符串中指定数目的字符 |
substring() | 提取字符串中两个指定的索引号之间的字符 |
toLocaleLowerCase() | 根据主机的语言环境把字符串转换为小写,只有几种语言(如土耳其语)具有地方特有的大小写映射 |
toLocaleUpperCase() | 根据主机的语言环境把字符串转换为大写,只有几种语言(如土耳其语)具有地方特有的大小写映射 |
toLowerCase() | 把字符串转换为小写 |
toString() | 返回字符串对象值 |
toUpperCase() | 把字符串转换为大写 |
trim() | 移除字符串首尾空白 |
valueOf() | 返回某个字符串对象的原始值 |
三,Blooean(布尔)
Blooean值:有2个值,true/false
Blooean值转换
数据类型 | 转换为 true 的值 | 转换为 false 的值 |
---|---|---|
Boolean | true | false |
Number | 非零数值(包括无穷值) | 0、NaN |
String | 非空字符串 | ‘’(空字符串) |
Undefined | 无 | undefined |
Object | 任意对象 | null |
四,undefind(未定义):只有undefind值
Undefined 类型只有一个值,即undefined。在声明变量但是没有初始化时,这个变量的值就是undefined。
正常情况下,调用未声明的变量会报错,但是对未声明的变量使用typeof操作符,同样会返回"undefined"
var name;
// age 未声明
console.log(typeof name); // "undefined"
console.log(typeof age); // "undefined"
五,null(空):只有null值
null使用typeof返回值是object
console.log(typeof null); // "object"
六,Symbol:ES6新加的数据类型,表示独一无二的值
ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。
//没有参数的情况
let s1=Symbol();
let s2-Symbol();
s1===s2 // false
let s3=Symbol('abc')
let s4=Symbol('abc')
s3===s4 // false
Symbol值不能与其他类型的值进行运算,会报错
let s=Symbol('abc')
s+'def' // Uncaught TypeError: Cannot convert a Symbol value to a string
`${s}def` // Uncaught TypeError: Cannot convert a Symbol value to a string
Symbol作为属性名
let mySymbol = Symbol();
// 第一种写法
let a = {};
a[mySymbol] = 'Hello!';
// 第二种写法
let a = {
[mySymbol]: 'Hello!'
};
// 第三种写法
let a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });
// 以上写法都得到同样结果
a[mySymbol] // "Hello!"
3.属性遍历
Symbol 值作为属性名,遍历对象的时候,该属性不会出现在for…in、for…of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。
4.Symbol.for(),Symbol.keyFor()
有时,我们希望重新使用同一个 Symbol 值,Symbol.for()方法可以做到这一点。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建一个以该字符串为名称的 Symbol 值,并将其注册到全局。
let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo');
s1 === s2 // true
let s3 = Symbol.for("foo");
Symbol.keyFor(s3) // "foo"
let s4 = Symbol("foo");
Symbol.keyFor(s4) // undefined
七,BigInt(任意精度整数):可以操作存储大整数据
1,创建BigInt可以在数值后面加n
typeof(123n) //'bigint'
在 JavaScript 中,所有数字都以 64 位浮点格式(IEEE 754 标准)存储。
使用此标准,大整数无法精确表示,并且将被舍入。
因此,JavaScript 只能安全地表示整数:
最多 9007199254740991 +(253-1)
低至 -9007199254740991 -(253-1).
超出此范围的整数值会丢失精度。
引用类型
八,object(对象):任意对象
1,创建object
//通过new关键字创建
let obj new Object(); //创建空对象
obj.name='lily'//往对象中添加属性
let obj1={
name:'lily',
age:20
}