Open JesseZhao1990 opened 6 years ago
表示一个代表该对象的字符串
每个对象都有一个toString方法,当该对象被期望是一个字符串时,就会被自动调用。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中type是对象的类型。
举例子说明一下
var a = {};
console.log(a.toString()) // '[object Object]'
可以自定义一个方法来取代默认的toString() 方法。该toString()方法不能传入参数,并且必须返回一个字符串。自定义的toString方法返回的可以是任何我们需要的值。如果这个值是和对象有关系的相关信息,那么它将变得非常有用。
以下的例子我们创建了一个Dog对象类型,并创建一个theDog实例
function Dog(name,breed,color,sex) {
this.name=name;
this.breed=breed;
this.color=color;
this.sex=sex;
}
var theDog = new Dog("Gabby","Lab","chocolate","female");
当我们调用theDog的toSting方法时,返回的是
theDog.toString() // '[object Object]'
下面我们覆盖掉默认的toString方法。返回和其对象本身有关的信息
Dog.prototype.toString = function dogToString() {
var ret = "Dog " + this.name + " is a " + this.sex + " " + this.color + " " + this.breed;
return ret;
}
我们再次调用toString的时候,返回的值和对象本身就有了关系。看下面这个例子
var theDog = new Dog("Gabby","Lab","chocolate","female");
theDog.toString() // "Dog Gabby is a female chocolate Lab"
可以通过toString() 来获取每个对象的类型。为了每个对象都能通过 Object.prototype.toString() 来检测,需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式来调用,传递要检查的对象作为第一个参数,称为thisArg。
var toString = Object.prototype.toString;
console.log(toString.call(new Date)); // [object Date]
console.log(toString.call(new String)); // [object String]
console.log(toString.call('')); // [object String]
console.log(toString.call(Math)); // [object Math]
console.log(toString.call(new Array(1,2))); // [object Array]
console.log(toString.call([])); // [object Array]
console.log(toString.call(undefined)); // [object Undefined]
console.log(toString.call(null)); // [object Null]
返回指定对象的原始值
JavaScript调用valueOf方法将对象转换为原始数据类型(primitive)。你很少需要自己调用valueOf方法; 当遇到需要预期的原始数据类型(primitive)的时候,JavaScript会自动调用它。
默认情况下。valueOf方法由Object后边的每个对象继承。每个内置的核心对象都会覆盖此方法以返回适当的值。如果对象没有原始数据类型(primitive)。则valueOf将返回对象本身。
JavaScript的许多内置对象都重写了该函数,以实现更适合自身的功能需要。因此,不同类型对象的valueOf()方法的返回值和返回值类型均可能不同。
对象 | 返回值 |
---|---|
Array | 返回数组对象本身。 |
Boolean | 布尔值。 |
Date | 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。 |
Function | 函数本身。 |
Number | 数字值。 |
Object | 对象本身。这是默认情况。 |
String | 字符串值。 |
Math 和 Error 虽然对象没有自己的 valueOf 方法。但是顺着原型链会查找到Object.prototype.valueOf.所以最终返回的值也将是自身。 |
你可以在自己的代码中使用valueOf将内置对象转换为原始数据类型(primitive)。 创建自定义对象时,可以覆盖Object.prototype.valueOf()来调用自定义方法,而不是默认Object方法。Immutable.js就充分的利用了这一特征
你可以创建一个取代valueOf方法的函数。你的方法不能传入任何参数。下面是一个实际例子
function Cat(name,age){
this.name = name;
this.age = age;
}
Cat.prototype.valueOf = function(){
return this.name + this.age;
}
js中的数据类型
原始类型 string number boolean null undefined symbol
对象 Object
显式类型转换
显示类型转换是通过调用下面这三个函数来进行的。
1. Number( )
数值: 转换之后还是数值 字符串: 如果可以被解析为数值,则转为数值,否则转为NaN,空字符串转为0 布尔值: true转成1, false转为0 undefined: 转成NaN null : 转成0 对象: 这个稍微复杂一些,具体的过程如下
https://codepen.io/zhaojianxin/pen/RyYwwe?editors=0012
2. String( )
数值: 转换成对应的字符串 字符串: 还是自身 布尔值 : true转为‘true’ ,false转为‘false’ undefined: 转为“undefined” null : 转为 ‘null’ 对象:这个过程一样是有点复杂,具体的过程如下
https://codepen.io/zhaojianxin/pen/ZoMWrY?editors=0011
3. Boolean()
除undefined,null,0,NaN,空字符串之外,全部返回true。
隐式类型转换
隐式类型转换的场景大概有如下几种
下面我们一一分析
四则运算
四则运算中,除了加法特殊,减乘除都比较简单。即都会试着转换为number
加法运算需要记住两条规则
http://javascript.info/object-toprimitive