2014-01-09 4 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

Также, спасибо за список методов мутаторов! –

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 обратный() метод изменяет массив на месте, но массив является лишь временным во всяком случае, так что это не что он изменен (в данном случае).

ПРИМЕЧАНИЕ: Персонаж - это просто причудливое слово, которое я использовал здесь для строки длиной 1 в JavaScript.

+0

Спасибо за решение! Единственная причина, по которой я переместил его в массив, - это то, что вы не можете вызвать обратное значение в строке, как в Ruby. ^^ Я знал, что это измененная функция , Я мог бы подумать иначе: O То, что вы предоставили, кажется более логичным, хотя даже если реверс не является изменяемой функцией.^^ –

+0

Однако все же выполняются те же операции. Разница только в том, что указывает ваша первая переменная. – Tibos

+0

Да, я понимаю, что вы говорите. Это тонкая разница, но в этом случае очень важна! –

Смежные вопросы