2013-06-22 3 views
5

[].valueOf() метод Retuns массив itself.According к этомуJavascript метод массива valueOf

document.write([["a"]],["b"]) 

должен вернуться [ «а»] б не так ли? Но это не происходит, он просто пишет ab .I просто хотел знать причину этого.

Для строковых элементов .ToString() возвращает это,

["a","b"].toString()//a,b 

Но для элементов с массивом он должен вернуть

[["a"],"b"].toString()//[a],b 
+0

Я думаю, что он использует 'toString()' not 'valueOf()' –

+0

, ваш образец edit возвращает 'a, b' и no, последний возвращает' a, b', потому что '[] .toString()' переводит все его элементы в строку перед конкатенацией - вложенные массивы будут рекристаллизованы. –

ответ

4

При передаче объекта document.write, JavaScript преобразует объект в строку с .ToString(). В этом случае Array.toString() будет сглаживаться и присоединяться к массиву с запятыми и возвращать его как строку.

["this", "is", "an", "array!"].toString(); // "this,is,an,array!" 
[["a",["b"]], ["c"]].toString() // "a,b,c" 

Мы можем расширить document.write([["a",["b"]], ["c"]]) в следующее:

var input = [["a",["b"]], ["c"], "d"]; 
Array.prototype.verboseToString = function verboseToString() { 
    // Make a copy of the array, so we don't destroy the original 
    var copy = this.slice(), i; 
    for (i = 0; i < copy.length; i++) { 
    // If this is an Array, call verboseToString() on it, and go deeper 
    if (copy[i] instanceof Array === true) { 
     copy[i] = copy[i].verboseToString(); 
    } 
    } 
    // copy contains non-arrays and we're ignoring other types' toString() output 
    return copy.join(','); 
} 
document.write(input.verboseToString()); // "a,b,c,d" 
+0

, но он только присоединяется к элементам массива. Но что, когда элемент является самим массивом. Мне просто хотелось, чтобы причина, по которой все методы js.toString() объединяет элементы массива, когда они являются строками, и это должно происходить одинаково, когда элементы являются массивом. Но этого не происходит. –

+0

Он сглаживает массив перед его присоединением. '[[" a ", [" b "]], [" c "]]' превращается в '[" a "," b "," c "]', который соединен как '" a, b, c "' – SpenserJ

+0

thank u, вот что я искал. Можем ли я объяснить, как js выравнивает исходный массив? –

1
document.write([["a"]]",",["b"]) 

написать получить неограниченное количество аргументов, разделенных запятыми, так что фактически ожидаемое поведение

Чтобы распечатать то, что вы хотите использовать:

document.write(["a","b"]) 

Таким образом, вы будете печатать массив, а не список массивов

+0

@ raam86 что будет использовать вызов метода valueOf() независимо от того, что он возвращает, метод toString() будет вызван снова –

+0

@Maizere Извините неправильно прочитал вопрос – raam86

+0

@AliBZ Я думаю, что это то, что он ищет – raam86

1

От docs

текст вы пишете разобран в структуру модели документа.

Итак, вы отправляете массив, который будет просто оценивать значения массива в строке, чтобы создать структуру документа, в которой [["a"]],["b"] имеет только текстовые значения.

Если вы сделаете это:

document.write(["<a>a</a>", "<a>b</a>"]) 

Вы можете видеть, что это создает 2 анкерных элементов, разделенных , поэтому его просто array.join(',')

или просто обеспечить это:

document.write(["<a>a</a>"], ["<a>b</a>"]) 

На этот раз он создаст 2 якоря, вы больше не видите запятую.

+0

вопрос не о необходимости комы, мне нужно знать, когда ["a", "b"]. ToString() называется возвратом 'ab', но он должен возвращать то же самое, когда [[" a "], «b»]. toString() он называется ie [[a]] b ' –

+0

@Maizere Я не говорю о запятой здесь. Я просто говорю вам, что он делает ... – PSL