JavaScript中String、Number以及Boolean三种基本类型的特殊用法

        开篇我们先来说下JavaScript的数据类型:我们都知道JavaScript是一门弱数据类型语言,但它同样有自己的基本类型以及我们习惯提到的类(类的叫法不太恰当,准确说是引用类型),其中基本数据类型有5种:Undefined、Null、Boolean、Number以及String,作为基本类型只做为赋值来使用,并将值存在栈内存,而引用类型大体分为Object、Array、Date、RegExp以及Function类型,而我们知道新建一个“对象”实际上是对其引用类型的一个实例化操作,实例化对象放入堆内存,承载对象地址的变量放入栈内存,这也是新建一个对象和基本数据类型最基本的区别。

       而String、Number以及Boolean三种基本数据类型还可以对其进行包装作为特殊的引用类型使它们也具有各自基本类型相应特殊行为的同时也可以作为引用类型使用相应的方法以及属性。我们来看下面的例子:

var string1="ilovejs";
var string2=string1.substring(2);
      这个例子中的变量string1包含一个字符串,字符串当然是基本类型值,而下一行调用了string1的substring()方法,并将返回结果保存在string2中。我们知道,基本类型值不是对象,因而从逻辑上讲它们不应该有方法。其实,为了让我们实现这种直观的操作,后台已经自动完成了一系列的处理。当第二行代码访问string1时,访问过程处于一种读取模式,也就是要从内存中读取这个字符串值。而在读取模式中访问字符串时,后台都会自动完成下列处理。

var string1=new String("ilovejs");
var string2=string1.substring(2);
string1 = null;
从上面我们可以发现,后台自动完成了这样一个工作:

(1)创建String类型的一个实例

(2)在实例上调用指定的方法

(3)销毁这个实例
      以上操作同样适用于Number以及Boolean类型(注意:引用类型与基本包装类行的主要区别就是对象的生存期,使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在堆内存中。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即销毁)。

     基于此,我们来引申一下这个问题,JavaScript中的“===”意为“绝对相等”,当符号两侧是基本数据类型时,比较两者间的值以及数据类型,而当两侧是引用类型时,则比较的是两者的引用地址,下面我们来看个例子:

var s1="basicString";
console.log(s1 === "basicString")
VM2509:1 true
var s2=new String("basicString");
console.log(s2 === "basicString");
VM2578:1 false
    从以上结果,我们可以看出两种不同的使用方式造成了比较结果,那如果当我们使用实例的方式来引用这三种特殊的引用类型时,想使比较结果正确该如何呢?

var s1=new String("basicString");
console.log(s1.valueOf() === "basicString");
VM2629:2 true
这里我们使用引用类型的继承方法valueOf(),代表获取对象的原始值,对于这三种特殊引用类型,通过valueOf()等到的值就是字面量的值。

再思考一个问题,当我们想比较两个对象的值是否相等该怎么办?我们知道比较符号两侧比较的是对象的引用地址,因此我们不能直接比较两个对象,这里我们可以使用js内置的JSON.stringify()方法来将js对象(json对象也是js对象的一种)转换成对象字符串,这样比较的就是两者的字面量值:

var object1={"a":"2","b":"1"};
console.log(JSON.stringify(object1) === JSON.stringify({"a":"2","b":"1"}))
VM2848:2 true
当然,这种方法有取巧偷懒的倾向,当对象内部嵌套多层时并不适用,严格比较两个对象值时应一层一层先判断其类型再进行相应转换来比较结果


  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值