javascript中会转换值类型的函数和操作符

1.isNaN()

这个函数接受一个参数,该参数可以
是任何类型,而函数会帮我们确定这个参数是否“不是数值”。 isNaN() 在接收到一个值之后,会尝试
将这个值转换为数值。某些不是数值的值会直接转换为数值,例如字符串 "10" 或 Boolean 值。而任何
不能被转换为数值的值都会导致这个函数返回 true 。请看下面的例子:
alert(isNaN(NaN)); //true
alert(isNaN(10)); //false(10 是一个数值)
alert(isNaN("10")); //false(可以被转换成数值 10)
alert(isNaN("blue")); //true(不能转换成数值)

alert(isNaN(true)); //false(可以被转换成数值 1)

alert(isNaN("true")); //true(不可以被转换成数值 1)

null (空对象引用)和 undefined 没有 toString() 方法,所以 String()
函数就返回了这两个值的字面量要把某个值转换为字符串,可以使用加号操作符(3.5 节讨论)把它与一个字符
串( "" )加在一起。

2.Number()   用于任何数据类型

如果对非数值应用位操作符,会先使用 Number() 函数将该值转换为一个数值(自动完成),然后
再应用位操作。得到的结果将是一个数值。

var num1 = 25;
var num2 = -num1 - 1;(~num1)按位非

alert(num2);

(~ & | ^)

  如果是 Boolean 值, true 和 false 将分别被转换为 1 和 0。

  如果是数字值,只是简单的传入和返回。(会进行进制转换 Number(011) Number(0xf))
  如果是 null 值,返回 0。
  如果是 undefined ,返回 NaN 。
  如果是字符串,遵循下列规则:
  如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即 "1"
会变成 1, "123" 会变成 123,而 "011" 会变成 11(注意:前导的零被忽略了);
  如果字符串中包含有效的浮点格式,如 "1.1" ,则将其转换为对应的浮点数值(同样,也会忽
略前导零);
  如果字符串中包含有效的十六进制格式,例如 "0xf" ,则将其转换为相同大小的十进制整
数值;
  如果字符串是空的(不包含任何字符),则将其转换为 0;
  如果字符串中包含除上述格式之外的字符,则将其转换为 NaN 。
  如果是对象,则调用对象的 valueOf() 方法,然后依照前面的规则转换返回的值。如果转换
的结果是 NaN ,则调用对象的 toString() 方法,然后再次依照前面的规则转换返回的字符
串值

var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11

var num4 = Number(true); //1

Number("0x34")
52
Number(0x34)

52

Number("045")
45
Number(045)
37

一元加操作符(+) 一元减(-)的操作与 Number() 函数相同

在将一元减操作符应用于数值时,该值会变成负数(如上面的例子所示)。而当应用于非数值时,
一元减操作符遵循与一元加操作符相同的规则,最后再将得到的数值转换为负数

3. parseInt() 用于把字符串转换成数值

 parseInt() 函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字
符串前面的空格,直至找到第一个非空格字符。如果第一个字符不是数字字符或者正负号, parseInt()
就会返回 NaN ;也就是说,用 parseInt() 转换空字符串会返回 NaN ( Number() 对空字符返回 0)。如
果第一个字符是数字字符, parseInt() 会继续解析第二个字符,直到解析完所有后续字符或者遇到了
一个非数字字符。例如, "1234blue" 会被转换为 1234,因为 "blue" 会被完全忽略。类似地, "22.5"

会被转换为 22,因为小数点并不是有效的数字字符。var num1 = parseInt("1234blue"); // 1234
var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 10(十六进制数)
var num4 = parseInt(22.5); // 22
var num5 = parseInt("070"); // 56(八进制数) es3  es5的解析成70
var num6 = parseInt("70"); // 70(十进制数)
var num7 = parseInt("0xf"); // 15(十六进制数)

在 ECMAScript 5 JavaScript 引擎中, parseInt() 已经不具有解析八进制值的能力,因此前导的零会

被认为无效,从而将这个值当成 "70" ,结果就得到十进制的 70。

parseInt("af")
NaN
parseInt("af",16)

175

parseInt("0xaf")

175

指定基数会影响到转换的输出结果。例如:
var num1 = parseInt("10", 2); //2 (按二进制解析)
var num2 = parseInt("10", 8); //8 (按八进制解析)
var num3 = parseInt("10", 10); //10 (按十进制解析)
var num4 = parseInt("10", 16); //16 (按十六进制解析)

4.parseFloat() 用于把字符串转换成数值

 parseFloat() 也是从第一个字符(位置 0)开始解析每个字符。而且
也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。也就是说,字符串中的第
一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。举例来说,
"22.34.5" 将会被转换为 22.34。
除了第一个小数点有效之外, parseFloat() 与 parseInt() 的第二个区别在于它始终都会忽略前导
的零。 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

这3个函数对于同样的输入会有返回不同的结果

