JS中常用的数据类型
- 基本数据类型
- 数字 number(常规数字和NaN)
常规数字和NaN - 字符串 string
所有用单引号、双引号、反引号、包起来的都是字符串 - 布尔boolean
true/false - 空对象指针null
- 未定义undefined
- 引用数据类型
- 对象数据类型object
- {} 普通对象
- [] 数组对象
- /1?(\d|([1-9]\d+))(.\d+)?$/ 正则对象
- Math数学函数对象
- 日期对象
- …
- 函数数据类型function
number数字类型
包含:常规数字、NaN
NaN
not a number:不是一个数,但他隶属于数字类型
- NaN和任何值(包括自己)都不相等:NaN != NaN,所以我们不能用相等的方式判断是否为有效数字。
isNaN
检查一个值是否为非有效数字,如果不是有效数字返回True,反之是有效数字返回False。
在使用isNaN进行检测的时候,首先会验证检测的值是否为数字类型,如果不是,先基于number()这个方法,把值转换为数字类型,然后再检测.
把其他类型值转换为数字类型
- Number([vall])
把字符串转换为数字,只要字符串中包含任意一个非有效数字字符,结果都是NaN,空字符串会变为数字0。
- 布尔类型转换为数字ture是1,false是0.
- 把引用数据类型转换为数字,是先把他基于toString方法转换为字符串,然后再转换为数字。
console.log(Number({name:'10'}));//=>NaN
console.log(Number({}));//=>NaN
console.log(Number([]));//=>0
console.log(Number([12]));//=>12
console.log(Number([12,13]));//=>NaN
- parseInt/parseFloat([val],[进制]);也是转换为数字的方法,对于字符串来说,他是从左到右依次查找有效数字字符,直到遇到非有效数字字符,停止查找(不管后面是否还有数字,都不在找了),把找到的当作做数字返回。
parseFloat(true)//=>NaN
Number(true)//=>1
String字符串数据类型
所有用单引号、双引号、反引号(撇 ES6模板字符串)包起来的都是字符串
把其他类型值转换为字符串
- [val].toString()
- null和underfined是禁止直接toString的
(null).toString() //=>报错
但是和underfined一样转换为字符串的结果就是’null’/underfined - 普通对象.toString()的结果是"[object Object]",因为Object.prototype.toString方法不是转换为字符串的,而是用来检测数据类型的。
- 字符串拼接
- 四则运算法则中,除加法之外,其余都是数学计算,只有加法可能存在字符串拼接(一旦遇到字符串,则不是数学运算,而是字符串拼接)
console.log('10'+10)//=>'1010'
console.log('10'- 10)//=>0
console.log('10px'+10)//=>NaN
let a = 10 + null + true + [] + underfined + '乐乐' + null + [] + 10 + false;
/*
* 10 + null -> 10 + 0 -> 10
* 10 + true -> 10 + 1 -> 11
* 11 + [] -> 11 + '' -> '11' 空数组变为数字,先要经历变为空字符串,遇到字符串,直接变为字符串拼接
* '11' + undefined -> '11undefined'
* ...
* '11undefined乐乐null10false'
*/
boolean布尔数据类型
只有两个值 true/false
把其它类型值转换为布尔类型
只有0、NaN、’’、null、undefined五个值转换为False,其余都转换为True(而且没有任何特殊情况)。
- Boolean([val])
console.log(Boolean('')) //=>false
- !/!!
- !取反(先转换为布尔,然后取反)
- !取反再取反,相当于转换为布尔 == Boolean
- 条件判断
null/undefined
null和undefined都代表的是没有
- null:意料之中(一般都是开始不知道值,我们手动先设置为null,后期再给予赋值操作)
- 0是有空间的(他在栈内存中有自己的存储内存),null是不占空间。一般最好用null作为初始的空值。
- undefined:意料之外(不是我能决定的)
Object对象数据类型-普通对象
{[key]:[value],…}任何一个对象都是由零到多组键值对(属性名:属性值)组成的(并且属性名不能重复)。
let person = {
name = '罗云熙',
age = 30,
height = '185cm',
weight = '50kg'
};
- 设置属性名属性值
- 属性名不能重复,如果属性名已经存在,不属于新增属于修改属性值。
person.GF = '圆圆';
console.log(person['GF'])
- 获取属性名对应的属性值
- 对象.属性名
- 对象[属性名] 属性名是数字或者字符串格式的
- 如果当前属性名不存在,默认的属性值是undefined
- 如果属性名是数字,则不能使用"对象.属性名"的方式获取属性值
console.log(person.name);
console.log(person['age']);
console.log(person,sex);=>undefined
- 删除属性
- 真删除:把属性彻底干掉。
delete person['name'];
- 假删除:属性还在,值为空。
person.weight = null;
数组是特殊的对象数据类型
- 特殊点
- 数组中括号中设置的是属性值,它的属性名是默认生成的数字,从0开始递增,而且这个数字代表每一项的位置,我们将其称为“索引”。从零开始,俩u下递增,代表每一项位置的数字属性名。
- 天生默认一个属性名length,存储数组的长度。
let ary = [12,'哈哈',true,13];
console.log(ary);
//第一项索引0,最后一项索引ary.length-1
console.log(ary[0]);
console.log(ary[length-1]);
- 向数组末尾追加内容
ary[ary.length] = 100;
堆栈底层机制
浏览器想要执行JS代码:
- 从电脑内存中分配出一块内存,用来执行代码(栈内存 => Stack)。
- 分配一个主线程用来自上而下执行JS代码。