浅谈JS中String()与 .toString()的区别

我们知道String()与 .toString()都是可以转换为字符串类型,但是String()与 .toString()的还是有区别的

1、.toString()可以将所有的的数据都转换为字符串,但是要排除null 和 undefined

例如将false转为字符串类型

[javascript]  view plain  copy
  1. <script>  
  2.   var str = false.toString();  
  3.   console.log(str, typeof str);  
  4. </script>  

返回的结果为 false,string

看看null 和 undefined能不能转换为字符串javascript

[javascript]  view plain  copy
  1. <blockquote style="margin-right: 0px;" dir="ltr"><pre class="html" name="code"><script>  
  2.   var str = null.toString();  
  3.   console.log(str, typeof str);  
  4. </script>  

结果程序报错

[javascript]  view plain  copy
  1. <script>  
  2.   var str = undefined.toString();  
  3.   console.log(str, typeof str);  
  4. </script>  

程序也报错

.toString() 括号中的可以写一个数字,代表进制,对应进制字符串

二进制:.toString(2);  

八进制:.toString(8);

十进制:.toString(10);

十六进制:.toString(16);

2、网页代码String()可以将null和undefined转换为字符串,但是没法转进制字符串

例如将null转换为字符串

[javascript]  view plain  copy
  1. <script>  
  2.   var str = String(null);  
  3.   console.log(str, typeof str);  
  4. </script>  

返回的结果为 null,string

将undefined转换为字符串

[javascript]  view plain  copy
  1. <script>  
  2.   var str = String(undefined);  
  3.   console.log(str, typeof str);  
  4. </script>  

返回的结果为 undefined,string

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

3.1Array类型:

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

3.2RegExp类型

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

3.3Date类型

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

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

  3.4.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()方法接受的

  3.4.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.4.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"

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

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

 

三、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上;所以所有对象均可用toString()方法。

【个人理解:但为什么当对象是object的时候,输出的是'[object object]',而其他类型输出的却是类似本身的值?因为其他类型的对象引用的是重写后的toString()方法】

 

 Object.prototype.toString() 为何能返回这样类型的字符串?
ECMA-262:
1
2
3
4
Object .prototype.toString( ) When the toString method  is  called, the following steps are taken:
1 . Get the [[Class]] property of  this  object.
2 . Compute a string value by concatenating the three strings “[object “, Result ( 1 ), and “]”.
3 . Return Result ( 2 )

上面的规范定义了 Object.prototype.toString 的行为:首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于 "[object Array]" 的字符串作为结果([[]]用来表示语言内部用到的、外部不可直接访问的属性,称为 "内部属性")。利用这个方法,再配合 call,我们可以取得任何对象的内部属性 [[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。还是先来看看在 ECMA 标准中 Array 的描述吧:

1
2
new  Array([ item0[, item1 [,…]]])
The [[Class]] property of the newly constructed object is set to “Array”.

  所以 Javascript 中判断数组的函数可以这样写:

1
2
3
function  isArray(a) {
   Array.isArray ? Array.isArray(a) : Object.prototype.toString.call(a) ===  '[object Array]' ;
}

  

四、所以,可以使用Object.prototype上的原生toString()方法判断数据类型,使用方法如下:
 Object.prototype.toString.call(value)

 4.1.判断基本类型:

Object.prototype.toString.call(null);//”[object Null]”
Object.prototype.toString.call(undefined);//”[object Undefined]”
Object.prototype.toString.call(“abc”);//”[object String]”
Object.prototype.toString.call(123);//”[object Number]”
Object.prototype.toString.call(true);//”[object Boolean]”

4.2.判断原生引用类型:

4.2.1函数类型

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

4.2.2日期类型

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

4.2.3数组类型

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

4.2.4正则表达式

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

4.2.5自定义类型

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

4.3判断原生JSON对象:

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

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


  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值