对象转换原始值

再总结一下JavaScript的数据类型:原始类型和引用类型

  • 原始类型:数字、字符串、布尔值、null、undefined
  • 引用类型:不是原始类型的都是引用类型,比如:数组、函数、对象

原始类型和引用类型的区别:原始值直接存放在变量之中,引用类型是在内存中的其他地方存放着数据,而在变量中放的是这片内存的地址。

我们现在来具体讨论怎么将一个对象转换为原始值

  1. 对象转换为布尔值:对象到布尔值的转换是非常简单的,所有对象(包括数组和函数)都转换为true。对于包装对象也是如此:new Bolean(false)是一个对象而不是原始值,它将转换为true。
  2. 对象转换为字符串:如果对象有toString()方法,则调用这个方法。如果它返回一个原始值,JavaScript将这个值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果;如果对象没有toString()方法,或者这个方法不是返回一个原始值,那么JavaScript会调用valueOf()方法,如果存在这个方法,则JavaScript调用它。如果返回一个原始值,JavaScript将他转换为字符串(如果本身不是字符串的话);如果这两种方法都不存在的话,就抛出类型错误异常。
  3. 对象转换为数字(首先使用valueOf()方法):如果对象有valueOf()方法,则调用这个方法。如果它返回一个原始值,JavaScript将这个值转换为数字,并返回这个数字;否则对象具有toString()方法,JavaScript会调用toString()方法,返回一个原始值,JavaScript将其转换为并返回(转换为数字);否则,就抛出类型错误异常

讨论一下toString()方法和valueOf()方法:

  • toString():不同的构造函数的原型对象都对toString()方法有新的定义(多态性):在Object.prototype中的toString方法是返回一个数组[object,对象类型];Array调用toString()方法将每个数组元素转换为一个字符串,并在元素之间添加,后合并成结果字符串;函数类调用toString()方法返回JavaScript中函数定义的源代码。日期类调用toString()返回一个可读的时间日期字符串。RrgExp类调用toString()返回正则表达式直接量的字符串
  • valueOf():如果对象存在任意原始值,就默认将对象直接转换为表示它的原始值,由于对象大多是复合值,因此valueOf()仅仅是返回对象本身,而不是返回一个原始值。数组、函数、正则表达式简单的继承了这个默认方法,因此这写类型的实例调用valueOf()方法,就简单的返回对象本身。日期类定义的valueOf()方法会返回它的一个内部表示:从1970年1月1日以来的毫秒数。

运算符的隐式转换:

  • 比较运算符、+、==的转换会按照对象到原始值的转换方法、注意这里只有日期类的对象会先调用toString()方法,如果不行才调用valueOf()方法,即对象到字符串的转换模式其他的对象到原始值的转换都是对象到数字的转换模式
  • -号等数字运算符,是直接讲两个操作数转换为数字。(number()转换不成功就返回NaN ,NaN与任何其他数字做加减运算都返回NaN,作关系运算都返回false)

猜你喜欢

转载自blog.csdn.net/lncci/article/details/80119133