数据类型概括

划分数据类型的原因

  • 不同的数据类型具有不同的运算方式与存储方式
  • 计算机不能够识别不同类型的数据;
  • 因此需要人为加以划分;

数据类型分类

数据类型分为简单数据类型与引用数据类型(复杂数据类型)两种。

1. 简单数据类型

[1]特点:只能存储一个值;

[2]分类-6个简单数据类型

(1)number数据类型

number数据类型概括

(2)string数据类型

string数据类型概括

常用的字符串逻辑
(3)Boolean数据类型
  • 布尔类型的值常用于表示现实中的"矛盾态",相互对应的两种状态
  • 数据:
    • true
    • false
  • 注意点:平时没有意义,只有在和条件控制语句结合使用时才有意义;
条件控制语句
if

if条件判断语句

switch

switch条件判断语句

(4)undefeind数据类型
  • 数据:undefined
  • 什么时候数据为undefined
    • [1]在定义了变量但是没有赋值时,变量的值为undefiend
    • [2]在访问对象中没有定义的属性时,属性值为undefiend
    • [3]在访问数组的超出下标的值的时候,值为undefined
(5)null数据类型
  • 数据:null
  • 什么时候的值为null
    • 在使用prompt获取用户输入的数据,用户点击取消的时候,获取的数据为null
(6)es6新增的简单数据类型symbol

Symbol数据类型详解

[1]作用:用于防止属性名冲突而产生的数据类型;

[2]特点

  • (1)Symbol数据类型不能使用 new关键字;

    • 原因:Symbol数据类型没有基本包装对象;

    • Symbol虽然没有基本包装对象,但是Symbol可以作为修改后的this指向(很奇怪哦)

       function editthis () {
              console.log(this)
            }
      
      editthis.call(Symbol('xx')) // {Symbol(xx)}
      
  • (2)使用Symbol方法生成数据,即使是参数相同 生成的数据也不相等

    • eg:

    • let sy = Symbol('xx')
          let sy1 = Symbol('xx')
      console.log(sy == sy1) //false
      
  • (3)数据类型为symbol

    • console.log(typeof sy) // symbol数据类型
      
  • (4)其主要作用是为了 避免对象属性名相同 而创建的

    • eg1:若是在对象中使用相同的属性名,后面的属性会把前面属性的值覆盖

    • let person = {
             111: '111',
             111: '222'
           }
           console.log(person) //{111:‘222’}
      
    • eg2:若是使用symbol数据类型作为属性就不用担心数据被覆盖的问题

    • let sy2 = Symbol('xx')
           let person2 = {
             [sy2]: '111',
             [Symbol('xx')]: '222'
           }
           console.log(person2) //{Symbol(xx):'111',Symbol(xx):'222'}
      
  • (5)注意点:

    • 在使用symbol数据类型的值作为对象属性的时候不要使用点语法(原因:symbol没有基本包装类型)
    • eg:
  • let sy2 = Symbol('xx')
          let person2 = {
            [sy2]: '111',
            [Symbol('xx')]: '222'
          }
          console.log(person2) //{Symbol(xx):'111',Symbol(xx):'222'}
    
          // 在使用Symbol数据类型时不能够使用. 符号要用 []
          console.log(person2[sy2]) //111
          console.log(person2[Symbol('xx')]) // 这样获取---由于symbol生成的数据各不相同,所以值为undefiend
    
简单数据类型的相互转化

1.定义:数据类型的转化是将一种数据类型转化为另一种数据类型;

2.为什么要进行数据类型的转化:因为在js中 只有相同数据类型才可以进行直接计算;

[1]数据类型的隐式转化

1.定义:JS在进行计算时,数据类型不同自行转换;

[1]number类型的隐式转化触发点
  • (除了+ +=(至少有一个运算数为字符串类型)外的算术运算符)都会触发number类型的隐式转换;
  • 易错点1
    • null==undefined的结果
    • 在个人看来,==触发隐式转化(null转化为0,undefiend转化为NaN,比较不应该是false)
    • 但是实际并不是这样,而是(在js规范中提到:在比较相等性之前,不能将null与undeined转化为其他任何值,并规定undefined与null是相等的,null与undefiend都代表无效的值)
  • 易错点2
    • true==10的结果
    • true==1的结果
    • 实际上在进行比较的时候,会触发unmber隐式转化,先将true转化为数字1—所以true等于10的结果为false而true==1的结果为true
[2]string类型的触发点
  • 当在进行+ 、+=进行运算–当其中一个值(只要有string类型就会触发)为string类型,会触发隐式转换

  • 举例说明2:结果为NaN —因为即使是+运算,没有string类型的参数也不会触发string的隐式转化

    • function add (n1, n2) {
         console.log(n1 + n2)  // NaN
      }
      add(1) 
      
    • 结果为NaN

      • 1和undefined在遇到“+”运算符时会触发unmder数据类型隐士转化(没有字符串)
      • undefined转化为NaN
      • NaN与任何值计算结果都为NaN
  • 举例说明2 :计算 从左向右 进性计算 ;

    • let res=100+5+'10'
      console.log(res); //10510
      
    • [1]100+5 (没有字符串不会触发隐式转化)值为105;

    • [2]105+‘10’ (‘10’为字符串会触发隐士转化) ‘105’+‘10’=10510—字符串拼接

