JS基础之类型转换

JS基础之类型转换

js中的类型转化有两种,显式类型转换和隐式类型转换。在隐式类型转换之前,我们需要先了解显式类型转换,因为隐式类型转换是基于显式类型转换的。

JS中的显式类型转化:

1. 强制类型转换
ES中规定了可以使用强制类型转换来处理转换值的类型。使用强制类型转换可以访问特定的值。ES中可用的强制类型转换方法有三种:

  • Number(value)-----把给定值的值转换成数字类型
  • String(value)-----把给定的值转换成字符串类型
  • Boolean(value)-----把给定的值转换成布尔型

Number(value): Number(value)只能将特定的值转化成数字,跟数字无关的值返回结果就是NaN。例如

var result = Number("123")   //123
var result1 = Number("123px")   //NaN
var result2 = Number(null)  //0
var result3 = Number(undefined) //NaN
var result4 = Number("a")   //NaN
var result5 = Number("1.2")  //1.2
var result6 = Number("1.2.3")   //NaN
var result7 = Number("true")    //1
var result8 = Number("false")   //0
var result9 = Number("")  //0

对象类型进行数据类型转换时,会先调用自身的valueOf()和toString()方法,valueOf()和toString()方法是在Object.prototype上定义的,也就是说所有的对象上都会继承到valueOf()和toString()方法。

例如部分内置对象调用valueOf()方法时的返回值类型如下所示:
Array: 返回数组本身(对象类型)
Boolean: 返回布尔值(原始类型)
Data: 返回毫秒值(原始类型)
Function: 函数函数本身(对象类型)
Number:数字值(原始类型)
Object: 对象本身(对象类型)
String:字符串值(字符串类型)

valueOf():返回这个对象逻辑上对应的原始类型的值,比如说,String()包装对象的valueOf,应该返回这个对象所包装的字符串。
toString(): 返回这个对象的字符串表示,用一个字符串来描述这个对象的内容。

对象类型的转换为数字时是先调用对象的valueOf()方法或toString()方法将对象类型的值转换为原始类型的值,然后再将转换之后的结果再用Number()函数进行转换。

  1. 首先调用自身的valueOf()方法,如果返回基本类型的值,再调用Number()函数。
  2. 如果valueOf()方法返回的不是基本类型的值,则再调用toString()方法,如果返回基本类型的值,再调用Number()函数进行转换。
  3. 如果toString()和valueOf()返回的不是基本类型的值,则抛出异常。

String(value): String(value)可以把任何传进来的值转化为字符串

对象类型转换为字符串和对象类型转换为Number()的过程类似,只不过对象类型是先调用toString()方法,再调用valueOf()方法。

  1. 首先调用toString()方法,如果返回基本类型的值,则用String()构造函数转换该值。
  2. 如果toString()方法返回的结果不是基本类型,再调用valueOf()方法,如果返回基本类型的值,则用String()构造函数转换该值。
  3. 如果toString()和valueOf()方法返回的结果均不是基本类型的值,则抛出异常。

Boolean(value): 当传进来的值是“”(空串),null, 0, undefined, NaN时返回结果为false,其他值均为true。

var result = Boolean("")   //false
var result1 = Boolean(0)   //false
var result2 = Boolean(null)  //false
var result3 = Boolean(NaN)   //false
var result4 = Boolean(undefined)   //false
var result5 = Boolean("undefined")  //true

2. ES还提供了一些全局方法可以进行类型转换
parseInt()和parseFloat():把非数字的原始值转换为数字类型,前者是把值转换成整数,后者是把值转换成浮点数。
parseInt()和parseFloat()方法在判断字符串是否是数字值前,都会仔细分析这个字符串。
注意:parseInt()方法首先查看位置0处的字符,判断它是否是个有效数字;如果不是,该方法将返回NaN,不再继续执行其他操作。但如果该字符是有效数字,该方法将查看位置1处的字符,进行同样的测试。这一过程将继续到发现非有效数字为止,此时parseInt()将把该字符之前的字符串转换为数字。
例如,parseInt(“123abc123”)的输出结果会是123,因为当它检查到a时,就会停止检测过程。

扫描二维码关注公众号,回复: 4680908 查看本文章
var result = parseInt(123.3);       //123
var result1 = parseInt(true/false);  //NaN
var result2 = parseInt("10px");   //10
var result3 = parseInt("123.3");   //123

parseInt()方法还有一个作用,就是把指定的进制数转换为10进制数,例如:
parseInt(“AF”,16);的返回结果是175,即把16进制数AF转换为10进制数。如果没有指定基底,则需要首先判断前边的字符串是否是以“0”或“0x”开头,如果以“0”开头,则以8(IE)或10为基底,如果以“0x”开头,则默认以16进制为基底,其他的均表示以10为基底。

var result = parseInt("010",8);   //8
var result1 = parseInt("010");    //10
var result2 = parseInt("0x16");   //22
var result3 = parseInt("0x16",16);  //22

parseFloat的用法和parseInt的用法基本相同,不过,对于这个方法来说,第一个出现的小数点是有效字符。还有就是字符串必须是用十进制表示的字符串,不识别8进制和16进制。

var result = parseFloat("010");   //10 会忽略0
var result2 = parseFloat("0x16");   //0
var result3 = parseFloat("11.22.33",);  //11.22
var result2 = parseFloat("AF");   //NaN

此外,parseFloat()方法也没有基模式。

另外一个全局方法就是toString()方法。3种主要的原始数据类型Number类型,String类型,Boolean类型都有toString()方法。null和undefined没有toString()方法。

Number类型的数据有两种模式的toString方法,即默认模式和基模式,默认模式的toString()方法只是会输出对应的字符串。而基模式则是把对应的十进制数转换为指定的进制数。例如:

var num = 8,
    num1 = 0x10;
var result = num.toString();    //"8"
var result1 = num.toString(2);   //1000
var result2 = num.toString(16);  //8
var result3 = num1.toString();    //"16"
var result4 = num1.toString(2);   //10000
var result5 = num1.toString(16);  //10

JS中的隐式类型转换:

  1. isNaN(value):判断传进去的value值是否为非数,如果是非数的话,返回true,否则返回false。
    isNaN(value)在执行时会先将value值转换为Number类型的值,即整个过程可以看做两步:
    (1)先执行var num = Number(value);
    (2)对一步的结果进行判断:isNaN(num);
var result = isNaN(null);  //false
var result1 = isNaN(undefined);   //true
var result2 = isNaN("123ABC");   //true
  1. ++ – +(正) - (负) :都是先将两边的值转换为Number类型的值
  2. 字符串连接符(+): 先转换为字符串
var result = + "123";  //123
var result1 = "11" + 22;   //1122
var result2 = + "123" + "456";   //123456
  1. && || !:先转换为Boolean类型
  2. 比较运算符:操作数可以是任何类型,但是只有字符串和数字才能真正执行比较操作
    如果两个操作数有一个是数字,那么都转换为数字之后再进行比较;
    如果两个操作数都是字符串,那么按照字符串进行比较;
    特殊的:
console.log(undefined > 0);    //false
console.log(undefined < 0);    //false
console.log(undefined == 0);    //false
console.log(null > 0);   //false
console.log(null > 0) ;   //false
console.log(null == 0) ;  //false
  1. == 和 ===

==号操作符两边只要值的大小一致就是相等的

console.log(null == undefined) ;  //true

===号两边操作数必须类型和值完全一样时才是相等的。

猜你喜欢

转载自blog.csdn.net/superyuan567/article/details/84799129