valueOf:引用类型中除了Date,valueOf()会返回字符串外,其他的都是返回this。
对于常见内置对象:Date, Array, Math, Number, Boolean, String, RegExp, Function的valueOf():
-
对于Number、Boolean、String,会变成相应的原始值
var num = new Number('123'); num.valueOf(); // 123 var str = new String('12df'); str.valueOf(); // '12df' var bool = new Boolean('fd'); bool.valueOf(); // true -
Date会转换为日期的毫秒的形式的数值
var a = new Date(); a.valueOf(); // 1532234132475 -
其他的都是this,即对象本身
var a = new Array(); a.valueOf() === a; // true var b = new Object({}); b.valueOf() === b; // true
toString:普通对象和Math对象的toString是返回他本身的类型即[object Object/Math],其他都有自己的toString,可返回相对有意义的返回值。
-
Number、Boolean、String、Array、Date、RegExp、Function这几种构造函数生成的对象,通过toString转换后会变成相应的字符串的形式,因为这些构造函数上封装了自己的toString方法。
Number.prototype.hasOwnProperty('toString'); // true Boolean.prototype.hasOwnProperty('toString'); // true String.prototype.hasOwnProperty('toString'); // true Array.prototype.hasOwnProperty('toString'); // true Date.prototype.hasOwnProperty('toString'); // true RegExp.prototype.hasOwnProperty('toString'); // true Function.prototype.hasOwnProperty('toString'); // true var num = new Number('123sd'); num.toString(); // 'NaN' var str = new String('12df'); str.toString(); // '12df' var bool = new Boolean('fd'); bool.toString(); // 'true' var arr = new Array(1,2); arr.toString(); // '1,2' var d = new Date(); d.toString(); // "Sun Jul 22 2018 12:38:42 GMT+0800 (中国标准时间)" var func = function () {} func.toString(); // "function () {}" -
其他(例如Object,Math)都是返回该对象的类型。
var obj = new Object({}); obj.toString(); // "[object Object]" Math.toString(); // "[object Math]"
toString
| 类型 | 转换后结果 |
|---|---|
| undefined | "undefined" |
| null | "null" |
| boolean | "true" / "false" |
| number | 数值类型的字符串 |
| Array (本质上也是object) | 把[ 和 ] 全部去掉,剩下的元素用','隔开的字符串 |
| object | 根据 valueOf / toString |
只有普通Object和Math对象没有自己的toString,所以返回的是"[object Object]"这样子的。
其他的话,返回的是有意义的结果。
toNumber
| 类型 | 转换后结果 |
|---|---|
| undefined | NaN |
| null | 0 |
| boolean | 0 / 1 |
| number | 本身 |
| String | 空串和空格=0,数值型字符串=数值,普通字符串=NaN |
| object | 无(貌似) |
- 不同类型进行
+ - * / ==会先转化为数字类型,在运算。 -
+不仅是算数运算符,也可以是字符串拼接,当字符串不是纯数字时会进行拼接。 - 比较特殊的是:null == undefined。要比较相等性之前,不能将 null 和 undefined 转换成其他任何值,并且规定null 和 undefined 是相等的。null 和 undefined都代表着无效的值。
-
==在比较的时候先转换数据类型,若等式两边数据类型不相同,将会往数值类型方向转换后再进行比较 -
==两边都是对象时,比较的是他们的地址
当我们进行强转时,发生了什么?
在JavaScript中,如果想要将对象转换成基本类型时,也就是所谓的拆箱时,会调用toPrimitive()。
toPrimitive(input,preferedType?) // 输入值,期望转换的类型

toPrimitive
preferedType为空时,日期会被认为是字符串,而其他的值会被当做Number。