一 转换数字
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
首先 == 表示相等, 当进行 == 比较时候, 如果数据类型不同, 会转换类型再进行比较
在 == 或者 != 操作符中数据类型转换有以下规则:
- 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0 true转换为1
- 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值
- 如果一个操作数是对象,另一个操作数不是,则调用对象的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类型返回表示日期的毫秒数