javascript数据类型详细解析

基本数据类型
  • 字符串 string
  • 数字 number
  • 布尔 boolean
  • null
  • undefined
引用数据类型
  • 对象 object、Array、RegExp等
  • 函数 function

基本数据类型和引用数据类型的区别
  • 基本数据类型把值直接给变量,接下来操作中直接拿值操作,可能两个变量存同样的值,但是互不影响 ----------->栈内存

  • 引用数据类型

1.定义一个变量
2.开辟一个新的空间,然后把属性名和属性值保存在这个空间中,并且有一个内存地址。
3.把空间地址给这个变量,变量没有存储这个数值,而是存储的这个空间的地址
4.把这个地址告诉另外一个变量,这个变量也用这个地址,两个变量都操作这个地址
5.其中一个变量改变这个空间的内容,另一个也会跟着改变

数据类型的检测

基本数据类型

以下的数据类型dataType首字母大写
    * 1.typeof data 用来检测数据类型的运算符
          * 局限性:type null = ‘object’;
          * 只会返回 'number' 'string' 'boolean' 'undefined' 'function' 'object'
          * 不能具体细分对象中的类
    * 2.data instanceof dataType 检测一个实例是否是属于某一个类
          * 不能检测字面量创建的基本数据类型的值
          * instanceof特性
          *   只要当前的实例在原型链上 我们用其检验的结果都是true
          *   在类的原型继承中我们检验的结果未必准确
    * 3.data.constructor==dataType  基于构造函数
          * 作用和instanceof类似
          * [].constructor Array
          * constructor可以处理基本数据类型
          * constructor检测Object和instance不一样,一般情况下是检测不了的,原型链上有,不会再向上级查找
          * 局限性
          *   把原型进行重写很可能把之前的constructor覆盖了,这样检测的结果是不准确的
          *   对于特殊的数据类型 null和undefined,他们的所属类是 null和Undefined,但是浏览器把这两个类保护起来了,不允许我们访问使用
    * 4.Object.prototype.toString.call(); 返回 [object datatype]
          * 最准确的方式
          * 首先获取Object原型上toString上的方法,方法执行并且改变方法中this关键字指向
1. number
    * number{正数,负数,0,小数  NaN :不是一个有效数字}
    * NaN==NaN   false
    * isNaN:检测一个值是不是一个有效数字  如果检测的不是Number类型的 会默认把他转化为number类型的再判断
    * Number() 强制将其他数据类型转化为Number类型的,如果是字符串 只有字符串都是数字才可以转
    * 非强制数据类型转换
    * parseInt() 从左到右 一个一个字符查找 中途遇非有效数字停止查找   返回整数  
    * 还可以解析进制的数字
    * parseFloat() 从左到右 一个一个查找 但是能够                   返回浮点数
    * 保留几位小数     数字.toFixd(n)    保留n位有效数字 四舍五入
    console.log(isNaN(12))           //---FALSE
    console.log(isNaN('12'))         //---FALSE  转化为number类型的再去判断
    console.log(Number([0]))         //0
    console.log(Number("1"))         //1
    console.log(parseInt('12px'))    //12
    console.log(parseInt('1px2'))    //1
    parseInt("10");                  //返回 10
    parseInt("19",10);               //返回 19 (10+9)
    parseInt("11",2);                //返回 3 (2+1)
    parseInt("17",8);                //返回 15 (8+7)
    parseInt("1f",16);               //返回 31 (16+15)
    12.555.toFixed(2)                //返回12.55

API

1. Number()
2. isNaN()          先隐式转化 调用底层的valueof()  再判断
3. parseInt()       先隐式转化 调用底层的valueof()  再判断
4. parseFloat()     先隐式转化 调用底层的valueof()  再判断

2. string

