js中toStirng()与Object.prototype.toString.call()方法理解

本文详细探讨了JavaScript中toString()方法的工作原理,包括如何将各种类型值转化为字符串,如boolean、string、object(包括Array、RegExp、Date等)、Number等。此外,还介绍了toString()方法在Object.prototype上的定义,以及如何利用Object.prototype.toString.call()来判断数据类型。文章最后提到了使用此方法在判断JSON对象和自定义类型时的注意事项。

toStirng()与Object.prototype.toString.call()方法浅谈

一、toString()是一个怎样的方法?它是能将某一个值转化为字符串的方法。然而它是如何将一个值从一种类型转化为字符串类型的呢?

通过下面几个例子,我们便能获得答案:

1.将boolean类型的值转化为string类型:

console.log(true.toString());//"true"
console.log(false.toString());//"false"

2.将string类型按其字面量形式输出:

var str = "test123y";
console.log(str.toString());//"test123y"

3.将Object类型转化成string类型(JavaScript原生的Array类型、Date类型、RegExp类型以及Number、Boolean、String这些包装类型都是Object的子类型):

自定义Object类型(没有重新定义toString方法):

var obj = {name:"Tom", age:18};
console.log(obj.toString());//"[object Object]"此时调用的是从Object继承来的原始的toString()方法

接下来的三个例子都是以重写的方式实现了toString()方法;

1.Array类型:

var arr = ["tom",12,"rose",18];
console.log(arr.toString());//"tom,12,rose,18"

2.RegExp类型

var patten = new RegExp("\\[hbc\\]at", "gi");
console.log(patten.toString());//"/\[hbc\]at/gi"

3.Date类型

var date = new Date(2014,02,26);//注意这种格式创建的日期,其月份是3月
console.log(date.toString());//"Wed Mar 26 2014 00:00:00 GMT+0800"输出格式因浏览器不同而不同,此为firefox的输出格式;

4.Number类型也是以重写的方式实现toString()方法的,请看以下例子:

(1)它可以接受一个整数参数,并将调用这个方法的数值转化成相应进制的字符串

var num = 16;
console.log(num.toString(2));//10000 二进制
console.log(num.toString(8));//20 八进制
console.log(num.toString(16));//10 十六进制
console.log(num.toString(5));//31 虽然没有五进制,但是这样传参是可以被toString()方法接受的

(2)再看下面的代码:

console.log(1.toString());//这种写法会报错语法错误,但是下面的写法都是合法的;
console.log((1).toString());//"1"
console.log(typeof (1).toString());//string
console.log(1..toString());//"1"
console.log(typeof (1).toString());//string
console.log(1.2.toString());//"1"
console.log(typeof (1).toString());//string

这是因为javascript引擎在解释代码时对于“1.toString()”认为“.”是浮点符号,但因小数点后面的字符是非法的,所以报语法错误;

而后面的“1..toString()和1.2.toStirng()”写法,javascript引擎认为第一个“.”小数点,的二个为属性访问语法,所以都能正确解释执行;

对于“(1).toStirng()”的写法,用“()”排除了“.”被视为小数点的语法解释,所以这种写法能够被解释执行;

(3)纯小数的小数点后面有连续6或6个以上的“0”时,小数将用e表示法进行输出;

var num = 0.000006;//小数点后面有5个“0”
console.log(num.toString());//"0.000006"
var num = 0.0000006;//小数点后面有6个“0”
console.log(num.toString());//"6e-7"

(4)浮点数整数部分的位数大于21时,输出时采用e表示法;

var num = 1234567890123456789012;
console.log(num.toString());//"1.2345678901234568e+21"

看到这里大家难免会有些疑问,这些基本的数据类型的值都是常量,而常量是没有方法的,为什么能够调用方法呢?答案是这样的,五种基本类型除了null、undefined以外都有与之对应的特殊的引用类型——包装类型。当代码被解释执行时,底层会对基本类型做一个类型转换,即将基本类型转换成引用类型,这样就可以调用相应引用类型有权访问到的方法。

二、toString()方法定义在何处?

运行以下代码:

var pro = Object.prototype;
var pr = pro.__proto__;//ie11之前版本不支持该属性
console.log(typeof pro);//"object"
console.log(String(pro));//"[object Object]"
console.log(pro.hasOwnProperty("toString"));//true
console.log(typeof pr);//"object"
console.log(String(pr));//"null"
console.log(pr.hasOwnProperty("toString"));//报错

