JS的数据类型详细介绍

js的数据类型

  • 基本数据类型
    • number 数字类型 2,1.2, -2,+4
    • string 字符串 '正确的值 ’ // " 中文" //黑色是字符串
    • boolean 布尔 true false
    • null 空对象指针
    • undefined 未定义
  • 引用数据类型
    • object对象
      • 普通对象 {name: ‘xxxx’ }
      • 数组 [’ ’ ,1,true,null,undefined]
      • Math 数学对象
      • Date的实例
      • /^$/ 正则
      • 函数
      • 原型
      • arguments
      • 元素集合
    • function 函数
      • 普通函数
      • 构造函数(类)

js的部分数据类型的详细介绍

number数字类型

有效数字 3,5.5 , -4.4 , 0 ,+7
NAN (not a number) 不是一个数,但是他是number数据类型的

NAN和谁都不相等 (包括他自己)

-把其他数据类型转数字类型

  • Number(val)
    - parseInt(val)和parseFloat(val)

1、 Number(val)

  • 把字符串转数字
    • 把字符串转数字只要字符串中出现了非有效数字,那结果就是NAN (第一个小数点不算,第一个-,+不算)
    • 如果左右有空格,会自动去掉,中间不可以去掉
    • 空字符串数字是0
  • 把布尔转数字
    • true转数字是1
    • false转数字是0
  • 把null和undefined转数字
    • null 转数字0
    • undefined转数字是NAN
  • 把对象转数字
    • 把普通数据类型转数字,先把值转字符串,在把字符串转换为数字
      • 所有的普通对象转字符串都是 ‘[object Object]’
      • 所有的普通对象转数字都是NAN
    • 把数组转数字,把值转换为字符串,再把字符串转换为数字
      • 把数组转字符串是把左右两边的中括号去掉,替换为引号即可(逗号不能丢)
      • [null,undefined] => ‘,’=>NaN
        [null]=>’’=>0
        [{},{}]=>’[object Object],[object Object]’

2、parseInt(val)和parseFloat(val)

1> 把字符串转换为数字
2> 从左到右依次查找有效数字,一旦发现非有效数字,立即停止查找,把找到的数字返回出去,(parseInt不可以识别小数、只能取整,parseFloat可以识别小数)
3> 如果从一开始就是非有效数字,那结果就是NaN
4> 如果你要转换的值不是字符串类型的,先转换为字符串类型类型,再查找
5> true、false、null、undefined、{}、NaN 转都是NaN
6> 数组是先转换为字符串,再进行查找

3、四则运算(除了加法)

  • 利用四则运算(除加法)可以转数字,不是字符串

isNaN(val)

1> 检测一个值是否是一个非有效数字,如果是就是true,反之就是false(这个值如果是有效数字那结果就是false,反之就是true)
2> 如果你要检测的值不是数字类型,先转换为数字类型,在检测