API

     * 1.通过索引查找对应的字符或编码
     *   chatAt(下标)  :通过下标找对应的字符
     *   chatCodeAt(下标) 通过下标找ascii值
     * 2.通过字符找对应下标(只能找一个)
     *   indexOf('str') 通过字符串找对应下标 (从前到后)
     *   lastIndexOf('str')     从后往前
     * 3.字符串截取
     *   str.substr(n,m) 从n开始截取m个
     *   str.substring(n,m)   从第n个索引开始截取到第m个
     * 4.字符串拆分成数组
     *   str.split(“ ”)按指定的符号拆分成数组
     * 5.字符串替换
     *   str.replace('被替换的','换成的');
     * 6.大小写转换
     *   str.toUpperCase()   //转换成大写
     *   str.toLowerCase()   //转换成小写
     * 7.match 匹配符合正则的字符串
3. boolean

值:true false

    * ! 一个感叹号取反,首先将值转化为布尔类型后取反

    * 数据类型转换规则
    * 1.如果只有一个值,判断这个值真假  只有0 NaN null undefined “” 这5个是假的,其余都是真的
    * !! 两个感叹号相当于 Boolean()  将其他类型转换为布尔类型

    * 2.判断两个值是否相等
    * <1> ==的 比较会进行默认的数据类型转化
    * <2> 对象==对象 永远的不相等 因为比较的是引用地址
    * <3> 对象==字符串 对象转化为字符串再进行比较 []==""  true  {}转化为字符串调用toString 为"[object Object]"
    * <4> 对象==布尔类型 对象转字符串 (toString) 再转化为数字(Number) boolean也转化为数字类型   再进行比较 []==false  true
    * <5> 数字==布尔  布尔转数字
    * <6> 数字==字符串  字符串转数字
    * <7> 字符串==布尔  布尔 转数字  字符串转数字
    * null==undefined   结果为true
    * null或undefined和任何其他数据类型比较都不相等
    * ===比较 数据类型不一样的不相等
    *
4. null和undefined
  1. undefined:表示未定义
  2. null:表示空,没有
  • 出现undefined的情况:
1. 变量定义没赋值
2. 函数没有返回值
3. 对象没有当前属性
  • undefined的二义性
undefined在function作用域下是可以重写的,但是在window作用域(全局变量时)下,无法被重写。
(function(){
  undefined='123';
  console.log(undefined)  -->'123'
})

  • null的作用
1. 习惯上初始化会用null
2. 清理对象属性可以用null
3. type null  是   'object'  这是硬性规定

引用数据类型

1.对象
    * 有属性名和属性值组成(多组键值对组成)多个key 和 value
    * 属性名:属性值    描述对象特征
    * 字面量方式创建
    * var obj={name:'haha'}
    * 实例方式创建
    * var obj= new Object()
    * 1.给对象增加属性名和属性值 obj.age=10
    * 2.修改原有属性名和属性值 obj.name='woca';
    * 规定一个对象的属性名不能重复
    * 3.获取属性名和属性值 console.log(obj.name)
    * 如果属性名不存在,返回undefined
    * 4.删除属性名和属性值  obj.name=null   假删除
    *                     delete obj.name 真删除
