Почему это число строка? - PullRequest
2 голосов
/ 23 мая 2011

Используя плагин jQuery Cookies, я устанавливаю cookie, значением которого является число.

$.cookie('xyz_id','1');

Мне нужно использовать это число, чтобы получить индекс элемента в моем HTML.

var $curr = $.cookie('xyz_id'); 
var $el = $('#main li:eq($curr)');

Выходные данные $ curr равны 1. Так почему typeOf () $ curr отображается как строка вместо числа? Мои попытки преобразовать его в число с помощью parseInt () не увенчались успехом. Не уверен, что происходит ....

Ответы [ 6 ]

10 голосов
/ 23 мая 2011

Кавычки превращают переменную в строку:

'1'

Однако в этом случае файлы cookie по сути являются строками:

Для считывания файла cookie необходимо обработать документ.cookie в виде строки и поиска определенных символов (например, точек с запятой) и имени cookie.

http://www.quirksmode.org/js/cookies.html

Вместо этого выполните:

$.cookie('xyz_id', 1); // or, really, '1' would be the same

Затем при чтении значения обратно приведите его к числовому значению, используя parseInt().

var xyz_id = parseInt($.cookie('xyz_id'));

Что должно создать числовое значение.

Кроме того, parseInt следуетработа (в пределах разумного) для типизации числа из строки.См .:

var i = "1";
alert(typeof i);
i = parseInt(i);
alert(typeof i);

http://jsfiddle.net/CqBw6/

2 голосов
/ 23 мая 2011

Используйте parseInt(str,10), как предлагали другие.

Вы также должны использовать конкатенацию строк при создании селектора:

var $el = $('#main li:eq('+$curr+')');

Рекомендуется также для согласованности и читабельности кода использовать $something имена переменных только для объектов jQuery, а не для строк или чисел.

1 голос
/ 23 мая 2011

На самом деле это очень мало связано с тем, что вы передали числовую строку плагину cookie jQuery, потому что даже если вы передали литерал 1, он не будет иметь очень долго оставался без струн!

Значения cookie хранятся внутри, по сути, в виде строк. Это значение входит в заголовки HTTP и проходит через браузер конечного пользователя и, как таковое, далеко от системы типов Javascript.

К счастью, поскольку Javascript динамически типизирован, это не должно иметь значения. Если значение является числовым в представлении, вы можете преобразовать его обратно в числовой тип:

var value = $.cookie('name');
alert(parseInt(value, 10)); // note: specify the radix!

Тем не менее, я бы не стал беспокоиться, так как вы собираетесь объединить его обратно в строку:

var $el = $('#main li:eq(' + value + ')');

Или, чтобы использовать эффективность в современных браузерах, вы можете сделать:

var $el = $('#main li').eq(parseInt(value, 10)); // I recommend this version

Есть подсказка в источнике плагина :

document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');

и

cookieValue = decodeURIComponent(cookie.substring(name.length + 1));

Все пары «имя файла / значение» являются «строками».

0 голосов
/ 23 мая 2011

Спасибо за ответы.Моя первоначальная трудность была связана с тем, что я неправильно поместил parseInt () в переменную $ curr.duh.

Странно, хотя - интересно, почему удаление кавычек из второго параметра по-прежнему возвращает строку.

$.cookie('xyz_id', 2);

или

$.cookie('xyz_id', '2');

обе возвращают строки.

0 голосов
/ 23 мая 2011

Ответы выше действительно решают проблему сохранения строки в cookie вместо целого числа.Вы также можете привести строки в целые числа и наоборот.

parseInt('1'); //1

Вы можете проверить, действительно ли целое число создано с помощью isNaN()

var n = parseInt('1');
if( !isNaN( n ) ){
  //Horray we have an integer
}
0 голосов
/ 23 мая 2011

Я думаю, вам следует изменить $.cookie('xyz_id','1'); на $.cookie('xyz_id',1);, и если это все еще строка, вы можете использовать eval (), чтобы сделать его числом.

[х]

...