2015-05-16 41 views
0

我對此感到困惑。我有以下代碼。爲什麼s.len`未定義(而不是4),而`s`的值爲`test`? - JavaScript

var s = "test"; 
s.len = 4; 
var t = s.len; 

的問題是,爲什麼變量tundefined值。

如果您在代碼之後檢查s.len,則它是未定義的。 如果您選擇s,則值爲test。不知道這裏發生了什麼事。我相信有一個解釋,但不能讓我的頭,並不知道如何搜索。

對於那些考慮投票的人。這是我們在課程中遇到的一個問題,我們預計將在這個謎語的下一次會議上做準備。 我對編程並不陌生,但我未能研究JavaScript如何處理此代碼。這是真正有效的代碼,在你的開發工具中執行它,你會看到。

我爲字符串s定義了一個名爲len的屬性賦值爲4.這個屬性是,我相信創建,但未定義。我想現在爲什麼呢?是否特定於JavaScript中的字符串?

+3

'.length',不'.len' – david

+1

分配's.len = 4'這是更多鈔票只有當's'是一個對象,'len'是's'的一部分。 – Sachink

+0

如果你想獲得字符串's'的長度,只需使用's.lenght'。爲什麼你給字符串長度賦值「4」? – Sachink

回答

3

,但我不研究的JavaScript如何處理這個代碼。

很簡單:字符串是JS中的基本類型,這意味着它們本身沒有屬性。

對於.運算符來處理它們(例如,對於.length調用),javascript定義了一種稱爲「包裝對象」的東西。

所以,當你試圖訪問一個原始對象的屬性 - 一個臨時的包裝對象被創建,其行爲作爲一個對象,因此你可以訪問和分配屬性。

問題是包裝器對象是臨時的,所以在用它來訪問一個屬性之後,該對象會被丟棄,並且它的所有狀態都被丟棄。

這就是爲什麼當您指定.len屬性時,您無法在下一行訪問它:它已丟失。

所以對於實際發生的場景,在後面的代碼僞代碼是

var s = "test"; 
(new String(s)).len = 4; // here you add an attribute for a new object 
         // and `s` is left untouched 
var t = s.len; 
+0

這對我來說簡潔明瞭。謝謝@zerkms – Elyasin

2

問題是爲什麼變量t的值爲undefined。

因爲您已將s定義爲字符串而不是對象。所以s.len應該是undefined

我不確定你想要做什麼。但是,如果你想得到slength然後t = s.length將簡單地工作。

我爲字符串s定義了一個名爲len的屬性,賦值給它4.這個屬性是我相信創建的,但是沒有定義。我想現在爲什麼呢?是否特定於JavaScript中的字符串?

你可以從這個question

+0

是不是可以創建一個新的屬性來字符串? – Elyasin

+0

你可以按照這個http://stackoverflow.com/questions/5201138/why-cant-i-add-properties-to-a-string-object-in-javascript @Elyasin – hasan3050

+0

完美答案@ hasan3050。將此添加到您的答案中,我立即接受。這正是我試圖找到的解釋。謝謝。 – Elyasin

0

運行找到了答案:

var s1 = "test"; 
console.log(typeof s1)//string 
var s2 = {} 
console.log(typeof s2)//object 
s1.len = 4; 
s2.len = 4; 
console.log(s1.len);//undefine 
console.log(s2.len);//4 
+0

謝謝哈登。這提出了一個問題。如果字符串不是對象,那麼我不知道它們可以具有屬性。 – Elyasin

+0

原始類型也被稱爲簡單數據類型 –

相關問題