2.数组
    * length-- 相当于删除数组的最后一项
    * 数组常用的方法
    *   方法          作用                      参数                        返回值               原数组
    *  push()       向数组的末尾添加一项        需要添加的项用,隔开        返回新数组的长度       原数组改变
    *  pop()        删除数组的最后一项                                   返回删除项             原数组改变
    *  unshift      向数组开头添加一项          添加的项                 返回数组长度            原数组改变
    *  shift        删除数组的第一项                                    返回删除项             原数组改变
    *  splice(n,m,x) 从索引你开始删除m个         n是索引m是个数x是添加的值   返回删除项            原数组改变
           * 一个参数的时候是从索引n开始删除到结尾
           * 两个参数时是从索引n开始删除m个
           * 三个参数时从索引n开始删除m个 并且把第三个参数当做数组放到删除的位置

    * slice(n,m)    从索引n开始找到索引M 不包括M   索引的开头和结尾         查询的数组项          原数组不变
    * concat()      拼接数组                     要被拼接的数组           拼接后的数组          原数组不变
    * join(' ')     把每一项通过指定的字符串拼接   分割符                  拼接好的字符串         原数组不改变
    * reverse()     倒叙数组                      无                      倒叙后的数组           原数组改变
    * sort()        按指定的顺序排列数组           一个函数                排序好的数组             改变
    * indexOf()     查找                         查找的项                找到的数字或-1           不变
    * lastIndexOf() 从后查找                     查找的项                找到的数字或-1           不变
    * forEach(item,index)遍历                    一个函数 无返回值                               改变
    * map()         遍历                         一个函数 函数有返回值                            不变
    * Array.from()  把类数组转化为数组            需要转化的类数组         返回新的数组
    * find()        遍历查找
    * reduce()      累加器                       一个函数参数为数组上一项和当前项
    * filter()      过滤器                       一个函数               过滤得到的新数组           不变
    * includes()    判断是否包含某一项            要查找的东西           布尔值                    不变
    var arr=[10,11,12,13,14];
    var new1=arr.find(function(item,index,arr){
        console.log(arguments)
    })
    var a=arr.includes(14);
    console.log(a)
    var newArr=arr.filter(function(v) {
        return !(v%2);  ///偶数
    });
    console.log(newArr);
3.函数
  • 定义一个函数的步骤
    * 1.开辟一个新的空间 xxff11
    * 2.把函数体中的js代码当做字符串存在空间里(一个函数如果只是定义了没有执行的话 这个函数无任何意义)
    * 3.把这个地址给函数名
  • 函数执行步骤
    * 1.首先会形成一个自己的私有地盘
    * 2.把定义的时候 存在空间里的js代码字符串当做js代码执行

*function的一个作用 实现代码的封装

    * 形参:
    *   实现一个功能发现部分原材料没有,在制定计划时没有办法获取,我们把需要的原材料定义在我们的形参上,
    *   在执行计划的时候把原材料提供了就好了
    * 多态:
    *   通过参数的不同实现不同的功能 执行时没有传递值 默认值是undefined 用typeof undefined检查是否传进来值;
    *   没有给形参赋值的时候,他的值就是undefined
    * arguments
    *   是函数的内置的接收参数的机制 arguments一直存在
    *   是一个类数组(有数字作为索引,索引从0开始代表第几个传递进来的参数)
    *   arguments获取其中的一个只能用arguments[i]l;
    *   arguments.callee 代表函数本身
  • 闭包:
    *   函数执行的时候,会产生一个私有的作用域 保护里边的变量不受外界的干扰,外边想用什么就return什么
    *   函数执行完的整体就是这个值
  • return
    *   1.如果没有写或 return; 默认返回的值就是undefined
    *   2.在函数体中 return 后面的代码不再执行
    *   3.return可以控制代码执行到指定位置结束
4.Math对象
    * Math.abs()       绝对值
    * Math.ceil()      向上取整
    * Math.floor()     向下取整
    * Math.round()     四舍五入
    * Math.min()       取最小值
    * Math.max()       取最大值
    * Math.random()    获取从0到1之间的一个随机数
    * Math.round(Math.random()*(m-n)+n)   获取n到m的一个随机整数
    * num.toFixed(n)   保留n位小数
5.date对象
    * new Date()                计算机时间 中国标准时间
    * date.getFullYear()        获取年
    * date.getMonth()           获取月份  月份需要 +1
    * date.getDate()            获取日
    * date.getDay()             获取星期 1234560
    * date.getHours()           获取小时
    * date.getMinutes()         获取分钟
    * date.getSeconds()         获取秒
    * date.getMilliseconds()    获取毫秒

你可能感兴趣的:(javascript数据类型详细解析)