JavaScript 包装对象 ——以let s = 'Hello word' 和 let str = new String('Hello word') 区别为例

话不多说,上代码:

1:	let s = 'Hello word'
2:	let str = new String('Hello word')
3:	s.num = 12
4:	s.num = 12
5:	console.log(s.charAt(1), str.charAt(1)) // e e
6:	console.log(s.length, str.length) // 10 10
7:	console.log(s.num, str.num) // undefined 12

你有没有想过,变量 s 明明是值类型,为什么也可以对象 str 一样调用 String 实例对象的属性和方法呢?如果说 JavaScript 内部将 s 当作对象处理,那么为什么第三行代码失效了呢?

包装对象

在 JavaScript 中,有一个包装对象的概念,以字符串为例,只要是引用了字符串的属性和方法,JavaScript 就会将字符串值通过new String(s)的方式转为内置对象String,一旦引用结束,这个对象就会销毁。所以上面代码在使用的实际上是String对象的length属性和indexOf方法,执行第三行代码时临时创建了一个对象,执行完之后立即销毁,执行第七行时也是如此,所以从运行结果上看,第三行代码并没有效果。也就是说当访问变量 s 的属性和调用变量 s 的方法时并不是通过变量 s 实现的,而是通过临时生成的对象 Sring(s) 实现的,这个临时对象在使用之后会被立即销毁。


根据上述概念,可以方便的理解下列代码

	let s1 = 'Hello word'
	let s2 = 'Hello word'
	let str1 = new String('Hello word')
	let str2 = new String('Hello word')
	s1.a = 'this is a string'
	str1.a = 'this is a string'
	console.log(s1.a, str1.a) // undefined 'this is a string'
	console.log(s1 == s2, s1 === s2) // true true
	console.log(str1 == str2, str1 === str2) // false false
posted @ 2021-10-23 16:02  庐陵猿客  阅读(186)  评论(0)    收藏  举报