一个友好的.改善的 Object.prototype.toString的实现

JavaScript中几乎每个对象都有一个 toString()方法,而且是内置的.用来输出当前
变量的信息. 但是对于我们最常用的Object对象.每次用 toString都是打印[object Object]
{a:1,b:2,c:3}.toString()  ===> [object Object]
让人十分郁闷,为此我实现了一个友好的,打印Object各成员的函数,
支持嵌套输出 ,也能友好打印数组内容.
这里贴出代码,希望和大家一起学习,一起完善,改进这个函数.
说句题外话,用 Vim写程序,可不是一般的爽啊.
我表达能力有限,只能用 "爱不释手" 来表达我对 Vim 的爱
http://www.vim.org/

/* vi:set tw=0 ts=4 sw=4 noet nowrap ft=javascript fdm=syntax ai: */
/*
Date对象输出为字符, 返回类似: "2002年2月1日 1:01:01" 的格式
part:
0:(默认)返回日期和时间
1:只返回日期
2:只返回时间
sp:
undefined :(默认)返回 "2002-2-1 1:01:01"
非undefined: 返回 "2002年2月1日 1:01:01"
*/
Date.prototype.tos=function(part,sp){
var hash={"0":"","1":"Date","2":"Time"} , ret , part=part || 0;
//因为 toLocaleString的输出完全处决于客户机操作系统的设置,所以我们要先测试一下
if ((new Date(2000,1,1,1,1,1)).toLocaleString()=="2000年2月1日 1:01:01"){
ret=String(this["toLocale"+hash[part]+"String"]());
}else{ //不是我们想要的格式,只能自己实现
var yyyy=this.getFullYear();
var nn=this.getMonth()+1;
var dd=this.getDate();
var hh=this.getHours();
var mm=String("00"+this.getMinutes()).right(2);
var ss=String("00"+this.getSeconds()).right(2);
var dateString=yyyy+"年"+nn+"月"+dd+"日";
var timeString=hh+":"+mm+":"+ss;
hash={"0":dateString+" "+timeString,"1":dateString,"2":timeString};
ret= hash[part];
}
return sp==undefined?ret.replace(/[年月]+/g,"-").replace("日",""):ret;
}
RegExp.prototype.tos=function(){
return this.toString();
}
Number.prototype.tos=function(){
return this.toString();
}
String.prototype.tos=function(){
if (this.indexOf("'")!=-1){
return '"'+this.replace(/"/g,'\\"')+'"';
}else{
return "'"+this.replace(/'/g,"\\'")+"'";
}
}
/*
"".left 和 "".right 模拟实现 vbs里面的 left和right函数,截取字符串
不过这里的实现支持中文 ,会把一个汉字当两个字符来计算。
*/
String.prototype.right=function(n){
return this.slice(this.slice(-n).replace(/[\x00-\xff]/g,"").length-n);
}
String.prototype.left=function(n){
// alert("abcdefg".left(3)==="abc");alert("中国人cdefg".left(5)==="中国"); //alert("中国abcdefg".left(5)==="中国a")
return this.slice(0,n-this.slice(0,n).replace(/[\x00-\xff]/g,"").length);
}
//列出函数名和参数列表,内容用替代
Function.prototype.tos=function(){
var ret=this.toString();
return ret.left(ret.indexOf(")"))+"){}";
}
Array.prototype.tos=function(){
for(var i=0,arr=[];i

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

(0)

相关推荐

  • 一个友好的.改善的 Object.prototype.toString的实现

    JavaScript中几乎每个对象都有一个 toString()方法,而且是内置的.用来输出当前 变量的信息. 但是对于我们最常用的Object对象.每次用 toString都是打印[object Object] {a:1,b:2,c:3}.toString()  ===> [object Object] 让人十分郁闷,为此我实现了一个友好的,打印Object各成员的函数, 支持嵌套输出 ,也能友好打印数组内容. 这里贴出代码,希望和大家一起学习,一起完善,改进这个函数. 说句题外话,用 Vim

  • JavaScript中Object.prototype.toString方法的原理

    在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. var arr = []; console.log(Object.prototype.toString.call(arr)) //"[object Array]" 本文要讲的就是,toString方法是如何做到这一点的,原理是什么. ECMAScript 3 在ES3中,Object.prototype.toString方法的规范如下: 15.2.

  • JavaScript中使用Object.prototype.toString判断是否为数组

    为什么要用Object.prototype.toString而不是Function.prototype.toString或者其它?这是和他们的toString解释方式有关系的.下面是ECMA中对Object.prototype.toString的解释: 复制代码 代码如下: Object.prototype.toString( ) When the toString method is called, the following steps are taken: 1. Get the [[Cla

  • Vue源码中要const _toStr = Object.prototype.toString的原因分析

    在vue的源码中,vue/src/shared/util.js文件中存放的是一些方法.其中作者用了Object.prototype.toString这个方法来判断类型,但是并没有直接用,而是单独保存在一个变量: const _toStr = Object.prototype.toString 那么为什么要这么做呢? 先说下判断类型.众所周知,typeof在判断对象时不能正确判断Null,并且不能识别出Array,但在判断基础类型时是没问题的.所以尤大也写了: export function is

  • 用Object.prototype.toString.call(obj)检测对象类型原因分析

    这是一个十分常见的问题,用 typeof 是否能准确判断一个对象变量,答案是否定的,null 的结果也是 object,Array 的结果也是 object,有时候我们需要的是 "纯粹" 的 object 对象.如何避免呢?比较好的方式是: console.log(Object.prototype.toString.call(obj) === "[object Object]"); 使用以上方式可以很好的区分各种类型: (无法区分自定义对象类型,自定义类型可以采用i

  • 判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解

    1.typeof(param) 返回param的类型(string) 这种方法是JS中的定义的全局方法,也是编译者们最常用的方法,优点就是使用简单.好记,缺点是不能很好的判断object.null.array.regexp和自定义对象. 示例代码: 复制代码 代码如下: var str='str';var arr=['1','2'];var num=1;var bool=true;var obj={name:'test'};var nullObj=null;var undefinedObj=un

  • 浅谈javaSE 面向对象(Object类toString)

    每一个对象,都有一个在内存中的地址哈希值,这个哈希值是十六进制的 调用Object对象的hashCode()方法,返回这个对象的哈希值 调用Integer.toHexString()方法,转换十六进制 调用Object对象的toString()方法,得到:类名@哈希值 通常我们会复写toString()方法,因为默认的没有太大意义 实现原理是类的反射 当我们创建一个对象,会在硬盘上生成xxx.class的文件,jdk定义了Class类来描述这些class文件 调用Object对象的getClas

  • Object类toString()和equals()方法使用解析

    我们知道,Object类是所有类的父类,因此也被称为根类.祖先.那么,我们就来看一看Object类的最常用的两个方法是如何用的. 1.toString方法: Object类的toString()方法默认返回的是对象地址值,如果某个类的toString()方法返回的不是对象地址值,则说明这个类重写了toString()方法. public class Test5 { public static void main(String[] args) { Person p1=new Person(); S

  • JavaScript高阶教程之“==”隐藏下的类型转换

    抛砖引玉 按照正常的逻辑来说,我们判断两个值是否相等会遵循以下规则: 但是我看下面一组值: []==0 //true []==false //true []==!{} //true [10]==10 //true '0'==false //true ''==0 //true undefined==null //true !null==true //true 居然没有按照我们的剧本走,那它比较规则又是什么?下面我就来分析一波. "=="的比较规则 首先我们先去ECMAScript5.1中

  • Prototype Object对象 学习

    Object is used by Prototype as a namespace; that is, it just keeps a few new methods together, which are intended for namespaced access (i.e. starting with "Object."). 上面说的namespace个人理解就相当于C#中的静态类,提供工具函数的意思,和C#中的namespace应该不是一个概念.因为C#中的命名空间后面不会直

随机推荐