字符串与数组原型Javascript
我使用字符串和数组原型来添加方法。我只是想知道为什么在这个例子中我们需要使用字符串形式的return语句。在本例中,我使用return with array,但它只返回数组中的第一个元素。另外,当我使用return时,除非我将它们存储在新数组中,否则它不会在控制台中给出结果字符串与数组原型Javascript,javascript,Javascript,我使用字符串和数组原型来添加方法。我只是想知道为什么在这个例子中我们需要使用字符串形式的return语句。在本例中,我使用return with array,但它只返回数组中的第一个元素。另外,当我使用return时,除非我将它们存储在新数组中,否则它不会在控制台中给出结果 Array.prototype.u=function(){ 对于(i=0;i“我只想知道为什么在本例中需要在字符串中使用return语句。” 在JavaScript中,和其他语言一样,字符串是不可变的,您不能修改它的状态,只
Array.prototype.u=function(){
对于(i=0;i“我只想知道为什么在本例中需要在字符串中使用return语句。”
在JavaScript中,和其他语言一样,字符串是不可变的,您不能修改它的状态,只要返回一个新字符串并在需要时进行赋值即可
那么根据我上面的回答,
var st= "bingo"
st = st.u();
console.log(st)
“我只是想知道为什么在本例中需要使用字符串形式的return语句。”
在JavaScript中,和其他语言一样,字符串是不可变的,您不能修改它的状态,只要返回一个新字符串并在需要时进行赋值即可
那么根据我上面的回答,
var st= "bingo"
st = st.u();
console.log(st)
数组是通过引用传递的。因此,在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'
编辑:
多亏了raina77ow
请参阅以了解JS如何使用类似于'foo'.toUpperCase()
的东西,即使'foo'
绝对不是对象
'foo'['toUpperCase']()
转换为'foo'.toUpperCase()
。前者允许:
var方法='toUpperCase';
“foo”[method]();
数组是通过引用传递的。因此,在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'
编辑:
多亏了raina77ow
请参阅以了解JS如何使用类似于'foo'.toUpperCase()
的东西,即使'foo'
绝对不是对象
'foo'['toUpperCase']()
转换为'foo'.toUpperCase()
。前者允许:
var方法='toUpperCase';
“foo”[method]();
这里的关键点是,我想,数组(作为引用类型)和字符串(作为原语)在访问它们的属性时会得到不同的处理
对于前者,它相当直截了当:当你写这样的东西时
var arr = [];
arr.someMethod();
…调用someMethod
(如果在arr
原型链中找到),并将arr
对象作为其上下文(this
)提供
var str = '';
str.someMethod();
…这个
本身不是一个字符串-而是一个新的字符串
对象,它的原语值是存储在str
中的字符串。换句话说,它实际上是作为
var str = '';
new String(str).someMethod();
…这很容易检查:
String.prototype.foo = function() {
console.log(this);
};
str.foo(); // String {length:0}
现在,我想,很清楚为什么您必须在字符串中使用返回值。prototype
方法:新创建的对象在方法完成后立即被丢弃。这里的关键点,我想,是数组(作为引用类型)和字符串(作为原语)当您访问其属性时,将以不同的方式处理
对于前者,它相当直截了当:当你写这样的东西时
var arr = [];
arr.someMethod();
…调用someMethod
(如果在arr
原型链中找到),并将arr
对象作为其上下文(this
)提供
var str = '';
str.someMethod();
…这个
本身不是一个字符串-而是一个新的字符串
对象,它的原语值是存储在str
中的字符串。换句话说,它实际上是作为
var str = '';
new String(str).someMethod();
…这很容易检查:
String.prototype.foo = function() {
console.log(this);
};
str.foo(); // String {length:0}
现在,我想,很清楚为什么您必须在String.prototype
methods中使用返回值:新创建的对象在方法完成后立即被丢弃。对不起,这是一个相当糟糕的示例。您编写过arr=[1,2,3]吗
在第一个代码片段中,数组仍然保持不变。它根本没有解释使用带访问器符号的字符串方法时会发生什么。@raina77ow如果这个答案不符合标准,我很抱歉。1)arr=[1,2,3]
会将第一个元素1
更改为1
,那么更改将发生在哪里?2)访问器符号-表示str.foo或str[foo]?如果我误解了什么,我很抱歉。1)arr=[1,2,3]
而不是arr[0]=1
,在函数中;2)两者实际上都是-了解JS如何使用类似'foo'.toUpperCase()的东西很重要
即使'foo'
绝对不是一个对象。@raina77ow哦,我明白了。我试着让它保持简单。1)我想引用被覆盖了,所以不会影响原始内容。如果我错了,请纠正我。2)我将它链接到了你的答案……以及'foo'['toUpperCase']()
。很抱歉,这是一个相当糟糕的示例。如果您在第一个代码段中编写了arr=[1,2,3]
,数组将仍然保持不变。并且它根本没有解释当您将字符串方法与访问器n一起使用时会发生什么