2014-01-09 516 views
1

我最近開始學習JavaScript,並在變量命名時遇到了一些問題。例如,這是我通常會在Ruby中執行的操作:Javascript設置一個變量等於另一個變量

no_spaces = 'the gray fox'.gsub(/\s/, '') 
=> "thegrayfox" 
reversed = no_spaces.reverse() 
=> "xofyargeht" 

no_spaces 
=> "thegrayfox" 
reversed 
=> "xofyargeht" 

但是,同樣的事情在JavaScript中不起作用。這裏是發生了什麼:

var noSpaces = 'the gray fox'.replace(/\s/g, '').split('') 
noSpaces 
=> [ 't', 'h', 'e', 'g', 'r', 'a', 'y', 'f', 'o', 'x' ] 
var reversed = noSpaces.reverse().join('') 

noSpaces 
=> [ 'x', 'o', 'f', 'y', 'a', 'r', 'g', 'e', 'h', 't' ] 
reversed 
=> 'xofyargeht' 

這裏,似乎reverse()是罪魁禍首,但它很可能與其他功能發生。在我的代碼中有沒有問題,我沒有意識到,或者這只是一個關於JS的怪異?

回答

8

reverse是一種變異方法,所以它的紅寶石等價物將是reverse!,而不是reverse。爲了保持原來的數組,你必須首先克隆它:

> noSpaces = 'the gray fox'.replace(/\s/g, '').split('') 
["t", "h", "e", "g", "r", "a", "y", "f", "o", "x"] 
> reversed = noSpaces.slice(0).reverse() 
["x", "o", "f", "y", "a", "r", "g", "e", "h", "t"] 
> noSpaces 
["t", "h", "e", "g", "r", "a", "y", "f", "o", "x"] 

這裏是所有的數組賦值函數方法上MDN所列:

* pop() 
* push() 
* reverse() 
* shift() 
* sort() 
* splice() 
* unshift() 

所有其他陣列方法是訪問器。

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse –

+0

啊,這樣做更有意義。 (:我想我只是習慣於Ruby對大多數普通方法有獨立的爆炸方法^^ 感謝您的領導和簡單的解決方法!:D –

+0

另外,感謝您的增變器方法列表!Green check has已經給出了 –

2

MDN是一個非常好的資源這裏:

反向方法調換主叫陣列對象的元素來代替,突變該陣列,並返回到數組的引用。

您需要閱讀文檔並確保您瞭解它們的工作方式。

+0

聽起來像是一個計劃c:我想我只是習慣了Ruby,在那裏有功能和爆炸對手(反向和反向!)。很高興知道我必須保持警惕並注意這是可變的,哪些不是! –

1

你做了不同的一件事是你初始化你的第一個變量。在Ruby中,您初始化爲一個您從中刪除空格的字符串。在JavaScript中,您將它初始化爲您從中刪除空格的字符串中的一組字符。

正確的JavaScript的解決辦法是:

var noSpaces = 'the gray fox'.replace(/\s/g, '') 
noSpaces 
=> "thegrayfox" 
var reversed = noSpaces.split('').reverse().join('') 

noSpaces 
=> "thegrayfox" 
reversed 
=> 'xofyargeht' 

實際上,如thg435指出的那樣,JavaScript的反向()方法改變以代替陣列,但陣列只是暫時的,無論如何,所以它不重要的是它被改變了(在這種情況下)。

注意:字符只是一個奇特的詞,我在這裏用於JavaScript中長度爲1的字符串。

+0

感謝您的解決方案!我首先將它移動到數組的唯一原因是因爲您不能像在Ruby中那樣對字符串進行反轉^^如果我知道它是一個可變函數,否則我可能會有其他想法:O 儘管您提供的內容看起來更符合邏輯,即使反向並不是可變函數。^^ –

+0

儘管如此,仍然執行相同的操作。區別在於你的第一個變量指向什麼。 – Tibos

+0

是的,我確實知道你在說什麼。這是一個微妙的差異,但在這種情況下非常重要! –

相關問題