由此可知,toString()定义在Object.prototype上;

三、使用Object.prototype上的原生toString()方法判断数据类型,使用方法如下:

Object.prototype.toString.call(value)

1.判断基本类型:

var pro = Object.prototype;
var pr = pro.__proto__;//ie11之前版本不支持该属性
console.log(typeof pro);//"object"
console.log(String(pro));//"[object Object]"
console.log(pro.hasOwnProperty("toString"));//true
console.log(typeof pr);//"object"
console.log(String(pr));//"null"
console.log(pr.hasOwnProperty("toString"));//报错

2.判断原生引用类型:

函数类型

Function fn(){console.log(“test”);}
Object.prototype.toString.call(fn);//”[object Function]”

日期类型

var date = new Date();
Object.prototype.toString.call(date);//”[object Date]”

数组类型

var arr = [1,2,3];
Object.prototype.toString.call(arr);//”[object Array]”

正则表达式

var reg = /[hbc]at/gi;
Object.prototype.toString.call(arr);//”[object Array]”

自定义类型

function Person(name, age) {
    this.name = name;
    this.age = age;
}
var person = new Person("Rose", 18);
Object.prototype.toString.call(arr); //”[object Object]”

很明显这种方法不能准确判断person是Person类的实例,而只能用instanceof 操作符来进行判断,如下所示:

console.log(person instanceof Person);//输出结果为true

3.判断原生JSON对象:

var isNativeJSON = window.JSON && Object.prototype.toString.call(JSON);
console.log(isNativeJSON);//输出结果为”[object JSON]”说明JSON是原生的,否则不是;

注意:Object.prototype.toString()本身是允许被修改的,而我们目前所讨论的关于Object.prototype.toString()这个方法的应用都是假设toString()方法未被修改为前提的。

<think>我们正在讨论如何自动生成重写后的toString方法。这通常发生在Java编程中,因为toStringObject类的方法,经常需要重写以提供有意义的对象字符串表示。 自动生成的方式: 1. 使用IDE(如IntelliJ IDEA或Eclipse)的代码生成功能。 2. 使用第三方库(如Apache Commons Lang的ToStringBuilder或Lombok的@ToString注解)。 下面分别说明: 方法一:使用IDE生成(以IntelliJ IDEA为例) - 在类中,右键点击 -> Generate...(或按Alt+Insert)-> 选择toString()。 - 选择要包含的字段,然后点击OK,IDE会自动生成类似下面的代码: ```java @Override public String toString() { return "ClassName{" + "field1=" + field1 + ", field2='" + field2 + '\'' + '}'; } ``` 方法二:使用Lombok库 - 在类上添加@ToString注解,编译时会自动生成toString方法。 ```java import lombok.ToString; @ToString public class MyClass { private int id; private String name; } ``` - 生成的toString方法会包含所有非静态字段。 方法三:使用Apache Commons Lang - 使用ToStringBuilder.reflectionToString(this) 或自定义格式。 ```java import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; @Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); } ``` 注意:自动生成时需考虑循环引用(如对象间相互引用)可能导致栈溢出,Lombok和ToStringBuilder可以处理这种情况(通过设置或默认行为避免无限递归)。 根据规则,回答后需提出3-5个相关问题,以“§§相关问题§§”开头,然后列出问题。</think>在Java中,可以通过以下方式自动生成重写的`toString()`方法: ### 1. **使用IDE自动生成(推荐)** - **IntelliJ IDEA**:右键类内空白处 → 选择"Generate" → 选择"toString()" → 选择需要包含的字段 - **Eclipse**:右键类内空白处 → "Source" → "Generate toString()..." → 选择字段和格式 ### 2. **使用Lombok注解(需添加依赖)** ```java import lombok.ToString; @ToString // 自动生成包含所有字段的toString() public class User { private int id; private String name; } ``` **效果**:`User(id=1, name=John)` ### 3. **使用Apache Commons Lang(需添加依赖)** ```java import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; @Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); } ``` **输出示例**:`User[id=1,name=John]` ### 4. **记录类(Java 16+ 新特性)** ```java public record User(int id, String name) {} // 自动生成toString() ``` **调用效果**:`User[id=1, name=John]` --- ### 最佳实践建议: 1. 优先使用IDE生成,便于自定义字段顺序和格式 2. 项目中使用Lombok可减少样板代码 3. 避免手动拼接字符串,防止`NullPointerException` 4. 重写时通常包含所有关键字段,排除敏感数据(如密码)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值