Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
JesseZhao1990 opened this issue May 10, 2018 · 2 comments
Open

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

JesseZhao1990 opened this issue May 10, 2018 · 2 comments

Comments

@JesseZhao1990
Copy link
Owner

JesseZhao1990 commented May 10, 2018

js中的数据类型

原始类型 string number boolean null undefined symbol

对象 Object

显式类型转换

显示类型转换是通过调用下面这三个函数来进行的。

  • Number( )
  • String( )
  • Boolean( )

1. Number( )

数值: 转换之后还是数值
字符串: 如果可以被解析为数值,则转为数值,否则转为NaN,空字符串转为0
布尔值: true转成1, false转为0
undefined: 转成NaN
null : 转成0
对象: 这个稍微复杂一些,具体的过程如下

  • 1.如果调用对象本身的valueOf方法返回的是原始数据类型,则调用Number()来对返回的值进行处理。
  • 2.如果调用对象本身的valueOf方法之后返回的复合数据类型,则调用对象自身的toString方法,如果toString的返回值是原始的数据类型,则对该值使用Number()处理,不再进行后续步骤。如果toString返回的是复合的数据类型,则报错。

https://codepen.io/zhaojianxin/pen/RyYwwe?editors=0012

2. String( )

数值: 转换成对应的字符串
字符串: 还是自身
布尔值 : true转为‘true’ ,false转为‘false’
undefined: 转为“undefined”
null : 转为 ‘null’
对象:这个过程一样是有点复杂,具体的过程如下

    1. 如果调用对象本身的toString方法返回的是原始数据类型,则调用String()来, 不再进行以下步骤。
    1. 如果toString方法返回的是复合类型的值,再调用valueOf方法,如果ValueOf返回的是原始类型的值,则对该值使用String方法,如果valueOf方法返回的是复合类型的值,则报错。

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
Copy link
Owner Author

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
Copy link
Owner Author

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;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant