字符串与数组原型Javascript

时间:2014-03-28 06:58:04

标签: javascript

我正在使用字符串和数组原型来添加方法。我只是想知道为什么我们需要在这个例子中使用字符串中的return语句。我在这个例子中使用了返回数组,但它只返回数组中的第一个元素。此外,当我使用return时,除非我将它们存储在新数组中,否则它不会在控制台中给出结果。 fiddle

Array.prototype.u= function(){

   for(i=0; i<this.length;i++){
      this[i]= this[i].toUpperCase();
   }
}

var ar= ['a','b','c','d','e','f']
ar.u()
console.log(ar)

String.prototype.u= function (){
   return this.toUpperCase();
}

var st= "bingo"
st.u();
console.log(st)

3 个答案:

答案 0 :(得分:2)

“我只是想知道为什么我们需要在这个例子中使用字符串中的return语句。”

在JavaScript中,与其他语言一样,String是不可变的,你不能修改它的状态,你只需要返回一个新字符串并在需要时进行赋值。

所以,基于我的上述答案

var st= "bingo"
st = st.u();
console.log(st)

答案 1 :(得分:2)

数组是通过引用传递的。因此,在Array.prototype中,您执行的任何操作都会导致对原始数组进行更改。

但是,字符串,数字,布尔值都是按价值传递的。您所做的任何更改都不会反映在原始变量中。这就是为什么要使代码正常工作,请使用:

var st= "bingo"
st = st.u(); // assign result of calling `.u` to `st`

您要更改字符串的副本,然后返回分配给st(原始)的结果。是的,字符串是不可改变的。

进一步的例子:

function change(arr){
    // arrays are pass-by-reference, so `arr` refers to the original array passed,
    // and any change in `arr` reflects in the passed array
    arr[0] = 1; // mutation
}

var array = [2, 3, 4];
change(array);  
console.log(array); // [1, 3, 4]

function change2(string){
    // strings are pass-by-value, so `string` does not refer to the original string passed, but is just a copy of the value of the original string
    // and any change in `string` does not reflect in the passed string
    string = '345';
}

var str = '999';
change(str);
console.log(str); // '999'

<强> Demonstration

修改

感谢raina77ow

  1. 请参阅his answer以了解JS如何使用'foo'.toUpperCase()之类的内容,即使'foo'绝对不是对象。

  2. 'foo'['toUpperCase']()转换为'foo'.toUpperCase()。前者允许这样做:

    var method = 'toUpperCase'; 'foo'[method]();

答案 2 :(得分:2)

我想,关键点在于,当您访问其属性时,数组(作为引用类型)和字符串(作为基元)将被区别对待。

对于前者,它相当直接:当你写这样的东西时......

var arr = [];
arr.someMethod();
调用

... someMethod(如果在arr原型链中找到),并提供arr对象作为其上下文(this)。但是这里......

var str = '';
str.someMethod();

... this本身不是字符串 - 而是 String 对象,原始值是存储在str中的字符串。换句话说,它实际上被执行为......

var str = '';
new String(str).someMethod();

......这很容易检查:

String.prototype.foo = function() { 
  console.log(this);
};
str.foo(); // String {length:0} 

现在,我想,很明显为什么你必须使用String.prototype方法中的返回值:在方法完成后立即丢弃新创建的对象。