Использовать
nds.indexOf(parseInt(el,10))
где nds
— массив, а el
— число (или должно быть числом)
Изменить:
Из msdn:
JavaScript — это язык со свободной типизацией, что означает, что вы не объявляете явно типы данных переменных. Во многих случаях JavaScript выполняет преобразования автоматически, когда они необходимы. Например, если вы добавляете число к элементу, состоящему из текста (строки), число преобразуется в текст.
И я предполагаю, что такое преобразование было причиной того, что indexOf
возвращает -1
, потому что один из ваших массивов содержал число, а другой - строку.
Например:
old_array = ["10", "20", "30"];
new_array = [10, 20, 30];
Ниже моя попытка ответить на ваши вопросы:
Почему indexOf() не работает?
Это работает, и я думаю, что это сработало и в вашем случае. Он возвращал -1
, когда строка el
, например "100"
, не была найдена в массиве чисел, например. nds=[100,200]
что верно. Потому что строка "100"
не совпадает с числом 100
.
Работает ли indexOf() со строками, массивами и т. д.?
Да, indexOf()
работает как с массивом (числом, строкой или любым объектом), так и со строкой. Но вы должны убедиться, что проверили те же типы.
Что делает parseInt()?
Чтобы избежать непреднамеренного сравнения числа со строкой, мы можем использовать parseInt()
, например, parseInt("123", 10)
возвращает число 123
.
Второй аргумент 10
называется основанием счисления. Число (от 2 до 36), представляющее используемую систему счисления.
Резюме:
> "javascript is awesome".indexOf('v')
2
> [10, 20, 30].indexOf("20")
-1
> [10, 20, 30].indexOf(20)
1
> [10, 20, 30].indexOf( parseInt("20", 10) )
1
> typeof (100)
number
> typeof ("100")
string
> typeof( parseInt( "100", 10))
number
> parseInt( "100", 10)
100
> parseInt("100", 2)
4
> parseInt(11.3, 10)
11
> parseInt(11.3, 2)
3
> [10.3, 11.3, 12.3, 11].indexOf( parseInt(11.3, 10) )
3
Чтобы увидеть все вышеперечисленное в действии:
проверьте приведенный ниже фрагмент кода, но помните о alert();
и console.log();
при его запуске.
function createChangeRecord( old_array, new_array ) {
var nds = new_array.slice( 0, new_array.length ); // this seems to be redundant
var el, idx, msg;
if ( old_array.length == new_array.length ) {
for ( var i=0; i<old_array.length; i++ ) {
el = old_array[i];
idx = nds.indexOf(el);
if ( idx != -1 ) {
msg = "Found: el: " + el + "; nds: " + nds + "; nds.indexOf(el): " + idx + "\n typeof el: " + (typeof el) + "; typepf nds[" + i + "]: " + (typeof nds[i]);
} else {
msg = "Not Found: el: " + el + "; nds: " + nds + "; nds.indexOf(el): " + idx + "\n typeof el: " + (typeof el) + "; typepf nds[" + i + "]: " + (typeof nds[i]);
}
console.log( msg );
alert( msg );
}
}
else {
var err = 'Array lengths are not same';
console.log( err );
alert( err );
}
}
// this will work
var old_array_g = [ 10, 20 ];
var new_array_g = [ 10, 20 ];
createChangeRecord( old_array_g, new_array_g );
// this will not work
var old_array_g = [ "10", "20" ];
var new_array_g = [ 10, 20 ];
createChangeRecord( old_array_g, new_array_g );
// Yes: indesOf works with strings too
var withStrings = "'javascript is awesome'.indexOf('v'): " + "javascript is awesome".indexOf('v');
console.log( withStrings );
alert( withStrings );
// parseInt() returns a number or say integer
var usingParse = "typeof(123): " + typeof( 123 ) + "; typeof( parseInt('123', 10) ): " + typeof ( parseInt('123', 10) ) + "; typeof ('123'): " + typeof('123');
console.log( usingParse );
alert( usingParse );
// parseInt() with base 2
var parseBase2 = "parseInt( '100', 2 ): " + parseInt('100', 2) + "; parseInt( '100' , 10): " + parseInt('100', 10);
console.log( parseBase2 );
alert( parseBase2 );
person
Ajeet Shah
schedule
20.10.2013
indexOf
не поддерживается во всех браузерах для массивов. См. документы MDN. - person epascarello   schedule 08.01.2013element
? Строка? DOM-узел? Число? - person epascarello   schedule 08.01.2013Array.slice()
без параметров, чтобы скопировать весь массив, а не передавать0
иlength
. - person Mathletics   schedule 09.01.2013