01-ECMAScript-数据类型

目录

划分数据类型的原因

1. 5种简单数据类型

(1)number数据类型

number数据类型中两个特殊的数据类型(NaN,Infinity)

isNaN方法

(2) string数据类型

(3)Boolean数据类型

(4)undefeind数据类型

(5)null数据类型

1-2.简单数据类型的相互转化

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

[2]强制数据类型转化

1-3.基本包装对象

2.引用数据类型

[1]Array

[2]Function

[3]Object

3.es6新增的简单数据类型symbol

 3.检测数据类型

[1]简单数据类型的检测

[2]检测复杂数据类型

[2.1]检测是否为数组

[3]万能检测数据类型


划分数据类型的原因

  • 不同的类型的数据具有不同的运算方式与存储方式
  • 计算机并不能识别数字和字符(计算机不能够识别不同的数据);
  • 需要加以划分;

1. 5种简单数据类型

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

[2]分类

(1)number数据类型

  • 数据:整数、小数(浮点数)、正数、负数
  • 注意问题:不要比较小数的大小
    • 原因:计算机内部所有的数据都是以二进制进行存储的,所以小数(由于精度问题)在转化时可能存在丢失,造成结果不准确
    • eg:
    •  console.log(0.3==(0.1+0.2)); //false
       console.log(0.1+0.2) //0.30000000000000004

    • 解决办法:将小数转化为整数,再进行计算/比较
    •   console.log(0.1 * 10 + 0.2 * 10 == 0.3 * 10) //true

number数据类型中两个特殊的数据类型(NaN,Infinity)

[1]NaN

  • NaN属于number数据类型,但是并不是一个数值;

  • 当进行数学运算的时候,若是达不到正确的结果,一般值就为NaN

    • eg:

      let a = 100;
              let b = 'string';
              let sum = a * b;
              console.log(sum);//---输出NaN

  • NaN的特点

    •  1、与任何值进行计算都是NAN;

    • 2、与任何值相比都不相等(包括自身);

  • eg;

     <script>
          console.log(NaN == NaN)// false
          console.log(NaN != NaN)// true
        </script>

[2]Infinity

  • Infinity值为无穷大,-Infinity值为无穷小
    • eg:分母为0时
          console.log(1/0);// Infinity

isNaN方法

  • 作用
    • [1]用于判断一个数是否为NaN(因为任何数与NaN比较都不想等,即使是他本身)
      •  <script>
              let a = 1111
              console.log(isNaN(a)) //false
            </script>

    • [2]用于判断一个字符串是否是全数字组成(is not a number)
      • 是全数字,则返回false
      • 不是全数字,则返回true
      •   <script>
              let a = '1111a'
              console.log(isNaN(a)) //true
            </script>

    • 注:isNaN方法是Window的方法;

(2)string数据类型

注:长使用的字符串方法:js-数据类型(字符串)_乖女子@@@的博客-CSDN博客

  • 数据:使用引号括起来的就是字符串---使用单引号双引号括起来的0个或多个字符即为字符串
  • 注意问题:
    • 默认,单引号内不能再包含单引号,但可以包含双引号
    • 默认,双引号内不能再包含双引号,但可以包含单引号
    • 原因:在遇到单/双引号时,默认会向后寻找 另一个单/双引号,若是找到默认此字符串结束;
    • eg:
       let str='1233'1'
              // 此时就会报错,原因因为str字符串到3就结束了

(3)Boolean数据类型

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

(4)undefeind数据类型

  • 数据:undefined
  • 什么时候数据为undefined
    • [1]在定义了变量但是没有赋值时,变量的值为undefiend
    • [2]在访问对象中没有定义的属性时,属性值为undefiend
    • [3]在访问数组的超出下标的值的时候,值为undefined

(5)null数据类型

  • 数据:null
  • 什么时候的值为null
    • 在使用prompt获取用户输入的数据,用户点击取消的时候,获取的数据为null

1-2.简单数据类型的相互转化

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

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

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

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

