每日十条JavaScript经验技巧(二)

1. 非数值类型转数值

使用Number()转换时:

undefined会转为NaN

如果字符串以0开始,浏览器会忽略前导0,不会按照八进制进行转换

如果字符串以0x开始,浏览器会按照十六进制转化为十进制返回

如果字符串有字符,除(+,-,.)外都会转为NaN,十六进制时,字符串包含任何非数字字符都返回NaN

如果是对象转换,则对象先使用valueof(),然后按照规则转换。如果无valueOf方法,则调用toString方法,再转换。

使用parseInt()转换时:

parseInt会忽略前导空格,直到第一个非空字符开始解析,如果为非数字或正负号,则返回NaN。如果为数字则一直解析到第一个非数字为止。注:在parseInt中小数点不是有效的数字字符

parseInt能识别十进制,八进制和十六进制,但是在解析八进制时,ECMAScript 3 和ECMAScript 5存在分歧,ECMAScript 3会将070转化为56,但是ECMAScript 5会转换为70。

使用parseInt的第二个参数

var num1 = parseInt("10",2); //2 按二进制解析 var num2 = parseInt("10",8); //8 按八进制解析 var num3 = parseInt("10",10); //10 按十进制解析 var num4 = parseInt("10",16); //16 按十六进制解析

使用parseFloat()转换时:

parseFloat和parseInt的第一个区别在于它在解析字符串是是遇到一个无效的浮点数值字符为止,比parseInt多了.
解析十六进制数值时返回0

var num = parseFloat("0xA"); //0 var num = parseInt("0xA"); //10

parseFloat函数没有第二个可以指定基数的参数,所以只解析十进制值。
如果字符串是个整数,则返回整数而不是浮点数
var num = parseFloat("2.125e7");  //31250000

2. 使用toString()输出不同进制的数值

此条适用于整数,我们可以用toString()返回任意进制的整数。

var num = 10; alert(num.toString()); //"10" alert(num.toString(9)); //"11" alert(num.toString(16)); //"a"

3. 位操作符时注意NaN和Infinity

在对NaN和Infinity使用位操作符时,这两个数值都会被当成0来处理。 如果对于非数值应用位操作符,会先使用Number()函数将该值转换为一个数值。

还有一点要注意的就是负数的无符号右移,无符号右移是以0来填充空位,而不像有符号右移以符号位填充空位,所以对正数的无符号右移和有符号右移结果相同,但对负数就不同了。无符号右移操作会把负数的二进制码当成正数的二进制码,而且负数是以补码形式表示,因此会导致无符号右移后的结果相差非常大。

var oldValue = -64; var newValue = oldValue >>> 5

4. 特殊的数值运算

对于数值运算,如果有一个操作数为NaN,则结果为NaN。
对非数值应用使用一元加操作或减操作(+,-,正负号),如果该值无法转换为数值(使用Number()方式转换),则返回NaN。

var s1 = "01", s2 = "1.1", s3 = "z", b = false, o = { valueOf: function(){ return -1; } }; s1 = +s1; //1 +改为-: -1 s2 = +s2; //1.1 -1.1 s3 = +s3; //NaN NaN b = +b; //0 0 o = -o; //-1 1

Infinity和0相乘等于NaN,和非0数相乘为Infinity和-Infinity,取决于乘数的正负号。Infinity和Infinity相乘等于Infinity。

var num1 =Infinity, num2 = 0, num3 = -2 ,num4 = -Infinity; alert(num1 * num2); //NaN alert(num1 * num3); //-Infinity alert(num1 * num4); //-Infinity

零除零为NaN,非零数除以零为Infinity或-Infinity。Infinity除以Infinity为NaN
对于取模运算,下面等式成立:

Infinity%2=NaN; 2%-Infinity=2; 0%Infinity=0; //只要被除数为0,除数不为NaN,结果都为0 Infinity%0=NaN; //被除数可以为任意数,除数只要为0,结果都为NaN Infinity%Infinity=NaN

加法运算:如果两个操作数都是字符串则+变为字符串连接。如果一个为字符串,一个为数值,将数值转换为字符串,然后连接字符串,如果一个操作数是对象,布尔值则先调用它们的valueOf方法,如无,在调用toString方法。再根据返回值类型,判断+号应该连接字符串还是相加。

Infinity + -Infinity = NaN; var p = { valueOf: function () { return -1; } }; var num =1; var result = num +p; alert(result); // 0 相加 var p = { valueOf: function () { return "not a num"; } }; var num =1; var result = num +p; alert(result); //1not a num 字符串连接

减法运算:减法运算和加法运算十分相似,关于对象的处理也是一样,所以不再说明。

Infinity - Infinity = NaN; -Infinity - -Infinity = NaN;

5. 关系操作符的使用

关系操作符就是小于(<)、大于(>)、小于等于(<=)和大于等于(>=)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzsjyd.html