前置 ++ --  后置++ --

也就是它们不仅适用于整数,还可以用于字符串、布尔值、浮
点数值和对象。在应用于不同的值时,递增和递减操作符遵循下列规则。
  在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减 1 的操作。字
符串变量变成数值变量。
  在应用于一个不包含有效数字字符的字符串时,将变量的值设置为 NaN (第 4 章将详细讨论)。
字符串变量变成数值变量。
  在应用于布尔值 false 时,先将其转换为 0 再执行加减 1 的操作。布尔值变量变成数值变量。
  在应用于布尔值 true 时,先将其转换为 1 再执行加减 1 的操作。布尔值变量变成数值变量。
  在应用于浮点数值时,执行加减 1 的操作。
  在应用于对象时,先调用对象的 valueOf() 方法(第 5 章将详细讨论)以取得一个可供操作的
值。然后对该值应用前述规则。如果结果是 NaN ,则在调用 toString() 方法后再应用前述规
则。对象变量变成数值变量。执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。(在计算机科学领域,这种

情况通常被称作副效应。)

如果对非数值应用位操作符,会先使用 Number() 函数将该值转换为一个数值(自动完成),然后
再应用位操作。得到的结果将是一个数值。

以下示例展示了上面的一些规则:


按位非(~) 

var num1=10;~num==-num-1;//true

左移 

15*Math.pow(2,7)==15<<7

true

右移

有符号右移

64/Math.pow(2,5)==64>>5

true

无符号右移

无符号右移操作符由 3 个大于号(>>>)表示,这个操作符会将数值的所有 32 位都向右移动。对正
数来说,无符号右移的结果与有符号右移相同。仍以前面有符号右移的代码为例,如果将 64 无符号右
移 5 位,结果仍然还是 2:
var oldValue = 64; // 等于二进制的 1000000
var newValue = oldValue >>> 5; // 等于二进制的 10 ,即十进制的 2
UnsignedRightShiftExample01.htm
但是对负数来说,情况就不一样了。首先,无符号右移是以 0 来填充空位,而不是像有符号右移那
样以符号位的值来填充空位。所以,对正数的无符号右移与有符号右移结果相同,但对负数的结果就不一样了。其次,无符号右移操作符会把负数的二进制码当成正数的二进制码。而且,由于负数以其绝对
值的二进制补码形式表示,因此就会导致无符号右移后的结果非常之大,如下面的例子所示:
var oldValue = -64; //  等于二进制的 11111111111111111111111111000000
var newValue = oldValue >>> 5; // 等于十进制的 134217726
UnsignedRightShiftExample02.htm
这里,当对64 执行无符号右移 5 位的操作后,得到的结果是 134217726。之所以结果如此之大,
是因为64 的二进制码为 11111111111111111111111111000000,而且无符号右移操作会把这个二进制码当
成正数的二进制码,换算成十进制就是 4294967232。如果把这个值右移 5 位,结果就变成了

00000111111111111111111111111110,即十进制的 134217726。

逻辑运算符

!!可以模拟Boolean()

与逻辑与操作符相似,逻辑或操作符也是短路操作符。也就是说,如果第一个操作数的求值结果为

true ,就不会对第二个操作数求值了我们可以利用逻辑或的这一行为来避免为变量赋 null 或 undefined 值。例如:
var myObject = preferredObject || backupObject;
在这个例子中,变量 myObject 将被赋予等号后面两个值中的一个。变量 preferredObject 中包
含优先赋给变量 myObject 的值,变量 backupObject 负责在 preferredObject 中不包含有效值的情况下提供后备值。如果 preferredObject 的值不是 null ,那么它的值将被赋给 myObject ;如果
是 null ,则将 backupObject 的值赋给 myObject 。ECMAScript 程序的赋值语句经常会使用这种模式,

本书也将采用这种模式

ECMAScript 定义了 3 个乘性操作符:乘法、除法和求模。这些操作符与 Java、C 或者 Perl 中的相
应操作符用途类似,只不过在操作数为非数值的情况下会执行自动的类型转换。如果参与乘性计算的某
个操作数不是数值,后台会先使用 Number() 转型函数将其转换为数值。也就是说,空字符串将被当作

0,布尔值 true 将被当作 1。

switch 语句在比较值时使用的是全等操作符,因此不会发生类型转换(例如,
字符串 "10" 不等于数值 10)

chrome浏览器的Console 在一段时间内会销毁变量,垃圾收集


var obj = { showFunction: function(){ }}obj.showFunction() //this指向谁 objvar newObj = obj.showFunction;newObj() //this指向谁 window//随后粹不及防的问了我一下在js严格模式下 newObj()指向谁忘了当时怎么说的了,因为我没有测试过。回来查了一下,严格模式下this不会自动转换成window,默认为undefined。

作者:不爱写代码的程序员
链接:https://juejin.im/post/5aa24846f265da237e0950be
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值