2.[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类型,会触发隐式转换 
  • eg1:结果为NaN ---因为即使是+运算,没有string类型的参数也不会触发string的隐式转化
  function add (n1, n2) {
        console.log(n1 + n2)  // NaN
      }
      add(1) 
  • eg2 :计算 从左向右 进性计算 ;
    • [1]100+5 (没有字符串不会触发隐式转化)值为105;
    • [2]105+‘10’ (‘10’为字符串会触发隐士转化) ‘105’+‘10’=10510---字符串拼接
  let res=100+5+'10'
    console.log(res); //10510

[3]boolean类型的触发点

  •  当一个数据作为条件表达式时,会触发boolean隐式转换
    • 例题1
      • (1)i++ ---先进行运算,再自加(不是进性完整个式子运算,而是当前这步)
      • (2)i=0 作为条件触发boolean的隐士转化为false; i=1
      • (3)执行j=i  
      • (4)打印 1,1
let i = 0
      let j = 0
      i++ ? i++ : j = i
      console.log(i)
      console.log(j)
  • 例题2
    • 10转化为boolean为true,取反为false
 console.log(!10)

[2]强制数据类型转化

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

2.[1]number类型的强制转换

  •   语法: Number(数据)
    • 若是不传值默认为0
    • 易错点
      • undefiend强制转化为number类型的结果为NaN
      • 注:在number类型进行强制转化时,只有字符串undefined会转化为NaN
  • 转化结果: 能合理转换就进行转换,转换不了就转换为NaN(NaN设计的目标就是用于接收这种无法转换的情况)
  • 举例说明
 <script>
      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
    </script>

[2]string类型的强制转换

  •   语法: String(数据)
    • 若是不传值默认为''(空字符串)
  • 转化结果: 基本全部加‘’变为字符串
  • 举例说明
    •  <script>
           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'
          </script>

[3]boolean类型的强制转换(比较常用)

  •   语法: Boolean(数据)
    • 若是不传值默认为false
    • 易错点
      • 0---false
      • '0'---true
      • ''---false
      • ' '---true
      • '\n'---true
      • 空字符串转化为false,只要不是空字符串(带空格、0、、、、都是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-3.基本包装对象

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

   注:function,array本质也是对象

eg:

 <script>
      let obj = {
        a: '111'
      }
      obj.b = '222'
      console.log(obj.a, obj.b) // 111 222
    </script>

[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-数据类型(数组)_乖女子@@@的博客-CSDN博客

[2]Function

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

[3]Object

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

3.es6新增的简单数据类型symbol

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

[2]特点

  • (1)Symbol数据类型不能使用 new关键字;
    • 原因: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

3.检测数据类型

[1]简单数据类型的检测

(1)语法:

  • typeof(数据)  
  • typeof 数据

(2)缺点:

  • 结果具有不准确性;
    • 对于null 检测数据类型为object
    • 注:若是检测复杂数据类型(array结果为object)

(3)举例说明

console.log(typeof 0) // number
      console.log(typeof '0') // string
      console.log(typeof true) // boolean
      console.log(typeof undefined) // undefined
      console.log(typeof null) //object

      let sy=Symbol('xx')
      console.log(typeof sy); //symbol

[2]检测复杂数据类型

(1)语法: 数据 instanceof 构造函数

(2)执行原理(本质):检测右面构造函数的原型对象是否在左侧数据地原型链上;

原型链:原型链与作用域链_乖女子@@@的博客-CSDN博客

(3)缺点:结果存在不准确性;

(4)以检测数组为例(前提:数组的构造函数为Array)

 console.log([111] instanceof Array); // true
    console.log([111] instanceof Function); // false
    console.log([111] instanceof Object); // rue
  • [1]当检测[111]是否为数组----true(原因是因为Array.prototype==[111].__proto__)

  • [2]当检测[111]是否为函数---false
    • 因为[111]的原型链上没有Function.prototype
  • [3]当检测[111]是否为对象--true(结果错误)
    • [111].__proto__.__protp__=Object.prototype

(5)案例

  • 注:先画一个左侧对象向上寻找
  • console.log(Object instanceof Object);// true
  • console.log(Object instanceof Function);// true
  • console.log(Function instanceof Object);// true
    • 注:Function创建的自己!
  • console.log(Function instanceof Function);// true

[2.1]检测是否为数组

(1)语法:Array.isArray(数据)

(2)举例说明:

console.log(Array.isArray([111])) //true
      console.log(Array.isArray({ 1: '111' })) //false

[3]万能检测数据类型

(1)语法:Object.prototype.toString.call(数据)

(2)优点:

  • (1)对于任何数据都适用;
  • (2)没有错误情况;

(3)原理:

  • 前提:
    • 很多构造函数的原型对象都具有toString方法,eg:Array.toString();
    • 但是只有Object构造函数的toString方法的作用是检测数据类型的;
  • 执行原理:
    • 检测数据类型,修改toString方法的this指向;
    • 相当于此数据去调用Object原型对象上的toString方法;
    • 这样就检测出此数据的数据类型了!
  • 注意点:
    • 原理上null与undefined是不能够修改this指向的(修改是失败的);
    • 但js是弱语言,很多地方不太完整(很多时候null,undefined是当作对象的)

(4)举例说明

 console.log(Object.prototype.toString.call(1)) // [object Number]
      console.log(Object.prototype.toString.call('1')) // [object String]
      console.log(Object.prototype.toString.call(true)) // [object Boolean]
      console.log(Object.prototype.toString.call(null)) // // [object Null]
      console.log(Object.prototype.toString.call(undefined)) // [object Undefined]
      console.log(Object.prototype.toString.call(Symbol('xx')))// [object Symbol]
      console.log(Object.prototype.toString.call([111])) // [object Array]
      console.log(Object.prototype.toString.call({ 1: '11' }))// [object Object]
      console.log(
        Object.prototype.toString.call(function a () {
          console.log('11')
        })
      ) // [object Function]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值