JesseZhao1990 / blog

learing summary
MIT License
62 stars 7 forks source link

js中的数据类型和数据类型转换 #128

Open JesseZhao1990 opened 6 years ago

JesseZhao1990 commented 6 years ago

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。

隐式类型转换

隐式类型转换的场景大概有如下几种

  1. 四则运算
  2. 判断语句
  3. native调用

下面我们一一分析

四则运算

四则运算中,除了加法特殊,减乘除都比较简单。即都会试着转换为number

加法运算需要记住两条规则

http://javascript.info/object-toprimitive

JesseZhao1990 commented 6 years ago

toString

表示一个代表该对象的字符串

每个对象都有一个toString方法,当该对象被期望是一个字符串时,就会被自动调用。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中type是对象的类型。

举例子说明一下

var a = {};
console.log(a.toString()) // '[object Object]'

覆盖默认的toString方法

可以自定义一个方法来取代默认的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]
JesseZhao1990 commented 6 years ago

valueOf

返回指定对象的原始值

JavaScript调用valueOf方法将对象转换为原始数据类型(primitive)。你很少需要自己调用valueOf方法; 当遇到需要预期的原始数据类型(primitive)的时候,JavaScript会自动调用它。

默认情况下。valueOf方法由Object后边的每个对象继承。每个内置的核心对象都会覆盖此方法以返回适当的值。如果对象没有原始数据类型(primitive)。则valueOf将返回对象本身。

JavaScript的许多内置对象都重写了该函数,以实现更适合自身的功能需要。因此,不同类型对象的valueOf()方法的返回值和返回值类型均可能不同。

不同类型对象的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方法

你可以创建一个取代valueOf方法的函数。你的方法不能传入任何参数。下面是一个实际例子

function Cat(name,age){
    this.name = name;
    this.age = age;
}

Cat.prototype.valueOf = function(){
       return this.name + this.age;
}