我正在使用字符串和数组原型来添加方法。我只是想知道为什么我们需要在这个例子中使用字符串中的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)
答案 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
请参阅his answer以了解JS如何使用'foo'.toUpperCase()
之类的内容,即使'foo'
绝对不是对象。
'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
方法中的返回值:在方法完成后立即丢弃新创建的对象。