Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这个数字是字符串?_Javascript_Jquery_Cookies_Typeof - Fatal编程技术网

Javascript 为什么这个数字是字符串?

Javascript 为什么这个数字是字符串?,javascript,jquery,cookies,typeof,Javascript,Jquery,Cookies,Typeof,使用jquerycookies插件,我设置了一个cookie,其值是一个数字 $.cookie('xyz_id','1'); 我需要使用这个数字来获取HTML中元素的索引 var $curr = $.cookie('xyz_id'); var $el = $('#main li:eq($curr)'); $curr的输出为1。那么为什么typeOf()$curr显示为字符串而不是数字呢?我尝试使用parseInt()将其转换为数字,但失败。不确定发生了什么…引号将变量设置为字符串: '1'

使用jquerycookies插件,我设置了一个cookie,其值是一个数字

$.cookie('xyz_id','1');
我需要使用这个数字来获取HTML中元素的索引

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

$curr的输出为1。那么为什么typeOf()$curr显示为字符串而不是数字呢?我尝试使用parseInt()将其转换为数字,但失败。不确定发生了什么…

引号将变量设置为字符串:

'1'
var $el = $('#main li:eq(' + value + ')');
但是,在这种情况下,cookie实际上是字符串:

要读出一块饼干,你必须处理它 document.cookie作为字符串和搜索 对于某些字符(分号, 例如)和cookie名称

相反,要:

$.cookie('xyz_id', 1); // or, really, '1' would be the same
然后,在读回值时,使用
parseInt()
将其转换回数值

它应该创建一个数值

另外,
parseInt
应该可以(在合理范围内)从字符串中键入数字。见:

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

我认为您应该更改
$.cookie('xyz_id','1')
$.cookie('xyz_id',1),如果它仍然是一个字符串,可以使用eval()将其设置为数字

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

[x] 以上答案确实解决了将字符串保存到cookie而不是整数的问题。还可以将字符串强制转换为整数,反之亦然

parseInt('1'); //1
您可以检查是否确实使用
isNaN()创建了整数。

按照其他人的建议使用
parseInt(str,10)

在构建选择器时,还应使用字符串连接:

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

在一致性和代码可读性方面,最好只为jQuery对象使用
$something
变量名,而不是字符串或数字。

谢谢您的回答。我最初的困难是因为我没有正确地将parseInt()放在$curr变量中。嗯

但这很奇怪——我想知道为什么从第二个参数中删除引号仍然会返回字符串

$.cookie('xyz_id', 2);


两个都返回字符串。

事实上,这与您将数字字符串传递给jQuery cookie插件的事实关系不大,因为即使您传递了文本
1
,它也不会在很长时间内保持非字符串状态

Cookie值本质上作为字符串存储在内部。该值进入HTTP头并传递到最终用户的浏览器,因此与Javascript类型系统相去甚远

幸运的是,因为Javascript是动态类型的,所以这不重要。如果该值在表示法中为数字,则可以将其转换回数字类型:

var value = $.cookie('name');
alert(parseInt(value, 10)); // note: specify the radix!
尽管如此,我还是不想麻烦,因为您要将它直接连接回一个字符串:

'1'
var $el = $('#main li:eq(' + value + ')');
或者,要在现代浏览器中利用效率,您可以执行以下操作:

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

其中有一个线索:


Cookie名称/值对都是“字符串”。

使用parseInt()将格式如下的字符串转换为数字。只能在万不得已的情况下使用eval()。请始终在
parseInt
上使用基数参数。不这样做只是一种不好的做法
parseInt(“1”,10)
是正确的方法。是的,10将防止它意外地将字符串视为十六进制或八进制,但它不会阻止它删除包含数字和字符的字符串中的字符。因此,我不会说去掉10是一种不好的做法,而且它没有涵盖使用parseInt时可能出现的所有错误。这个函数有很多问题,包括基数参数并不能解决所有问题,这并不是一个好的理由来质疑你应该一直使用它。正如我在下面的另一个答案中所说的,始终将基数参数与
parseInt
一起使用,让Javascript猜测您试图解析的数字的基数是一种不好的做法。幸运的是,这是一个普遍的事实。ruby/js/python等语言也会有同样的问题。您可以始终使用firebug对输出进行console.log,并查看对象的类型。出于某种原因,从$.cookie的value参数中删除引号仍然将其作为字符串返回,不确定原因…@Jared:No。引号使
'1'
成为字符串,但这与cookie值始终作为字符串返回的原因没有直接关系。(然而,回溯是正确的。:D)@Tomalak-那么您是说document.cookie只返回字符串值?或者更好,永远不要使用$name。特别是如果你的后端是PHP(我曾经很难了解到…5000行经典javascript,然后再加上PHP和jQuery…urk)。哦,还有+1,确保使用parseInt的基数。感谢cookie的出色解释,它们不会返回字符串。它们确实会导致最终调用
$.cookie('xyz_id')
返回字符串
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));