Heim  >  Artikel  >  Backend-Entwicklung  >  Problem mit dem Javascript-Bereich

Problem mit dem Javascript-Bereich

WBOY
WBOYOriginal
2016-12-01 00:56:32817Durchsuche

PHP-Code:

<code><?php
$key = [1,2];
function add($key){
    array_push($key,'dddss');
    print_r($key);
}
add($key);
print_r($key);</code>

Ausgabe

<code>Array
(
    [0] => 1
    [1] => 2
    [2] => dddss
)
Array
(
    [0] => 1
    [1] => 2
)
</code>

JS-Code:

<code>var $key = [1,2];
function addkey($key){
    let hello = $key;
    hello.push(9)
    console.log(hello)
    console.log($key)
}
addkey($key)
console.log($key)</code>

Ausgabe:

<code>[ 1, 2, 9 ]
[ 1, 2, 9 ]
[ 1, 2, 9 ]       
</code>

Was ich möchte, ist, dass die Verarbeitung innerhalb der Funktion die Ergebnisse außerhalb der Funktion nicht beeinflusst, was den Ergebnissen von PHP ähnelt. Ich möchte auch den Grund wissen

Antwortinhalt:

PHP-Code:

<code><?php
$key = [1,2];
function add($key){
    array_push($key,'dddss');
    print_r($key);
}
add($key);
print_r($key);</code>

Ausgabe

<code>Array
(
    [0] => 1
    [1] => 2
    [2] => dddss
)
Array
(
    [0] => 1
    [1] => 2
)
</code>

JS-Code:

<code>var $key = [1,2];
function addkey($key){
    let hello = $key;
    hello.push(9)
    console.log(hello)
    console.log($key)
}
addkey($key)
console.log($key)</code>

Ausgabe:

<code>[ 1, 2, 9 ]
[ 1, 2, 9 ]
[ 1, 2, 9 ]       
</code>

Was ich möchte, ist, dass die Verarbeitung innerhalb der Funktion die Ergebnisse außerhalb der Funktion nicht beeinflusst, was den Ergebnissen von PHP ähnelt. Ich möchte auch den Grund wissen

let hello = $key.slice();

Ihr Funktionsparameter ist ein Array und Arrays werden als Referenz in js übergeben. . Wenn Sie „let inside“ in einer Funktion verwenden, um einer anderen Variablen einen Verweis auf ein Array zuzuweisen. Tatsächlich verweisen sowohl hello als auch $key gleichzeitig auf einen Wert, der in diesem Fall ein Array der Länge 2 ist. Wenn Sie also eine Push-Operation oder eine andere Operation für eine Variable ausführen, wird tatsächlich der Wert geändert, auf den beide Variablen gleichzeitig zeigen.

PHPs standardmäßiger eingehender Parameter ist eine Kopie, keine Referenz, aber JS übergibt immer eine Referenz, sodass Sie nur eine darin kopieren müssen, um sie zu ändern

<code class="javascript">var $keys = [1, 2];
function addkey($keys) {
    // 拷贝一份
    let hello = [].concat($keys);
    hello.push(9);
    console.log(hello);
    console.log($keys);
}
addkey($keys);
console.log($keys);</code>

Das Problem liegt in der Weitergabe durch Referenz. Eigentlich wird er in PHP erscheinen.

<code>$obj = new stdClass();
$obj->name = 'aa';
function change($o) {
    $o->name = 'bb';
}
change($obj);
echo $obj; // 'bb'</code>

Der Unterschied besteht darin, dass js-Arrays auch Objekte sind und auch als Referenz übergeben werden. Sie können nach „Objekt klonen“ suchen. Die Antwort auf diese Frage wurde oben gegeben.

Wenn PHP eingehende Parameter verwendet, bedeutet das Hinzufügen von & die Übergabe als Referenz, was dasselbe ist, als wenn Ihr JS-Code ausgeht

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn