字符串与数组原型Javascript

字符串与数组原型Javascript,javascript,Javascript,我使用字符串和数组原型来添加方法。我只是想知道为什么在这个例子中我们需要使用字符串形式的return语句。在本例中,我使用return with array,但它只返回数组中的第一个元素。另外,当我使用return时,除非我将它们存储在新数组中,否则它不会在控制台中给出结果 Array.prototype.u=function(){ 对于(i=0;i“我只想知道为什么在本例中需要在字符串中使用return语句。” 在JavaScript中,和其他语言一样,字符串是不可变的,您不能修改它的状态,只

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

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一起使用时会发生什么