[3]boolean类型的触发点
  • 当一个数据作为条件表达式时,会触发boolean隐式转换

    • 例题1

      • let i = 0
        let j = 0
        i++ ? i++ : j = i
        console.log(i)
        console.log(j)
        
      • (1)i++ —先进行运算,再自加(不是进性完整个式子运算,而是当前这步)

      • (2)i=0 作为条件触发boolean的隐士转化为false; i=1

      • (3)执行j=i

      • (4)打印 1,1

  • 例题2

    • console.log(!10)
      
    • 10转化为boolean为true,取反为false

[2]强制数据类型转化

1.使用场景:当隐士转换不符合我们的需求时使用强制转换—一般是+ +=时;

[1]number类型的强制转换
  • 语法:

    Number(数据)

    • 若是不传值默认为0
    • 易错点
      • undefiend强制转化为number类型的结果为NaN
      • 注:在number类型进行强制转化时,只有字符串undefined会转化为NaN
  • 转化结果: 能合理转换就进行转换,转换不了就转换为NaN(NaN设计的目标就是用于接收这种无法转换的情况)

  • 举例说明

    • console.log(Number()) // 0
      console.log(Number('0')) // 0
      console.log(Number(true)) //1
      console.log(Number(false)) //0
      console.log(Number(undefined)) //NaN
      console.log(Number(null)) //0
      console.log(Number('a')) // NaN
      
[2]string类型的强制转换
  • 语法:

    String(数据)

    • 若是不传值默认为’'(空字符串)
  • 转化结果: 基本全部加‘’变为字符串

  • 举例说明

    • console.log(String()) // ''
      console.log(String(0)) // '0'
      console.log(String(true)) //'true'
      console.log(String(false)) //'false'
      console.log(String(undefined)) //'undefined'
      console.log(String(null)) //'null'
      
[3]boolean类型的强制转换(比较常用)
  • 语法:

    Boolean(数据)

    • 若是不传值默认为false
    • 易错点
      • 字符串:空字符串转化为false,只要不是空字符串(带空格、0、、、、都是true)
        • ‘’—false
        • ’ '—true
        • ‘0’—true
        • ‘\n’—true
      • 数字:除了0都是true
      • undefined、null都是false
      • 复杂数据类型:true
        • []:true
        • {}:true
  • 转化结果: 有意义的转化为true,没有意义的转化为false

  • 举例说明

    • <script>
          console.log(Boolean()) //false
           console.log(Boolean(0)) // false
           console.log(Boolean('0')) //true
           console.log(Boolean('')) //flase
           console.log(Boolean(NaN)) //false
           console.log(Boolean(undefined)) //false
           console.log(Boolean(null)) //false
           console.log(Boolean(''))
           console.log(Boolean(' '))
           console.log(Boolean([]))
           console.log(Boolean('\n'))
         </script>
      
基本包装对象

[1]前提:.操作符是对象用来添加/访问属性值的

注:function,array本质也是对象

eg:

 <script>
      let obj = {
        a: '111'
      }
      obj.b = '222'
      console.log(obj.a, obj.b) // 111 222
    </script>![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)

[2]但是作为一个简单数据类型,为什么使用.操作符也不会报错呢

eg:

let a=10;
a.num=22
console.log(a); //10

[3]原因:当JS通过.访问符进行访问时,如果不是对象,JS会将数据封装成一个对象,封装成对象之后就可以使用.访问符进行访问了

  • number简单数据类型通过Number构造函数将数据封装为对象
  • string简单数据类型通过String构造函数将数据封装为对象
  • boolean简单数据类型通过Boolean构造函数将数据封装为对象
  • null和undefined ,js没有为其提供相应的的构造函数(也就是说null和undefined没有包装类型)

[4]基本包装类型的执行原理:

  • 1)在基本数据类型进行点操作时,JS会使用当前数据临时包装一个对象,再在这个对象上使用点语法

  • 2)当本次的点操作结束后,会马上销毁临时包装的对象;

  • 3)看起来什么都没有改变;

  • 举例说明1

    • [1]定义了一个变量a

    • [2]a使用了点语法,js内部使用基本包装类型将a封装为1个对象调用点语法;

    • [3]使用结束,销毁基本包装类型,此时 a=10

    • [4]打印a.num时又使用了点语法,又封装为基本包装类型,但是这个包装类型中a对象的num属性没有被赋值,所以值为undefined

    • let a = 10  
      console.log(typeof a)  // number
      a.num = 22 
      console.log(typeof a); // number
      console.log(a.num);  //undefined
      
  • 举例说明2

    • let a = 10
      console.log(typeof a)  //number
      let objA = new Number(a)
      console.log(typeof objA) // Object
      
  • 举例说明3

    • [1]由于使用点语法但是undefined没有基本包装类型,所以会报错

    • let a = undefined
      a.num = 10
      console.log(a)
      

2.引用数据类型

[1]Array

js-数据类型(数组)

[2]Set

set是Es6新增·的数据类型
js_数据类型(Set)

[3]Function

js-数据类型(函数)

[4]Object

js-数据类型(对象)_乖女子@@@的博客-CSDN博客

[5]Map

Map为Es6新增的数据类型
js-数据类型(Map)

3.数据存储方式

在这里插入图片描述

引用类型深浅拷贝

引用类型的深浅拷贝

数据比较

比较相等\全等

数据类型检测

数据类型检测详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值