javascript 创建字符串对象与字符串区别


同学问了我一个问题
var str= new Object("Hello world!");
str.name="fox";
document.write(str.name) // 结果是fox
假如这样:
var str= "Hello world!";
str.name="fox";
document.write(str.name) // 结果是undefined

注:我们用 var str = new Object("Hello world!"); 相当于 var str = new String(("Hello world!"));
var str = new Object("Hello world!"); //我们查看str.__proto__为String {"", constructor: ƒ, anchor: ƒ, big: ƒ, blink: ƒ, …}
var str = new String(("Hello world!")); //str.__proto__为String {"", constructor: ƒ, anchor: ƒ, big: ƒ, blink: ƒ, …}

两者有什么区别,首先先要知道new这个操作符做了什么。
var Person = function(){ this.name = "ydy"; } Person.prototype.put = function(){ console.log(this.name); }
 
当我们使用 var person = new Person 相当于这样一个过程
var person = {}; person.__proto__ = Person.prototype; Person.call(person); //改变Person中的this指针,使其指向person对象。  

铺垫结束正文开始!

平常我们可能都是以这种方式来建立字符串。

var str="Hello world!";

而很少用这种方式。

var strobj= new Object("Hello world!");

为什么不用这种方式呢,我想很多人都是在网上的教程中看到,但是不清楚为啥。

首先,strobj是一个对象,我们能调用它的各种方法并不奇怪,但是str只是一个字符串,我们为啥也可以像对象一样调用方法?

以includes函数为例,当我们调用includes函数时

var judge = str.includes("world");

实际上是这样一个过程,只不过你看不到,都是自动的。

var s = new String("Hello world!"); var judge = str.includes("world"); s = null;               

由此来看,当我们使用字符串时,每当我们调用一个方法时,系统就会帮你创建一个String对象,并执行方法,最后在将这个对象销毁,不去继续占用内存。相比于直接建一个String对象来说,也算是节省了一部分内存啊。(这里是我自己的看法,如有错误,欢迎指正。)

综上所述:我们就可以解决开头我那个同学的问题了。

var str = "Hello world!"; 
str.name ="fox";
是零时构造的String对象新建了name属性,并赋值"fox",最终是被销毁了,
当你再次str.name时 就没有name这个属性 ,所以时undefined
var str= new Object("Hello world!");
str.name="fox";
是你自己创建了一个String对象,除非你自己销毁,否则是一直存在的,
当你调用str.name
= "fox" 就是给该对象增加一条name属性并赋值"fox" 所以再次str.name时,就是"fox"

 

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM