同學問了我一個問題
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"