string 字符串

  • 所有 单引号、双引号、反引号(`` ES6的模板字符串)包起来的都是字符串
  • 天生自带一个length属性,代表字符串的长度或者个数
  • 空格也是字符 ’ ’ 不是空字符串,里面有空格 Boolean(’ ') true

-把其它类型值转为字符串

  • val.toString()
    - 字符串拼接

1.val.toString()

  • 把number、boolean(true、false)转字符串都是直接加引号
  • null 和undefined不能使用toString方法,转成空字符串
    • [null,undefined] => ‘,’=>NaN
    • [null]=>’’=>0
  • 把普通对象转字符串 => ‘[object Object]’
  • 数组转字符串=> 把中括号去掉,然后把数组的每一项都去toString处理,然后拼接到一块(,不能丢)
console.log([{}, []].toString()) // '[object Object],'
console.log([null, undefined].toString()) // ','
let scr ='asd';
console.log(str[0])

2.字符串拼接

  • 四则运算:在四则运算中,除了加号,其余的都是正常的运算
  • 在运算中过程中,如果运算的值不是数字类型的,先转为数字类型,再运算
  • 在运算过程当中,如果出现了NAN,那结果就是NaN
  • 在加法中有两种情况:
    • 正常运算
    • 字符串拼接:如果加号一旦跟引号相遇了,那就是字符串拼接,不再是正常的运算(基本数据类型是这样的,直接拼接不用转数字)
    • 如果拼接的过程当中,遇到引用数据类型要转数字(但是转数字要先转成字符串,一旦字符串和加号相遇了,就是字符串拼接)
    • 11+[],空数组变为数字,要先经历变为空字符串,遇到字符串,啥都别想了直接字符串拼接。

boolean 布尔 (true false)

-把其他数据类型转布尔 Boolean !/!!

  • Boolean([val])
    • 把其他数据类型转布尔有且只有NAN、null、undefined、0、’'这五种是false,其余的都是true
    • 把布尔转布尔还是本身
    • ’ ’ 不是空字符串,里面有空格 Boolean(’ ') true
Boolean(true) // true
Boolean(false) // false


Boolean(NaN) // false
Boolean(null) // false
Boolean(undefined) // false
Boolean(0) // false
Boolean('') // false
其他的转布尔全是true

!/!!

  • !:把其他数据类型先转布尔,然后取反
  • !null//true
  • !! 把其他数据类型转布尔,然后取反再取反

null和undefined

他俩都代表空

  • null: 他一般都是意料之中的(一开始我们不知道值,先手动赋值null,但是以后知道了,再给他重新赋值)

1// 一开始我买了一辆夏利,但是有油箱里没有油,我先给他手动赋值null,经过我几个月的努力,我挣钱了,我拿着五毛钱买了一升油,现在我给邮箱赋值1
2let gasoline = null;
3gasoline = 1;

  • undefined: 他也是空,但是一般都是浏览器的默认机制定义的(意料之外的)

1//孙悟空本身就没有父亲,他是石头缝里蹦出来的,但是你还是去找他的爸爸,这就是意料之外的事,找不到就是undefined
2//猪悟能我们大家都知道有父亲,但是不知道具体是,先赋值,打听后,知道了再赋值
3let pigFather = null;
4pigFather = ‘xiaoHua’

引用数据类型([],{})

  • 每一个对象都有大括号包裹,里面是0到多个键值对组成,多组拿逗号隔开
  • 每个键值对由属性名和属性值组成(中间拿冒号链接/分割) [key:value]
  • 属性名可以是字符串也可以是数字(’'可以省略)
  • 属性值就是js数据类型的一种
  • 增删改查
    • 查询属性名所对应的属性值:

      对象名.属性名/对象名[‘属性名’];如果属性名是数字,不能用对象名.属性名的方式去获取对应的值
    • 新增和修改 对象名.属性名 = ‘xxx’

      新增的属性名如果存在,就是修改属性值,如果没有就是新增
    • 删除
      • 假删除 对象名.属性名 = null;
      • 真删除 delete 对象名.属性名

        (以上的操作 “对象名.属性名”都可以改为对象名[‘属性名’];两种方式,用哪个都可以)

object对象数据类型-普通对象

  • {[key]:[value],…} 任何一个对象都是由零到多组键值对 (属性名:属性值)组成的 (并且属性名不能重复)
  • 属性名是由数字或者字符串格式。属性名都是字符串,""省略不写
  • 如果当前属性名不存在,默认的属性值就是undefined
  • 如果属性名是数字,则不能用点的方式来获取,写成 对象名[‘属性名’],除了数字其他都可以用 对象名.属性名
  • 新增修改
    • 属性名不能重复,如果属性名已经存在,不属于新增属于修改属性值
  • 删除属性
    • 真删除:把属性彻底干掉 delete person[1];
    • 假删除:属性还在,值为空 person.weight = null;

console.log(person.1)//=>SyntaxError:语法错误

let monkey = {
name: 'sunWuKong ',
age: null,
speed: 10000,
ifantName: ‘badMonkey’,
3: ‘xxx’
}
获取属性名所对应的属性值获取不到就是undefined
如果属性名重复下面的会覆盖上面的
console.log(monkey.father) //undefined
console.log(monkey)

  • 对对象进行增删改查
    1、查寻属性名所对应的属性值:对象名.属性名/对象名[‘属性名’];如果属性名是数字,不能用对象名,属性名的方式去获取对应的值
    console.log(monkey.name)
    console.log(monkey[‘name’])
    - 新增和修改 对象名.属性名 = 'xxx’
    当你新增的时候,新增的属性名如果存在,就是修改属性值,如果没有就是新增。
    monkey.ss = ‘333’

monkey[‘ss’] = ‘3333’;
monkey.name = 'ssss’
console.log(monkey)

  • 删除
    + 假删除 对象名.属性名 = null ;
    monkey.name = null;
    console.log(monkey)
    + 真删除 delete 对象名.属性名
    delete monkey.name;
    console.log(monkey)

let box = {
people: 33,
line: slow,
background: black,
}
let obj = {

}

数组 []

数组对象是特殊的对象

  • 数组外层由中括号包裹,里面存贮
  • 我们中括号中设置的是属性值,它的属性名是默认生成的数字,从零开始递增,而且这个数字代表每一项的位置,我们把其称为“索引”=>从零开始,连续递增,代表每一项位置的数字属性名
  • 天生默认一个属性名 length ,存储数组的长度或个数
  • 第一项索引0 最后一项索引 ary.length-1
向数组末尾追加内容
ary[ary.length] = 100;
删除数组末尾内容
ary.length = ary.length-1
ary.length--
1let ary = ['2',2,true,false,null,undefined,{},[] ];

数据类型比较

//判断
if(1==2){
//如果这个小括号中值是true,那么执行这个大括号中的代码;如果false,直接执行下面那行代码;
console.log(100)
} else{
console.log(200) }
/* == : 是两个值进行比较,会默认进行数据类型之间的转换再比较;比较的结果是一个布尔值
基本数据类型 Number string boolean null undefined symbol
操作的是值
// 引数据类型分为对象数据类型和函数数据类型
对象数据类型: 普通对象 数组 正则 Math Date的实例
函数数据类型: 函数 类;
操作的是地址

1. 数字==字符串 字符串调用Number转换成数字,然后和数字进行比较
       console.log(1=="1");
       console.log(0==" ");       
       console.log(1=="[1]"); */

2.数字和布尔比较   布尔转数字,然后进行比较
        //    true -->1  false -->0      
        // console.log(1 == true); //true    
        // console.log(0 == false); //true

3.数字 == 对象(对象数据类型)对象先转成字符串再转成数字
      //NaN 和自己不相等      
      // console.log(NaN == {}) //false
4.对象==对象

            在js中,只要遇到{},都会开辟一个新的空间地址;            
            当浏览器解析代码时,会形成两个虚拟的内存分别是栈内存和堆内存         
            栈内存提供代码的运行环境,并存储基本数据类型值。堆内存存储引用数据类型的值。             
            堆内存            
            栈内存           
             let c =100;          
             let a = { };            
             let b = { };             
             console.log(a==b);           
             console.log(({ })==({ }));           
             console.log(c) 
5.对象==字符串 :对象转成字符串,然后进行比较

      /*   console.log(({name:1}).toString());// "[object Object]"<br />             let str = "";<br />             let str1 = " ";<br />             console.log(str1.length);<br />             console.log(""==" ");<br />             console.log(Number(""));<br />             console.log(Number(" "));<br /> */

6.对象==布尔 : 对象转字符串,字符串转数字,布尔直接转数字

       //! : 先将后面的值转成布尔值,然后再取反;<br />         /*   console.log( [] == false );//true<br />          console.log( ![] == false ); //true<br />          console.log( [] == ![] ); //true<br />          console.log( []  !== []); //true

7.布尔==字符串  : 布尔值转数字 字符串转数字

        console.log(false == "")//true         console.log(true == "1px")//false 

8.null == undefined  : true        
null=null //true  undefined = undefined//true 
null和undefined和其他值都不相等
9. NaN == NaN false  
NaN和其他都不相等包括它自己

关于== 的转换

1. 数字 ==字符串 字符串调用Number转换成数字,然后和数字进行比较;  
2. 数字 ==布尔  布尔转数字,然后进行比较  
3. 数字 == 对象(对象数据类型) 对象先转成字符串,然后再转成数字;
4. 对象==对象 比较的是空间地址,空间地址不同,就false;  
5. 对象==字符串 :对象转成字符串,然后进行比较   
6. 对象==布尔 : 对象转字符串,字符串转数字,布尔直接转数字,然后进行比较; 
7. 布尔==字符串  : 布尔值转数字 字符串转数字   
8. null == undefined  : true   
9. NaN ==NaN  false

数据类型检测

  • typeof 检测数据类型的运算符
  • instanceof 检测当前实例是否属于某个类
  • constructor 基于构造函数检测数据类型(也是基于类的方式)
  • Object.prototype.toString.call(): 检测数据类型最好的办法

typeof 检测数据类型的属性

  • 他的返回值是一个字符串
  • 字符串里存放的就是他的数据类型
  • typeof null => ‘object’ 但是null并不是对象
  • typeof检测数组、普通对象、null返回的都是’object’,所以用typeof检测数据类型,无法细分出是普通对象,是数组,是null
console.log(typeof 12) //'number'
    console.log(typeof '12')//'string'
    console.log(typeof undefined)//'undefined'
    console.log(typeof null)//'object'
    console.log(typeof true)//'Boolean'
    console.log(typeof [])//'object'
    console.log(typeof ({}))//'object'

     // 只要两个及两个以上typeof,那最后的结果就是 'string'
    console.log(typeof typeof typeof 12)//'string'

instanceof

  • 他是检测当前实例是否属于某个类
  • 实例 instanceof 类,如果实例是属于这个类,那就返回true,反之就是false
  • 局限性
    • instanceof不能检测基本数据类型,只能检测引用数据类型的值
      • 非要检测基本数据类型,用构造函数创建变量,赋值为基本类型(new Number(11))
        function Fn(name, age){
            this.name = name;
            this.age = age;
        }
        let f1 = new Fn;
        console.log(f1 instanceof Fn) // true
        console.log(1 instanceof Fn) // false
        console.log('22'.substr) // instanceof 不能够检测基本数据类型
        console.log((1).substr) // instanceof 不能够检测基本数据类型
        let num = new Number(11);
        console.log(num instanceof Number)//true

constructor检测数据类型

  • constructor 基于构造函数检测数据类型(也是基于类的方式)
  • 不能把类的原型重定向
  • 不能在实例的私有属性上加constructor
        // function Fn() {
        // }
        // let f = new Fn;
        // console.log(f.constructor === Fn)//true  

        // function Fn() {

        // }
        // Fn.prototype = {}
        // let f = new Fn;
        // console.log(f.constructor === Fn) //false
        // f.constructor = 6;
        // console.log(f.constructor) //6

Object.prototype.toString.call()

        let ary =let ary = [1, 2];
        let obj = {}
        let num = 1
        console.log(Object.prototype.toString.call(num))  
        //他的返回值是一个字符串,里边是 '[object 你当前实例的所属类]'
        //只能检测内置类,不能检测自定义类(call(自定义类的实例)都是object)
        function Fn(){};
        let f =new Fn;
        
发布了51 篇原创文章 · 获赞 13 · 访问量 3086

猜你喜欢

转载自blog.csdn.net/Sheng_zhenzhen/article/details/103338486
今日推荐