1. 程式人生 > >JS中String()與new String()的差異淺析

JS中String()與new String()的差異淺析

今天看到這樣的面試題,如下:

var yiifaa = 'yiifaa',
    str1 = new String(yiifaa),
    str2 = String(yiifaa)

宣告與賦值了3個變數,然後考題如下:

//  請確認以下的判斷是否準確
str1 === yiifaa
//
str2 === yiifaa
//
typeof str1 === typeof str2

根據JS的語法,要滿足===的條件如下:
1. 如果是引用型別,則兩個變數必須指向同一個物件(同一個地址);
2. 如果是基本型別,則兩個變數除了型別必須相同外,值還必須相等。

再把話題切換到String物件上來,String的宣告方式有三種(請參見第一段程式碼),但產生的型別卻不盡相同,結果如下:

//  型別為string,為基本型別
typeof yiifaa
//  型別為object,為引用型別
typeof str1
//  型別為string,為基本型別
typeof str2

那現在答案很清楚了,如下:

//  false, 因為str1為引用型別
str1 === yiifaa
//  true, 因為都是基本型別,並且值相等
str2 === yiifaa
// false, 雖然都是字串,但分別為object與string
typeof str1 === typeof str2

總結

很神奇的String物件,一方面可以作為基本型別,另一方面還可以作為引用型別,更神奇的是,為String.prototype新增方法,基本型別還可以引用到,怎麼做到的?

對比JAVA的Integer物件的實現,利用int宣告的變數可不能呼叫Integer的方法,所以還不是裝箱操作。

最後關於一個函式既可以作為普通函式呼叫,也可以作為建構函式呼叫,實現方法如下:

function User(username) {
    this.username = username
    //  這肯定是作為函式呼叫,但在服務端判斷需要改進
    //  必須要進行判斷,否則死迴圈
    if(this === window) {
        return new User(username)
    }
}

改進的方法如下:

function User
(username) {
// 一定是呼叫了建構函式 if(this.inst === "User") { this.username = username } else { return new User(username) } } // 為User的上下文新增標記 User.prototype.inst = "User"

相關推薦

JSString()new String()的差異淺析

今天看到這樣的面試題,如下: var yiifaa = 'yiifaa', str1 = new String(yiifaa), str2 = String(yiifaa) 宣告與賦值了3個變數,然後考題如下: // 請確認以下的

jsparseInt()parseFloat(),Number(),Boolean(),String()轉換

js將字串轉數值的方法主要有三種 轉換函式、強制型別轉換、利用js變數弱型別轉換。 1. 轉換函式: js提供了parseInt()和parseFloat()兩個轉換函式。前者把值轉換成整數,後者把值轉換成浮點數。只有對String型別呼叫這些方法,這兩個函式才能

JSDateString的相互轉換

1- Date -> Stringnew Date().toLocaleDateString();  ==> 2017/4/152- Date -> "2017-04-15"varye

JavaString直接賦字符串和new String的區別 如String str=new String("a")和String str = "a"有什麽區別?

this his The tin ase name ++ 常量池 TE 百度的面試官問 String A="ABC"; String B=new String("ABC"); 這兩個值,A,B 是否相等,如果都往HashSet裏面放,能放下嗎? 答:A==B 不等,

java字串基本知識 String s=new String("abc")建立了幾個物件?

本文轉載自http://www.cnblogs.com/ydpvictor/archive/2012/09/09/2677260.html String s=new String("abc")建立了幾個物件? String str=new String("abc"); &nb

String str = new String("content") 建構函式有沒有返回值?new關鍵字到底在物件初始化做了什麼?

看到String str = new String("content")時想到一個問題:在我印象裡,建構函式時沒有返回值的,那麼建立的物件是如何賦值的呢?有沒有方法確定知道建構函式有沒有返回呢? 建構函式時沒有返回值的,賦值因為new關鍵字。 new的內部是呼叫了一個叫void * oper

C++std::stringC-String字元陣列的互相轉換

C語言中只有字元陣列這一說法,沒有C++專門封裝的字串類std::string。而字元陣列C-String以\0作為結束符。std::string其實還是儲存了C-String這個指標,只不過不同的編譯期對std::string中的儲存結構都做了不同的處理,這裡我們不討論std::str

關於String str1="123"String str2=new String("123")類問題詳解

要徹底弄明白這個問題,我們需要清楚一些基本概念:Class檔案中的常量池,執行時常量池(runtime constant pool),全域性字串常量池(StringTable),Java heap,一些常用位元組碼以及常量池中的常量型別等jvm的知識: Class檔案常量

論 javaStringnew String還有物件String字串在記憶體的儲存

一直以來,所有人都說,java中的String型別是不可變的,可是為什麼不可變確很少有人說的透徹,String和new String的區別,物件中的String和直接定義一個String是否有區別,一直都是一知半解。看了很多文件都是各種猜測,沒有具體程式碼來

String str = new String("content") 建構函式有沒有返回值?new關鍵字到底在物件初始化做了什麼?

看到String str = new String("content")時想到一個問題:在我印象裡,建構函式時沒有返回值的,那麼建立的物件是如何賦值的呢?有沒有方法確定知道建構函式有沒有返回呢? 建構函式時沒有返回值的,賦值因為new關鍵字。 new的內部是呼叫了一個叫v

String s =new String()分析堆棧 建立了幾個物件

轉載自 分享最終編輯 tanzhimei393先定義S String str1 = “abc”; System.out.println(str1 == “abc”); 步驟: 1) 棧中開闢一塊空間存放引用str1, 2) String池中開

java和jsJSONObject,JSONArray,Map,String之間轉換——持續更新

--------------------------------------------------java中-------------------------------------------------------------- 1.String轉JSONObject

JSArray物件和String物件的常用方法

1.陣列的建立: 使用字面量建立: var arr = [10,20,20,40]; 使用建構函式建立陣列 var arr = new Array(1,2,3,4); 2.陣列元素的型別:

String str="abc" String str = new String("abc");詳解

1.java執行環境有一個字串池,由String類維護,執行語句String str="abc"時:                                                                                       

jsjson物件和string互轉

json轉string的方法 /** * json物件轉字串形式 */ function json2str(o) { var arr = []; var fmt = function(s) { if (typeof s ==

angular js conpilelink應用區別

點擊 ive 增刪 html ret ont 綁定 function cli link方法是compile拋出來的一個方法 應用 app.directive("thumbNail",function(){ return{ restrict:"AC

js的|| &&

字符 als 邏輯與 執行 lean 邏輯或 false bool 轉換 js中的|| 與 &&a && b : 將a, b轉換為Boolean類型, 再執行邏輯與, true返回b, false返回aa || b : 將a, b轉換為Boo

JStypeofinstanceof的區別

color tro 算數 同時 typeof window string 鏈接 new JavaScript 中 typeof 和 instanceof 常用來判斷一個變量是否為空,或者是什麽類型的。但它們之間還是有區別的: typeof typeof 是一個一元運算,放在

JS同步異步

事件 過程 ole 跳過 說明 timeout nbsp 技術分享 com 不講過多定義,舉兩個例子說明下 例一: console.log(100); setTimeout(function(){ console.log(200); },1000); cons

js的||&&用法

defined clas efi blog 執行 urn cti 用法 表達式 &&和||在JQuery源代碼內尤為使用廣泛,由網上找了些例子作為參考,對其用法研究了一下: &&: function a(){ alert("