同学问了我一个问题
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"

 

 

 

 

 

posted on 2019-05-08 17:15  tzdy  阅读(1882)  评论(0编辑  收藏  举报