js字符串 new String()、String和String()之间的深度剖析

JS中包装对象、原始资料类型之间的深度剖析

1. 字符串定义

在平时开发中定义字符串无疑3种方式:

let str1 = 'test'
let str2 = String('test')
let str3 = new String('test')
2.定义分析

众所周知使用 new 关键字定义的都是对象。所以可以清楚的知道str3是一个对象,对于str1只是定义了一个变量,然后做了赋值操作,str2就是使用类似于Number、Boolean等方法的类型转换。最终返回的str2也只是是一个字符串。

let str1 = 'test'
let str2 = String('test')
let str3 = new String('test')

console.log(typeof str1);//string
console.log(typeof str2);//string
console.log(typeof str3);//object
3.问题深入

我们知道在js中的变量在内存中的存储有两种形式,值类型存储和引用类型存储。像上面的str1、str2就是值类型储存,str3就是引用类型储存。所以String在JS中是基本类型,基本类型是存储在栈(stack)内存中的,数据大小确定,内存空间大小可以分配。而引用类型是存储在堆(heap)内存中的, 栈中存在的仅仅是一个堆的指针,就像这儿str3存的是new String()实例的一个地址,而正真的实例对象在堆中。所以我们可以为str3添加一些属性和方法。

str1.name='hello'
str2.name='hello'
str3.name='hello'

console.log(str1.name);//undefined
console.log(str2.name);//undefined
console.log(str3.name);//hello
4.为什么普通字符串也有String上的方法
let str1 = 'test'
let str2 = String('test')
let str3 = new String('test')

str1.length//4
str2.length//4
str3.length//4

String.prototype.newFun = function () {  
  console.log('test Fun');
}
str1.newFun()//test Fun
str2.newFun()//test Fun
str3.newFun()//test Fun

可以发现不管是String上原本方法,还是给String原型上绑定的方法,字符串和对象字符串都可以调用。数字、字符串、布尔三者,在JS中称为原始的(primitives)资料类型,再加上null与undefined也是。除了这些类型外,其他的都是对象。(注: ES6的Symbol是新加的原始资料类型),对象中有一类是包装对象(String,Number,Boolen )分别对应数字、字符串和布尔类型。

5.包装对象、原始资料类型

包装类型与原始资料类型之间的正确转换方式如下:
原始->包装: new Number(123)
包装->原始: (new Number(123)).valueOf()
包装对象是个对象,所以它与原始资料类型并不相同,用typeof与instanceof都可以检测出来:

let str1 = 'test'
let str2 = String('test')
let str3 = new String('test')

str1 instanceof Object//false
str2 instanceof Object//false
str3 instanceof Object//true

//作为对象来进行比较,因为对象是参照的,不同的对象不可能相等:
let str4 = new String('test')
console.log(str1 === str2);//true
console.log(str3 === str4);//false

归根结底就是就是js就是这么设计的,原始资料类型的方法与属性是"借"来的,一个原始的资料类型值,并没有属性或方法,它的属性和方法是向包装对象"借来"的,所以原始资料类型是可以向 new String() 或者 new Number() 借来所有的方法。但是自己本身却没有属性和方法。所以这也就是为什么str1、str2可以使用一些对象的方法和属性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值