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

valueOf() vs. toString() #22

Open
CoolRabbit520 opened this issue Mar 19, 2018 · 0 comments
Open

valueOf() vs. toString() #22

CoolRabbit520 opened this issue Mar 19, 2018 · 0 comments

Comments

@CoolRabbit520
Copy link
Owner

Object的每个实例都有三个方法:

  • valueOf()
  • toString()
  • toLocaleString()

valueOf()

语法:object.valueOf()(object的首字母为大写,意为调用者。若为Object,则为Object应用类型)
返回值:该对象的原始值

很少需要自己调用valueOf方法;对象在某些情况下需要使用原始值参加运算,JavaScript后台会自动调用。

Object的原生内置对象(Date\Boolean\Number\String)会重写该方法。
如果该对象没有原始值(Object\Function\Array),则返回对象本身。
大部分的内置引用类型的实例都是返回本身,所以该方法是为基本包装类型而设计的。

toString()

语法:object.toString()
返回值:该对象的字符串

  • 基本类型调用toString():

    • null和undefined被视为引用类型
    • number、string、boolean返回对应的字符串
  • 引用类型(对象,包括基本包装类型的对象)调用toString():
    如果此方法在自定义对象中未被覆盖,返回 "[object type]"(这也是字符串),其中type是对象的类型。

Object.prototype.toString.call(new Date); // [object Date]
Object.prototype.toString.call(new String); // [object String]
Object.prototype.toString.call(Math); // [object Math]

//Since JavaScript 1.8.5
Object.prototype.toString.call(undefined); // [object Undefined]
Object.prototype.toString.call(null); // [object Null]

Object的原生内置对象(Date\Boolean\Number\String)会重写覆盖该方法。

  • 对于Array对象,toString 方法返回一个字符串,该字符串由数组中的每个元素的 toString() 返回值经调用 join() 方法连接(由逗号隔开)组成。
var monthNames = ['Jan', 'Feb', 'Mar', 'Apr'];
var myVar = monthNames.toString(); // 输出 "Jan,Feb,Mar,Apr" to myVar.
  • 对于 Date 对象,toString() 方法返回一个表示该对象的字符串。
    该 toString 方法总是返回一个美式英语日期格式的字符串。
var x = new Date();
myVar = x.toString(); // 把类似于下面格式的值赋给 myVar,
// Mon Sep 28 1998 14:36:22 GMT-0700 (Pacific Daylight Time)
  • 对于 String 对象,toString 方法返回该对象的字符串形式,和 String.prototype.valueOf() 方法返回值一样。
var x = new String("Hello world");
alert(x.toString())      // 输出 "Hello world"
  • 对于Boolean对象,toString 方法返回该对象的字符串形式。
var flag = new Boolean(true)
var myVar = flag.toString()// 输出 "true"

String()

String()方法的转化规则:

  • null,返回"null"
  • undefined,返回"undefined"
  • 其他,调用toString()方法。

String()是转型函数,同时String()也是构造函数,new String()可以创建String的对象。

String() vs. toString()

  1. toString()和String()的主要区别就在于String()还能转换null和undefined值。

从JavaScript1.8.5开始toString()调用 null返回"[object Null]",undefined 返回"[object Undefined]"。

  1. toString()是对象的方法;String()是转型函数。
var flag = new Boolean(true)
var myVar = flag.toString()// 输出 "true"

var myVar2 = String(flag)// 输出 "true"

基本包装类型——特殊的引用类型

每一个基本类型(string\number\boolean)都有一个对应的基本包装类型。
基本包装类型存在的意义:只有引用类型的实例具有方法,这样每一个基本类型也能有方法。(基本类型的值调用方法时,JavaScript后台自动将生成对应的基本类型的实例,随后销毁该实例)

当然也可以强制生成一个基本类型的实例对象,使用new操作符,不过这样没有意义。

var numberObject=new Number(10);
var numberValue=10;

alert(typeof numberObject); //"object"
alert(typeof numberValue); //"number"
alert(numberObject instanceof Number); //true
alert(numberValue instanceof Number); //false

参考资料

  1. Object.prototype.valueOf() - JavaScript | MDN
  2. Object.prototype.toString() - JavaScript | MDN
@CoolRabbit520 CoolRabbit520 added JS and removed JS labels Mar 19, 2018
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