number数据类型
- 正数、零、负数、小数
- NaN:不是一个有效数字,但是属于number类型
- Infinity:无穷大的值,也是number类型
注意:NaN和任何值都不相等(包括自己本身)
console.log(NaN == NaN) // =>false
那么,如何来验证一个数是否是有效数字呢?
isNaN用来检验一个值是否为有效数字
console.log(isNaN(1)) // =>false
console.log(isNaN(NaN)) // =>true
console.log(isNaN(Infinity)) // =>false
//检测的值如果是非数据类型的值,则需要先把其转换成数字类型,再进行检测
console.log(isNaN("1")) // =>false
把其他数据类型转换成数字类型
- Number([value]) isNaN检测使用的就是这种方式转换为数字类型
- parseInt([value])
- parseFloat([value])
Number是JS内置的转换方法,可以将其他数据类型“强制”转换为数字类型
- 字符串转换为数字:字符串中出现非有效数字字符,结果为NaN
- 布尔转换为数字: true转换为1 false转换为0
- 空转换为数字:null转化为0 undefined转换为NaN
- 不能把Symbol类型转换为数字,否则会报错
- 对象转换为数字
普通对象
- 先把obj转换为字符串 "[object Object]"
- 把字符串转换为数字 Number("[object Object]")
let obj = {x:10}
console.log(Number(obj)) // => NaN
数组对象
- 先把Arr转换为字符串 "10,20"
- 把"10,20"转换为数字:NaN
arr = ["10", "20"]
console.log(Number(arr)) // => NaN
console.log(Number([])) // => [] -> '' Number('')->0
console.log(Number(['AA'])) // => ['AA']->'AA' Number('AA')->NaN
其余对象格式基本上都会变成数字NaN
- 函数转换为数字:结果都是NaN
parseInt/parseFloat
也是把数据类型转换成number类型,处理原理和Number不一样,他们是把字符串转换成数字类型(如果处理的值不是字符串,则需要转换为字符串然后再去转换成Number类型)
parseInt:从字符串最左边开始查找,把找到的有效数字字符转换成数字,一直遇到一个非有效数字字符串为止,则结束查找。
console.log(Number('12px'));// NaN
console.log(parseInt('12px'));// 12
console.log(parseInt('12.5px'));// 12
console.log(parseFloat('12.5px'));// 12.5
console.log(Number(true));// 1
console.log(parseInt(true));// 先把true转换成字符串'true',相当于parseInt('true') NaN
toFixed:保留小数点后面N位(最后的结果是一个字符串)
let n = 3.1415926;
console.log(n.toFixed(2));// "3.14"
ES6提供了一个新的基本数据类型 BigInt:管理超过安全数值的数字
String数据类型
在JS中用 单引号/双引号/反引号 包起来的都是字符串
把其他类型转换成字符串类型
+ String([value])
+ [value].toString()
普通对象转换为字符串都是"[oject Object]",数组对象转换为字符串是"第一项,第二项 "(逗号分隔数组中的每一项)
除了加法以外,其余的情况都是数学运算,加号在JS中既有数学运算,也有字符串拼接的意思(只要加号两边的任意一边出现字符串,则变为字符串拼接)
console.log(1 + "1");// "11"
console.log(1 + {});// "1[object Object]" 在把{}转换为数字的过程中,先把它转成字符串"[object Object]",此时便出现了字符串,则不再是数学运算,而是字符串拼接
console.log(1 + []);// "1"
console.log([10] + true);// "10true" 在转换[10]到数字的过程中,先把其转换为字符串"10",此时操作变成字符串拼接
隐式转化都是调用objct对象的原型方法valueOf和toString
boolean数据类型
如何把其他数据类型转换为布尔类型
Boolean([value])
![value] 把指定值转换为布尔类型后取反
!![value] 取反再取反,相当于没取反,只是把它转换为布尔值类型
规则:只有“0/NaN/null/undefined/空字符串” 最后是false,其余都是true
console.log(!!-1);// true
console.log(!!0);// false
console.log(!!undefined);// false
console.log(!!Number('12px'));// NaN -> false
console.log(!![]);// true
console.log(!!'');// false
console.log(!!{});// true
object对象数据类型
所有对象都具备以下特点:
1.用键值对{key:value 俗称属性名和属性值} 来描述一个对象的特征(每一个对象都是综合体,存在零到多组键值对)
2.{key:value , ...} 每一组键值对是 key:value 的格式,多组键值对用逗号分隔
3.key不能是引用数据类型,value可以是任意数据类型
对象的增删改查
1.新增或者修改属性名和属性值
对象的属性名(键)是不允许重复的,之前没有这个属性则为新增,之前有则为修改
操作对象的两种方式:
1) 对象.属性名 = 属性值
2) 对象[属性名] = 属性值
2.获取对象中的属性名和属性值
1)获取指定属性名的属性值
2)如果指定属性不存在,获取到的属性值是undefined(不会报错)
3)获取当前对象中的所有属性名:返回结果是包含所有属性名的数组
console.log(Object.keys(obj));
3.删除对象中的指定属性
1)假删除:当前属性还存在,只不过属性值 赋值为空
2)真删除:彻底把属性从对象中移除掉 delete.obj.name
对象的属性名不能是引用数据类型值
对象[属性名]的操作方式,需要保证属性名是一个值(字符串/数字/ 布尔等都可以),如果不是值而是一个变量,它会把存储的值作为 对象属性名进行操作
对象.属性名 的操作方式,属性名就是点后面的
let n = 100;
let obj = {};
obj.n = 200; // {n:200} n是属性名(数据格式是字符串)
obj['n'] = 200; // {n:200} n是属性名(数据格式是字符串)
obj[n] = 200; // {100:200} n本身是一个变量(n和'n'的区 别:前者是一个变量,后者是一个字符串的值),它代表的是所存储 的值100(是一个数字格式)
obj[m] = 200; //m这个变量没有被定义
console.log(obj);
let n = {
x:100
};
let m= [100, 200];
let obj = {};
obj[n] = "前端";//对象不能作为属性名,需要把其转换为字符串{"[object Object]":"前端"}
obj[m] = "学习";//对象不能作为属性名,需要把其转换为字符串{"100,200":"学习"}
console.log(obj);
如果非要让属性名是个对象,只能基于ES6中的新数据结构Map处理