2017-04-17 85 views
1

我聲明瞭一個函數,當給定一個字符串作爲參數時,返回一個對象,其中的鍵是字符串中的單詞。值是字符串中該單詞的出現次數。無法將變量聲明爲JavaScript中的對象屬性

當我運行下面的代碼時,我得到{}。

function countWords(string) { 
    var result = {}; 
    var words = string.split(' '); 
    for (var i = 0; i < words.length; i++) { 
    var currentElement = words[i]; 
    var prop = result[currentElement]; 
    if(prop) { 
     prop += 1; 
    } else { 
     prop = 1; 
    } 
    } 
    return result; 
} 

console.log(countWords('hello hello')); // => {'hello': 2} 

然而,隨着result[CurrentElement] = 1更換prop = 1返回預期的答案。

爲什麼在這種情況下使用prop = 1是錯誤的?

+2

'prop'僅僅是一個變量。如果將它分配給某個屬性,那麼編寫'prop = 1',您只需將'prop'重新定義爲'1'。你實際上並沒有觸及財產本身。 – Xufox

+0

可能重複的[是變量/對象傳遞的價值,爲什麼我不能改變對象的屬性與變量在JavaScript?](http://stackoverflow.com/questions/36865168/are-variables-objects-passed-by-價值和爲什麼-着,我變的對象屬性-W) – Xufox

回答

3

var prop = result[currentElement]; 這會將​​中的值複製到prop中,然後添加一個,但不會將其放回數組中。這項任務是按價值而不是參考。

0

在這一行:

var prop = result[currentElement]; 

要複製的​​值(顯然的數),然後遞增拷貝,從而個原始值(​​)保持相同。

0

因爲變量幾乎從來沒有通過引用與任何其他鏈接。

有2例當它以另一種方式:

  1. arguments在非嚴格模式。

    function f(a) { 
     
        console.log(a, arguments[0]); 
     
        a = 10; 
     
        console.log(a, arguments[0]); 
     
    } 
     
    
     
    function g(a) { 
     
        'use strict'; 
     
        console.log(a, arguments[0]); 
     
        a = 10; 
     
        console.log(a, arguments[0]); 
     
    } 
     
    
     
    f(7); 
     
    g(7);
    分配的

  2. 左側包括分解。

    var a = 8, b = 10; 
     
    console.log(a, b); 
     
    [a, b] = [b, a]; 
     
    console.log(a, b); 
     
    
     
    var x = [0, 1, 2]; 
     
    console.log(x.join(" ")); 
     
    [x[1], x[0], x[2]] = x; 
     
    console.log(x.join(" "));

1

您需要使用檢查和遞增參考對象。

result[currentElement] 
^^      object 
     ^^^^^^^^^^^^^^^^ property of object 

如果你剛剛得到它的值,你會得到一個原始值而不是對象的想要的引用。

value = result[currentElement] // undefined in the first call 
           //   1 in the second call 

但您沒有對結果的引用了。

function countWords(string) { 
 
    var result = {}; 
 
    var words = string.split(' '); 
 
    for (var i = 0; i < words.length; i++) { 
 
    var currentElement = words[i]; 
 
    if (result[currentElement]) { 
 
     result[currentElement] += 1; 
 
    } else { 
 
     result[currentElement] = 1; 
 
    } 
 
    } 
 
    return result; 
 
} 
 

 
console.log(countWords('hello hello')); // => {'hello': 2}

0

你需要將其添加在這樣的結果:

<script> 
    function countWords(string) { 
    var result = {}; 
    var words = string.split(' '); 
    for (var i = 0; i < words.length; i++) { 
    var currentElement = words[i]; 
    var prop = result[currentElement]; 
    if(prop) { 
     prop += 1; 
    } else { 
     prop = 1; 
    } 
    result[currentElement]=prop; 
    } 
    return result; 
} 

console.log(countWords('hello hello test khalil')); 
</script>