数据类型

一、数据类型

1.基本数据类型:null,undefined,string,number,boolean
2.引用数据类型:object,array,function,data等

二、基本数据类型和引用数据类型的区别

1. 声明变量时不同的内存匹配
基本数据类型:存储在栈中的简单数据。它们的值直接存储在变量访问的位置。
引用数据类型:存储在堆中的对象。存储在变量处的值是一个指针,指向存储对象的内存地址。
2. 不同访问机制
基本数据类型:值可以直接访问到
引用数据类型:在js里不允许直接访问保存在堆内存中的对象,所以要按引用访问(要访问一个对象,首先得到对象在堆内存中的地址,按地址取得对象的值)
3. 复制变量时的不同
基本数据类型:在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的,他们只是拥有相同的value而已。
引用数据类型:在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,就是说这两个变量都指向了堆内存中的同一个对象,他们中任何一个作出的改变都会反映在另一个身上。
4. 参数传递的不同
基本数据类型:只是把变量里的值传递给参数,之后参数和此变量互不影响
引用数据类型:对象变量里面的值是对象在堆内存中的内存地址!因此它传递的值也是这个内存地址。这也是函数内部对这个参数的修改体现在外部额原因(因为它们指向同一对象)。

三、判断数据类型(4种方法)

1.一般通过 typeof返回对应的数据类型

 <script>
    var a=null;
    var b;
    var c="hahah"
    var d=2;
    var e=true;
    var f=function(){
      };
    var g=[1,2];
    var h={
      h1:111
    };
    console.log(typeof(a));    //object
    console.log(typeof(b));   //undefined
    console.log(typeof(c));   //string
    console.log(typeof(d));  //number
    console.log(typeof(e));  //boolean
    console.log(typeof(f));   //function
    console.log(typeof(g));  //object
    console.log(typeof(h));   //object
   </script>

typeof还可用来判断一个变量是否存在,if(typeof a!=“undefined”)。
局限:对于array、null和对象,typeof一律返回object。
对此可以通过JS的 instanceof来区分对象的子类型。
2.instanceof判断一个变量 是否是一个对象的实例。返回true或false
原理就是测试构造函数的 prototype 是否出现在被检测对象的原型链上

var a=[];
console.log(a instanceof Array) //返回true 

但instanceof仍无法判断一个值属于数组还是对象
3.constructor返回对象相对应的构造函数
在这里插入图片描述
null 和 undefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断
4.Object.prototype.toString()
判定 JavaScript 中数据类型的终极解决方法
对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。
过程:先是获取对象的类名;再输出形式如 [object,class] 的字符串,class 指代的是其检测出的数据类型

<script>
    var a=null;
    var b;
    var c="hahah"
    var d=2;
    var e=true;
    var f=function(){
      };
    var g=[1,2];
    var h={
      h1:111
    };
   var op=Object.prototype.toString;
    console.log(op.call(a));    //[object Null]
    console.log(op.call(b));    //  [object Undefined]
    console.log(op.call(c));      //[object String]
    console.log(op.call(d));      //[object Number]
    console.log(op.call(e));     //[object Boolean]
    console.log(op.call(f));     //   [object Function]
    console.log(op.call(g));     //[object Array]
    console.log(op.call(h));    //[object Object]
 </script>

四、类型转换

1.转换函数
parseInt()把值转换成整数
parseFloat()把值转换成浮点数
只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(Not a Number)。
在判断字符串是否是数字值前,parseInt()和parseFloat()都会仔细分析该字符串。

  • parseInt()方法首先查看位置0处的 字符,判断它是否是个有效数字;如果不是,该方法将返回NaN,不再继续执行其他操作。但如果该字符是有效数字,该方法将查看位置1处的字符,进行同样的 测试。这一过程将持续到发现非有效数字的字符为止,此时parseInt()将把该字符之前的字符串转换成数字。
parseInt("1234blue");   //returns   1234   因为当它检测到字符串b时,就会停止检测过程
parseInt("0xA");   //returns   10                  字符串中包含的数字字面量会被正确转换为数字
parseInt("22.5");   //returns   22 
parseInt("blue");   //returns   NaN

parseInt()方法还有基模式,可以把二/八/十/十六/其他进制的字符串转换成整数,基有方法的第二个参数指定:

parseInt("10",   2);   //returns   2
  • parseFloat()方法与parseInt()方法的处理方式相似。不过,对于这个方法来说,第一个出现的小数点是有效字符。如果有两个小数点,第二个小数点将被看作无效的, parseFloat()方法会把这个小数点之前的字符串转换成数字。使用parseFloat()字符串必须以十进制表示浮点数。
parseFloat("1234blue");   //returns   1234.0 
parseFloat("0xA");   //returns   NaN 
parseFloat("22.5");   //returns   22.5 
parseFloat("22.34.5");   //returns   22.34 
parseFloat("0908");   //returns   908 
parseFloat("blue");   //returns   NaN

