js各种数据类型

var num = parseInt("0xAF", 16); //175
实际上,如果指定了16 作为第二个参数,字符串可以不带前面的"0x",如下所示:
var num1 = parseInt("AF", 16); //175
var num2 = parseInt("AF"); //NaN

parseFloat()可以识别前面讨论过的所有浮点数值格式,也包括十进制整数格式。但十六进制格式的字符串则始终会被转换成0。由于parseFloat()只解析十进制值,因此它没有用第二个参数指定基数的用法。最后还要注意一点:如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是零),parseFloat()会返回整数。以下是使用parseFloat()转换数值的几个典型示例。

var num1 = parseFloat("1234blue"); //1234 (整数)
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5
var num4 = parseFloat("22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5
var num6 = parseFloat("3.125e7"); //31250000

操作符

1.一元操作符

1.1自增自减

var s1 = "2";
var s2 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function() {
return -1;
}
};
s1++; // 值变成数值3
s2++; // 值变成NaN
b++; // 值变成数值1
f--; // 值变成0.10000000000000009(由于浮点舍入错误所致)
o--; // 值变成数值-2

1.2一元加和减操作符
一元加

  var s1 = "01";
    var s2 = "1.1";
    var s3 = "z";
    var b = false;
    var f = 1.1;
    var o = {
    valueOf: function() {
    return -1;
    }
    };
    s1 = +s1; // 值变成数值1
    s2 = +s2; // 值变成数值1.1
    s3 = +s3; // 值变成NaN
    b = +b; // 值变成数值0
    f = +f; // 值未变,仍然是1.1
    o = +o; // 值变成数值-1

一元减

var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function() {
return -1;
}
};
s1 = -s1; // 值变成了数值-1
s2 = -s2; // 值变成了数值-1.1
s3 = -s3; // 值变成了NaN
b = -b; // 值变成了数值0
f = -f; // 变成了-1.1
o = -o; // 值变成了数值1

位操作符

1. 按位非(NOT)

`var num1 = 25; // 二进制0000000000000000000000000001100`1
var num2 = ~num1; // 二进制11111111111111111111111111100110
alert(num2); // -26

这里,对25 执行按位非操作,结果得到了.26。这也验证了按位非操作的本质:操作数的负值减1。因此,下面的代码也能得到相同的结果:

 var num1 = 25;
    var num2 = -num1 - 1;
alert(num2); // "-26"

虽然以上代码也能返回同样的结果,但由于按位非是在数值表示的最底层执行操作,因此速度更快。

2按位与(AND)
下面看一个对25 和3 执行按位与操作的例子:

var result = 25 & 3;
alert(result); //1

可见,对25 和3 执行按位与操作的结果是1。为什么呢?请看其底层操作:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011

AND = 0000 0000 0000 0000 0000 0000 0000 0001

3. 按位或(OR)
4. 按位异或(XOR)

var result = 25 ^ 3;
alert(result); //26

5. 左移
左移操作符由两个小于号(<<)表示,这个操作符会将数值的所有位向左移动指定的位数。例如,
如果将数值2(二进制码为10)向左移动5 位,结果就是64(二进制码为1000000),代码如下所示:

var oldValue = 2; // 等于二进制的10
var newValue = oldValue << 5; // 等于二进制的1000000,十进制的64

注意,左移不会影响操作数的符号位。换句话说,如果将2 向左移动5 位,结果将是64,而非64。

6有符号的右移
有符号的右移操作符由两个大于号(>>)表示,但保留符号位(即
正负号标记)

var oldValue = 64; // 等于二进制的1000000
var newValue = oldValue >> 5; // 等于二进制的10 ,即十进制的2

7. 无符号右移
无符号右移操作符由3 个大于号(>>>)表示,这个操作符会将数值的所有32 位都向右移动。对正数来说,无符号右移的结果与有符号右移相同。仍以前面有符号右移的代码为例,如果将64 无符号右移5 位,结果仍然还是2:

var oldValue = 64; // 等于二进制的1000000
var newValue = oldValue >>> 5; // 等于二进制的10 ,即十进制的2

但是对负数来说,情况就不一样了。首先无符号右移是以0 来填充空位,而不是像有符号右移那样以符号位的值来填充空位。所以,对正数的无符号右移与有符号右移结果相同,但对负数的结果就不一样了。其次,无符号右移操作符会把负数的二进制码当成正数的二进制码。而且,由于负数以其绝对值的二进制补码形式表示,因此就会导致无符号右移后的结果非常之大,如下面的例子所示:`

var oldValue = -64; // 等于二进制的11111111111111111111111111000000
var newValue = oldValue >>> 5; // 等于十进制的134217726

布尔操作符

布尔操作符一共有3 个:非(NOT)、与(AND)和或(OR)。
1. 逻辑非
逻辑非操作符由一个叹号(!)表示,可以应用于ECMAScript 中的任何值。无论这个值是什么数据类型,这个操作符都会返回一个布尔值。逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再对其求反。

2. 逻辑与
逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值;此时,它遵循下列规则

   如果第一个操作数是对象,则返回第二个操作数;
 如果第二个操作数是对象,则只有在第一个操作数的求值结果为true 的情况下才会返回该对象;
 如果两个操作数都是对象,则返回第二个操作数;
 如果有一个操作数是null,则返回null;
 如果有一个操作数是NaN,则返回NaN;
 如果有一个操作数是undefined,则返回undefined。

来看下面的例子:

var found = true;
var result = (found && someUndefinedVariable); // 这里会发生错误
alert(result); // 这一行不会执行

在上面的代码中,当执行逻辑与操作时会发生错误,因为变量someUndefinedVariable 没有声明。由于变量found 的值是true,所以逻辑与操作符会继续对变量someUndefinedVariable 求值。
someUndefinedVariable 尚未定义,因此就会导致错误。这说明不能在逻辑与操作中使用未定义的值。如果像下面这个例中一样,将found 的值设置为false,就不会发生错误了:

var found = false;
var result = (found && someUndefinedVariable); // 不会发生错误
alert(result); // 会执行("false")

3. 逻辑或

与逻辑与操作相似,如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值;此时,它遵循下列规则:

   如果第一个操作数是对象,则返回第一个操作数;
 如果第一个操作数的求值结果为false,则返回第二个操作数;
 如果两个操作数都是对象,则返回第一个操作数;
 如果两个操作数都是null,则返回null;
 如果两个操作数都是NaN,则返回NaN;
 如果两个操作数都是undefined,则返回undefined

猜你喜欢

转载自blog.csdn.net/weixin_38547641/article/details/88976972
今日推荐