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

是的,我确实知道你在说什么。这是一个微妙的差异,但在这种情况下非常重要! –

相关问题