2.强制类型转换

  • Boolean(value)——把给定的值转换成Boolean型;

当要转换的值是至少有一个字符的字符串、非0数字或对象时,Boolean()函数将返回true。如果该值是空字符串、0 、NaN、 undefined或null,它将返回false。

Boolean(undefined);   //false   
Boolean(null);   //false   -   null 
Boolean(NaN);   //false    
Boolean([]);   //true
Boolean("");   //false   –   empty   string 

Boolean("hi");   //true   –   non-empty   string 
Boolean(100);   //true   –   non-zero   number 
Boolean(0);   //false   -   zero 
Boolean(new   Object());   //true   –   object
  • Number(value)——把给定的值转换成数字(可以是整数或浮点数);
Number(undefined)   //NaN
Number(null)              //0
Number(NaN)       //NaN
Number([])       //0
Number('')       //0

Number(true)       //1
Number(false)       //0
Number( "5.5 ")      //5.5
Number( "56 ")       //56
Number( "5.6.7 ")        //NaN
Number(new   Object())      //NaN
Number(100)           //100

Number()的强制类型转换与parseInt()和parseFloat()方法的处理方式相似,只是它转换的是整个值,而不是部分值。

  • String(value)——把给定的值转换成字符串。
    String()强制类型转换与toString的不同之处是可以将null和undefined也转换成字符串
String(undefined)            // 'undefined'
String(null)                 // 'null'
String(NaN)                 // 'NaN'
String([])            // ' '
String("")            //  ' '

String(true)                 // 'true'
String(1)                    // '1'
String(-1)                   // '-1'
String(0)                    // '0'
String(-0)                   // '0'
String(Infinity)             // 'Infinity'
String(-Infinity)            // '-Infinity'
String({})                   // '[object Object]'
String([1,[2,3]])            // '1,2,3'

3.隐式类型转换
一元+ -运算符将其操作数转换为Number类型。

+ '3'      //  3
- '-3'      //  3

4.总结
类型转换可使用:

  • 转换函数parseInt()和parseFloat(),前者把值转为整数,后者把
    值转为浮点数;

  • 使用强制类型转换
    Boolean(value)——把给定的值转换成Boolean型
    Number(value)——把给定的值转换成数字
    String(value)——把给定的值转换成字符串

  • 隐式类型转换
    一元运算符(”+“、”-“)将操作数转为Number类型

五、null和undefined区别

1.null表示一个对象不存在,即没有对象, 它是JavaScript的关键字,可以认为是对象类型,它是一个空对象指针。

  • 作为函数的参数,表示该参数不为对象;
  • 作为对象原型链的终点;
  • 定义一个值为null合理,定义一个值为undefined不合理

2.undefined表示基本类型或对象的值未被定义,即一个变量不含值。undefined 却是javascript才有的,为了区分空指针对象和未初始化的变量

  • 变量被声明了还没有赋值,就为undefined;
  • 调用函数时应该提供的参数还没有提供,该参数就等于undefined;
  • 对象没有赋值的属性,该属性的值就等于undefined;
  • 函数没有返回值,默认返回undefined。

3.undefined是访问一个未初始化的变量时返回的值,而null是访问一个尚未存在的对象时所返回的值。
4. null 和 undefined 的值相等,但类型不等:

typeof undefined             // undefined
typeof null                  // object
null === undefined           // false
null == undefined            // true
  1. Number转换的值不同,number(null)输出为0,number(undefined)输出NaN
  • 相同点:if判断中会被转为false

六、比较规则

  1. 对象和布尔值
    先将对象转换成字符串,再转成数字,直接将布尔值转换成数字
console.log([] == true);//false
先将[]转成字符串'',在转成数字是0,true转成数字是1
  1. 对象和字符串比较
    对象和字符串比较先将对象转成字符串,再比较
console.log([1,2,3] == "1,2,3");//true
  1. 对象和数字比较
    先将对象转成字符串,再转成数字
console.log([1] == 1)//true
  1. 字符串和数字比较
    先将字符串转成数字,再比较
console.log("1" == 1)//true
  1. 字符串和布尔值比较
    将字符串和布尔值都转成数字
console.log("1" == true);//true
  1. 布尔值和数字
    将布尔值转成数字
console.log(true == 1)//true

七、其他

undefined
null
0
-0
NaN
"  "

以上这些值在布尔值转换中,会转换成false,但并非说他们和false是一样的:

undefined == true   //false
undefined == false  //false

undefined == null    //true
undefined === null  //false

null ==  false          //false
null == true            //false

"" == false              //true
"" == true               //false

0 == false               //true
0 == true                //false
-0 == false              //true
-0 == true               //false

NaN == false           //false
NaN == true            //false
NaN == NaN            //false NaN与任何值都不相等,包括它自身
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值