[转帖][百度分享]javascript中的数据类型 分析_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3405 | 回复: 0   主题: [转帖][百度分享]javascript中的数据类型 分析        下一篇 
liulin_2
注册用户
等级:少校
经验:1143
发帖:85
精华:5
注册:2012-12-10
状态:离线
发送短消息息给liulin_2 加好友    发送短消息息给liulin_2 发消息
发表于: IP:您无权察看 2012-12-12 14:07:29 | [全部帖] [楼主帖] 楼主

最近对javascript型有些感想,想分3个部分和大家分享一下,先说说数据类型的分析:
1. 数据类型  
javascript中包含6种数据类型:undefinednullstringnumberbooleanobject。其中,前5种是原始数据类型,object是对象类型。  
object类型中包括ObjectFunctionStringNumberBooleanArrayRegexpDateGlobelMathError,以及宿主环境提供的object类型。  
2. 类型判断  
通常在javascript中进行类型判断主要通过3种方式:typeofinstanceofconstructor。  
2.1 typeof  

typeof操作可能返回的类型为undefined、object、number、string、function、boolean。但是会有一些情况并不能完全判断准确。比如typeof new String('')的值为object。
2.2 constructor


有时候我们可能会很偷懒的使用a.constructor == String进行类型判断,但是constructor其实是不靠谱的东西。因为当我们调用a.constructor的时候,内部操作其实是ToObject(a).prototype.constructorToObject是什么,看下文分解)。  
看下面一段代码就能明白:  

String.prototype.constructor = Number;
alert('test'.constructor == String); //Result:false


或者  

function MyClass() {
}
MyClass.prototype = {};
alert((new MyClass).constructor == MyClass); //Result:false


而且,通过constructor并不能判断出对象实例类型的继承关系。因为javascript的继承其实是通过原型链实现的(原型链是什么,看下文分解)。  
另外,null.constructor会抛出运行时的TypeError,所以使用constructor除了不靠谱外,还可能伴随着异常的风险。  
2.3 instanceof  
例子:a instanceof String  
关于object类型的判断,使用instanceof判断是比较靠谱的方法。instanceof所做的事情是,先取出类型对象(String)prototype成员(String.prototype),然后和要判断类型的对象(a)的原型链中的对象逐个比较。当发现是一个对象的时候返回true,原型链中当前节点是null的时候返回false。  
类型判断示例:判断一个变量是否是字符串类型  

function isString(str) {
      return (typeof str == 'string' str instanceof String);
}


3. 类型转换  
ecma262中描述了以下几种类型转换的操作:(还有其他的比如ToInt32等,这里就不列了)  
• ToNumber:转换成number型  
• ToString:转换成string型  
• ToBoolean:转换成boolean型  
• ToObject:转换成object型  
• ToPrimitive:转换成原始类型  
每种操作都描述了从什么类型转换成该类型的映射。比如上文的'a'.constructor中,就包含解析器使用ToObject‘a’转换成object的一个隐式操作。  
这里想要主要说的是ToPrimitiveToPrimitive用于转换成原始数据类型。当要转换的量已经是原始类型时,会直接返回。如果要转换的是一个Object,那会调用[[DefaultValue]]方法做转换。([[DefaultValue]]是什么,下文分解)该方法可以传入一个hint参数,说明需要将Object转换成字符串或数字。如果要转换成字符串,则调用ObjecttoString方法,如果要转换成数字,则调用ObjectvalueOf方法。具体在运行时什么时候应该转换成什么类型,请参考ecma262中关于expression的描述部分。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论