2012-10-15 97 views
2

我有一个按钮,在后面的代码中我添加了一个onclick,并且我传递了一个将传递给js函数的唯一ID。该ID以0以0开头的Javascript提醒号码

它不工作开始,最终我想通了,数,ID,它是通过错了...

IE浏览器。看到这个:js fiddle

它与数字的开头和结尾的'一起工作。只是想知道为什么013变成11.我做了一些谷歌搜索,但没有找到任何东西...

干杯

罗宾

编辑:

谢谢你们。是的,现在明白了。

正如在这种情况下,0在开始时有一个含义,这里是邮件列表中的收件人ID,我将使用'013'而不仅仅是013,即一个字符串。然后,我可以在js中拆分这些值,因为这三个值中的每一个代表了一个不同的id,它总是只有1个字符长,即0-9。

回答

8

与一个0被视为一个八进制数开始数字文字等于11。因此,基数8中的13是基数10中的11 ...

八进制数字文字已被弃用,但如果您不处于严格模式,仍然有效。

(您没有问,但是)以0x开头的数字文字被视为十六进制。

更多信息在MDN

在您的演示中,该参数被称为id,这意味着您不需要对其执行数字操作 - 如果是这样,请将其放在引号中并将其用作字符串。

如果您需要能够传递前导零但仍然将数字视为基数10来对其执行数字操作,则可以将其用引号括起来以将其作为字符串传递,然后将字符串转换为数字在某种程度上部队基地10,如:

something('013'); 

function something(id){  
    alert(+id);    // use unary plus operator to convert 
    // OR 
    alert(parseInt(id,10)); // use parseInt() to convert   
} 

演示:http://jsfiddle.net/XYa6U/5/

+0

Javascript不会将'08'视为一般的八进制,只有'parseInt'。其他将字符串转换为数字的方法也很好,例如, 'Number('08')','+('08')','1 *'08''全部返回'8',而'parseInt('08')'返回'0'。将前导零表示为八进制是可选的,但大多数浏览器似乎仍在继续实现它。 – RobG

+0

@RobG看到我的小提琴:[https://jsfiddle.net/Lc9ktzn1/](https://jsfiddle.net/Lc9ktzn1/)parseInt将数字解析为基数10,无论如何。同样在那个小提琴上 - 如果一个数字有8个,即使它以0开始,它也不能被解释为基数8,所以javascript将其作为基数10。 – Jan

+0

@ Jan - 这是2012年的规格从那以后发生了变化。虽然ES5在2011年6月成为标准,但大多数浏览器都不符合标准,并且在一段时间内继续遵循ECMA-262的八进制数字行为。但是,现在ECMA-262第6版是规范,看起来现代浏览器至少符合规范。但是仍然有一个很好的数字,其中前导'0'表示parseInt的八进制数。 ;-) – RobG

2

013是八进制,十进制不,它在十进制

+0

所以我需要始终传递一个以1-9开头的数字才有效?即得到我想要的号码? –

+1

或者你可以使用'parseInt(num,10)' – jahroy

+0

是的,就像@jahroy说的那样,parseInt('013',10)将会返回13 –

0

你应该注意到,013开始用0。在Javascript中,这会导致数字被认为是八进制数。一般来说,你会想要使用十进制和十六进制数字系统。偶尔,八进制数是有用的,因为this question shows.

我希望这有助于! :)

0

如果数字的第一个数字是零,parseInt会将该数字解释为八进制数。

您可以指定十个这样的基地:

parseInt(numberString, 10)

你也可以删除这些零用这样的正则表达式(其结果将是一个字符串):

numberString.replace(/^0+/g, '');

+0

JavaScript不会将前导零解释为八进制,只有'parseInt'。 – RobG