JS数据类型转换

JS数据类型

常用的数据类型:

Boolean、String、Number、Null、Undefined、Object

还有两种类型是ECMAScript新增的: BigInt、Symbol

Number

数值类型,也可以表达进制数。由于JS中只有一种数据类型

存在最大和最小值,通过 Number.MAX_VALUE 和 Number.MIN_VALUE可以得到。

特殊 Infinity、-Infinity、NaN的类型都是Number

MAX_VALUE: 1.7976931348623157e+308    
MIN_VALUE: 5e-324

判断是否是 Number: 通过 isNaN (is not a number)来判断,是的话,返回false,不是返回true

String

字符串类型,常用特殊字符:

​ 转义字符 \

​ 换行字符: \n

​ 制表符: \t

​ 回车符: \r

​ 退格符: \b

Undefined

当一个变量声明了,没有赋值,则输出undefined

var a;
console.log(a) // undefined

null

经常用来释放对象。将对象赋值为null,垃圾回收机制就会对改对象地址进行回收。 垃圾回收机制 只会主动回收栈内存的地址,但是对象是存在堆内存中的,所以不会被回收,因此想要回收对象的地址空间,需要将对象赋值给 null。

这里提示一下: undefined是由null衍生出来的,所以在对两者进行比较的时候,其值是相同的,但是内存地址不一样

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

注意:

console.log(typeof null === 'object') // true

这是由于JS中的值是这样定义的: {类型标签,值},对象的类型标签是 0,而null代表空指针,大多数平台下,null的值为 0x00, 因此他的标签类型是 0,typeof null返回的就是object

Boolean

布尔类型,用来判断 true和false

数据转换

转换为数字

  • parseInt() // 将其他类型转化为 整型数字,从左至右进行解析,如果遇到字符,则停止解析

    console.log(parseInt('123hahah')); // 123
    console.log(parseInt('123ha123')); // 123
    console.log(parseInt('ha123')); // NaN
    
  • parseFloat() // 转化为浮点

  • Number() // 这个转换,要比 parseInt和parseFloat更加的严格。只要存在不能转化为数字的字符就直接NaN,同时会自动过滤字符串首尾的空格。

    Number转化简单数据类型:

    console.log(Number('123ha123')); // NaN
    console.log(Number(' 123 ')); // 123,空格锅炉
    console.log(Number(' ')); // 0
    console.log(Number(null)); // 0
    console.log(Number(undefined)); // NaN 
    console.log(Number(true)); // 1
    console.log(Number(false)); // 1
    

    Number转化复杂数据类型:

    console.log(Number({name:'ly'})); // NaN 
    console.log(Number([1,2,3])); // NaN 
    console.log(Number([3])); // 3
    var eating = function() { console.log("eating"); }
    console.log(Number(eating)); // NaN 
    

    大家可能会很疑惑 第三行, **console.log(Number([3])); **的值为什么是3,而不是NaN呢?

    这是因为Number的转化规则三部曲:

    1 将需要转化的对象进行 valueOf()操作,如果返回原始类型的值,就直接转化。

    2 如果valueOf()返回的是对象,则对其进行 toString()操作。如果toString() 返回原始类型的值,就直接转化。

    3 如果 toString()返回的是对象,则报错 Cannot convert object to primitive value

    因此,对 Number([3])的操作,我们可以看成:

    var arr = [3];
    if (typeof arr.valueOf() === 'object') {
      console.log(Number(arr.toString()),"是对象")
    } else {
      console.log(Number(arr.valueOf()),"不是对象")
    }
    // 3 是对象
    

    复杂数据类型通过Number转化的时候,都会返回自身,所以都会调用toString() 方法。值得注意的是 数组的toString()返回的是 以逗号分隔的字符串:

    console.log(Number([3]); // 3,相当于 Number('3')
    console.log(Number([3,4]); // NaN,相当于 Number('3,4')
    console.log(Number([]); // 0,相当于 Number('') 
    

    对象的toString,则直接返回[object type],type表示类型,所以数组一般返回 [object, object]

    var obj = {
      name:'18',
    }
    var obj1 = {}
    console.log(Number(obj)); // NaN,相当于Number('[object object]')
    console.log(Number(obj1)); /NaN 
    

转换为String类型

  • 直接在后面拼接 + ‘’,隐式转换

  • toString() 转换,但是 undefined和 null不具备该函数,调用会报错。参数有两个 第一个是需要转换的值,第二个是 转换成的进制,默认为十进制

  • String() 转换, 和Number相似

    基本数据转换为String:

    console.log(String(123)); // '123'
    console.log(String('123'));// '123'
    console.log(String(true));// 'true'
    console.log(String(false));// 'false'
    console.log(String(undefined));// 'undefined'
    console.log(String(null));// 'null'
    

    复杂数据转换,和Number() 一样,需要经过三部曲,但是 String()三部曲的 toString()和indexOf()换了顺序

    console.log(String({name:'ly'})); // [object Object] 
    console.log(String([1,2,3])); // 1,2,3
    console.log(String([1])); // 1
    var eating = function() { console.log("eating"); }
    console.log(String(eating)); // function() { console.log("eating"); 
    

    String() 三部曲:

    1 将需要转化的对象进行 toString()操作,如果返回原始类型的值,就直接转化。

    2 如果toString()返回的是对象,则对其进行 valueOf()操作。如果valueOf() 返回原始类型的值,就直接转化。

    3 如果 valueOf()返回的是对象,则报错 Cannot convert object to primitive value

    因此下面这两个语句是等价的嘞:

    console.log(String({name: '1'})); //[object,object]
    console.log(String({name: '1'}.toString()));
    

    转化为 Boolean()类型

    只有当要转化的值下面几种的时候是false,其他时候都是true

    ​ ‘’, 0, undefined, null, NaN

    console.log(Boolean(undefined)); // false
    console.log(Boolean(null)); // false
    console.log(Boolean(0));// false
    console.log(Boolean(NaN));// false
    console.log(Boolean(''));// false
    
    console.log(Boolean(new Boolean(false))); //true
    

    牢记只有上面几种情况下,为false,其他都会true,比如最后一种,就算我里面传的参数是 new Boolean(false),也会返回true

隐式转换

又称自动转换,一般出现由两种情况:

  • 不同类型的数据互相运算时
  • if判断语句中
  • 一元运算符

自动转换为字符串

当和字符串进行相加的时候:

console.log('5' + 1); // '51'
console.log('5' + true); // '5true'
console.log('5' + false); // '5false'
console.log('5' + null); // '5null'
console.log('5' + undefined); // '5undefined'
console.log('5' + {}); // ' 5[object object]'
console.log('5' + {name:'ly'});  // '5[object object]'
console.log('5' + []); // '5'
console.log('5' + [1,2,3]); // '51,2,3'
console.log('5' + [1]);// '51'
console.log('5' + function() {}); // '5function(){}'

自动转换为数值

除了加法运算符(+)有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值

console.log('5' * 2); // 10
console.log('5' - 2); // 3
console.log('5' / 2); // 2.5
console.log('5' % 2); // 1
console.log(true + 1); // 2
console.log(false - 1); // -1
console.log('5' * []); // 0
console.log('5' - [2,3]); // NaN
console.log(null - 1); // -1
console.log(undefined + 1); //NaN
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值