js数据类型转换和 == 运算符

一 转换数字

var a = "123.546";
Number(a);  // 123.546
//该方法会保留小数位,如果不是数值类型的字符串,或者是undefined,那么会返回NaN
//如果是Boolean类型 true 返回 1,false 返回 0 ;

var a = "0123.6q45";
parseInt(a); // 123  从第一个字符开始到第一个非数值类型的字符,如果第一个字符不是数值类型,那么会返回NaN;
parseFloat(a); //123.6 和parseInt();一样,不过可以保留小数点,parseInt();会向下取整

也可以使用 var a = a*1;  转化成数字,如果不是纯数值类型的字符串,会返回NaN;

二 转字符串

var a = 123;
String(a);
a.toString(); 

也可使用  var a = a+"";  转换为字符串类型

三 转Boolean

var a = "false";
var b = Boolean(a);   // b=true  任何非空字符串转Boolean都为true

javaScript约定规则为:

false、undefinded、null、0、""(空字符串)     为false

true、1、"someString"、[Object]、-1(所有负数)   为true

也可以使用var  b =  !!a;  转化为Boolean;  !为取反的意思 a是一个字符串js规定为true;   !a为false    !!a为true;

---------------------------------------------------------------------------------------------------------------------------

延伸一下 为什么空数组的布尔值为何为true? 

if([])console.log(1);  代码成功打印了 1, 因为除了Number,String,Boolean,null,undefined其它的实例都会归为Object, 数组本就是一个Object的扩展(typeof [] 返回的是"object"), 所以 [] 的布尔值为true

在看一个例子 浏览器控制台输入 [] == true    返回结果为false

首先 == 表示相等, 当进行 == 比较时候, 如果数据类型不同, 会转换类型再进行比较

在 == 或者 != 操作符中数据类型转换有以下规则:

  1. 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0  true转换为1
  2. 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值
  3. 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法(没有的话调用toString()),用得到的基本类型值按照前面的规则进行比较

回到 [] == true 根据第 1 条规则, 先把true转换为 1, 那么就成了  [] == 1

[] == 1 前面说过空数组其实就是一个对象, 那么根据第 3 条规则,  [].valueof() 返回的还是一个 [] , 这时 [] 就会调用 toString() 方法,  [].toString() 返回的是空字符串, 那么又变成了 "" == 1

"" == 1 现在又符合第 2 条规则, "" 转成数字是0,  0 == 1 自然就为 false

[] == true  =>  [] == 1  =>  "" == 1  =>  0 == 1

什么? 你问为什么[].valueof() 返回自身 (问题有点多啊啊啊)

valueOf() 方法:  返回一个对象的原始值(原始值就是Number,String,Boolean,null,undefined)

基本类型 String、Number、Boolean、Null、Undefined

引用类型 Object、Array、Date、Function、Error、RegExp、Math、Number、String、Boolean、Globle

Number,String,Boolean 都有引用类型(就是基本包装类型,也就是包装对象), 所以可以调用 valueof()  toString() .... 方法 (基本类型会找到对应的包装对象, 然后包装对象把所有的属性和方法给了基本类型)

上面规则第3条是针对 基本包装类型 和 date 的, 因为基本包装类型就是一个对象 (个人理解,欢迎大佬打脸)

boolean

var obj = new Boolean(true);
console.log(obj.valueOf()); //true
console.log(typeof obj.valueOf()); //boolean
console.log(obj); //Boolean {true}
console.log(typeof obj); // object 虽然他们的值是一样的,但是他的类型是 object

var b = true;
console.log(b.valueOf()); //true

 string

var obj = new String("hello");
console.log(obj.valueOf()); //hello
console.log(typeof obj.valueOf()); //string
console.log(obj); // String {"hello"}
console.log(typeof obj); // object

var str = "hello";
console.log(str.valueOf()); //hello

 number

var obj = new Number("123");
console.log(obj.valueOf()); //123
console.log(typeof obj.valueOf()); //number
console.log(obj); // Number {123}
console.log(typeof obj); // object

var n = 123;
console.log(n.valueOf()); //123

Object

var obj = {name: "n"}
console.log(obj.valueOf()); //{name: "n"}
console.log(typeof obj.valueOf()); // object 这里并没有返回原始值,因为 obj.valueOf() 返回了它本身


var arr = [1,2]
console.log(arr.valueOf());  // [1, 2]
console.log(typeof arr.valueOf()); // object

Date 

var date = new Date();

console.log(date.valueOf()); // 1575012713953
console.log(typeof date.valueOf()); // number

valueof()的返回值如下: 

  • undefined 和 null 没有此方法

  • 基本包装类型和对应的基本类型, 调用valueOf()返回对应的基本类型值

  • 对象类型(除Date类型)返回原对象

  • Date类型返回表示日期的毫秒数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值