目录
数据类型
7种数据类型
- Undefined
- Null
- String
- Boolean
- Number
- Symbol:ES6新增
- Object:复杂数据类型
typeof操作符
该操作符可以确定任意变量的数据类型
function test(){};
console.log(typeof(test));//function
typeof是操作符,而不是函数,共有七种返回字符串
-
"undefined"表示值未定义;
-
"boolean"表示值为布尔值;
-
"string"表示值为字符串;
-
"number"表示值为数值;
-
"object"表示值为对象(而不是函数)或 null;
-
"function"表示值为函数;
这里认为null是对空对象的一个引用
Undefined类型
console.log(typeof name)//undefined
假如这行代码是整个代码中的一行,知道其输出undefined.那么name有两种可能
- name被let或者var声明了(值默认为undefined)
- name没有被声明
Null类型
Null类型只有一个值null,表示一个空对象指针,假如某个变量未来要赋值某个对象,那么应该用null赋初值,这样就可以使用typeof判断其是否被赋值过,这种做法主要是语义化,表示该变量未来也是对象的引用,当然也可以变成其他类型
let dog = null;
console.log(typeof dog)//object
if(dog != null){
//dog被赋值
}
null和undefined表面相等
console.log(null == undefined);//true
console.log(null === undefined);//false
console.log(!null);//true
console.log(!undefined);//true
Boolean类型
有两个字面值:true和false
Boolean()转型函数可以将任意类型的值转换为Boolean型
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 非空字符串 | ‘’(空字符串) |
Number | 非零数值(包含无穷值) | 0、NaN |
Object | 任意对象 | null |
Undefined | N/A(不存在,应为Undefined只有一个值) | undefined |
这里转换要清楚,if流控制语句,会自动将其他类型值转换为boolean类型
let dog = {
name:'Amy',
age:12,
}
if(dog){
console.log(dog.name)//Amy
}
Number类型(重要)
Numer类型采用IEEE 754标准表示整数、浮点数(java、c中的双精度值),IEEE 754常用单精度和双精度两种规范,而js只采用双精度规范
双精度64位,1位符号位,11位指数为,52位尾数位
表示不同进制
八进制: 0 或 0o 或 0O
十六进制: 0x 或 0X
二进制: 0b 或者 0B
浮点值
let floatNum = 0.1;//有效推荐
let floatNum = .1;//有效不推荐
存储浮点值使用的内存空间是存储整数的两倍,所以像1.0这种小数点后面是0的数,会自动变成整数存储
科学计数法
let bigNum = 3.1E9;//有效
经典问题0.1+0.2为什么不等于0.3
由于js采用IEEE754双精度规范所以
0.1 => 0.0001 1001 1001 1001…(无限循环)
0.2 => 0.0011 0011 0011 0011…(无限循环)
双精度小数最多支持52位,0.1用52位表示,0.2也用52位表示,相加精度缺失,进位
0.1 + 0.2
= 0.0001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 (1001...舍弃)
+ 0.0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 (0011...舍弃)
= 0.0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 (1100...舍弃)
= 0.0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1101 (入1)
= 0.30000000000000004
像0.25+0.125就不会存在精度丢失,二进制的无穷小数需要考虑精度丢失问题
值的范围
最小值 Number.MIN_VALUE (5e-324)
最大值 Number.MAX_VALUE(1.797 693 134 862 315 7e+308)
let result = Number.MAX_VALUE + Number.MAX_VALUE;
console.log(isFinite(result)); // false
isFinite确定数是不是无穷
NaN
不是数值(not a number)
console.log(0/0); // NaN
console.log(-0/+0); // NaN
console.log(5/0); // Infinity
console.log(5/-0); // -Infinity
NaN有以下几个属性
-
任何涉及NaN的数值计算,都会返回NaN
console.log(NaN*0 + 1);//NaN
-
NaN不等于包括NaN在内的任何值
console.log(NaN == NaN)//false
isNaN()接收参数,判断是否“不是数值”
console.log(isNaN(NaN)); // true
console.log(isNaN(10)); // false,10 是数值
console.log(isNaN("10")); // false,可以转换为数值 10
console.log(isNaN("blue")); // true,不可以转换为数值
console.log(isNaN(true)); // false,可以转换为数值 1
数值转换
Number()、parseInt()、parseFloat()
Number用于任何数据类型
let num1 = Number("Hello world!"); // NaN
let num2 = Number(""); // 0
let num3 = Number("000011"); // 11
let num4 = Number(true); // 1
parseInt()用于字符串类型:从第一个字符逐个往后转换,当遇到字符不是数值字符、+0、-0就会返回,也就是说遇到小数点,或者空字符,都要返回。
let num1 = parseInt("1234blue"); // 1234
let num2 = parseInt(""); // NaN
let num3 = parseInt("0xA"); // 10,解释为十六进制整数
let num4 = parseInt(22.5); // 22
let num5 = parseInt("70"); // 70,解释为十进制值
let num6 = parseInt("0xf"); // 15,解释为十六进制整数
parseFloat()用于字符串类型:类似于parseInt(),但是遇到小数点第一次有效,后面就无效了
let num1 = parseFloat("1234blue"); // 1234,按整数解析
let num2 = parseFloat("0xA"); // 0
let num3 = parseFloat("22.5"); // 22.5
let num4 = parseFloat("22.34.5"); // 22.34
let num5 = parseFloat("0908.5"); // 908.5
let num6 = parseFloat("3.125e7"); // 31250000
String类型
通过.length获取字符串长度
toString(),数组、对象、布尔、字符串都有此方法,而null,undefined没有
toString()可以传入一个参数,底数,表示以什么进制转换字符串
console.log(num.toString()); // "10"
console.log(num.toString(2)); // "1010"
console.log(num.toString(8)); // "12"
console.log(num.toString(10)); // "10"
console.log(num.toString(16)); // "a"
另外String()本质是调用参数的toString()方法
let value1 = 10;
let value2 = true;
let value3 = null;
let value4;
console.log(String(value1)); // "10"
console.log(String(value2)); // "true"
console.log(String(value3)); // "null"
console.log(String(value4)); // "undefined"
Symbol类型
表示独一无二的值
Object类型
toString()与valueOf的区别
两者并存的情况下,在数值运算中,优先调用了valueOf,字符串运算中优先调用toString()
let person = {
name:'amy',
age:12,
toString:function(){
return this.name;
},
valueOf:function(){
return this.age;
}
}
const sentence = 'her name is ' + person;
const ageNew = 12 + person;
console.log(sentence);
console.log(ageNew);
操作符
位操作符
进行位操作符时,先把数转为32位计算,结果再转为64位
8:正数存储 = 0000 0000 0000 0000 0000 0000 0001 0000
补码:反码加一
-8:负数存储= 1111 1111 1111 1111 1111 1111 1111 0000
- ~ 波浪符
- &和号
- | 管道符
- ^ 脱字符
- << 左移
- >>有符号右移动
- >>>无符号右移
布尔操作符
- &&
- ||
- !
乘性操作符
-
- /
- %
指数操作符
- **
加性操作符
关系操作符
- <
- >
- <=
- >=
相等操作符
- ==
- !=
- ===
- !==
条件操作符
- ? :
赋值操作符
- *=
- /=
- %=
- +=
- -=
- <<=
- >>=
- >>>=
逗号操作符
let num = (1,2,3,4,5,6);//num = 6;
let num = 1,num2=14,num3=17;