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代码。