最近对javascript型有些感想,想分3个部分和大家分享一下,先说说数据类型的分析:
1. 数据类型  
javascript中包含6种数据类型:undefined、null、string、number、boolean和object。其中,前5种是原始数据类型,object是对象类型。  
object类型中包括Object、Function、String、Number、Boolean、Array、Regexp、Date、Globel、Math、Error,以及宿主环境提供的object类型。  
2. 类型判断  
通常在javascript中进行类型判断主要通过3种方式:typeof、instanceof、constructor。  
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.constructor(ToObject是什么,看下文分解)。  
看下面一段代码就能明白:  
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的一个隐式操作。  
这里想要主要说的是ToPrimitive。ToPrimitive用于转换成原始数据类型。当要转换的量已经是原始类型时,会直接返回。如果要转换的是一个Object,那会调用[[DefaultValue]]方法做转换。([[DefaultValue]]是什么,下文分解)该方法可以传入一个hint参数,说明需要将Object转换成字符串或数字。如果要转换成字符串,则调用Object的toString方法,如果要转换成数字,则调用Object的valueOf方法。具体在运行时什么时候应该转换成什么类型,请参考ecma262中关于expression的描述部分。  未完待续!

解决方案 »

  1.   

    都是用var  ,怎么还有这些,期待其他的部分,
      

  2.   

    js里面的基础类型只有Object,连string,number,null和undefined也是他的衍生类型
      

  3.   

    在动态语言中根本就不会存在除Object以外的任何基础类型,因为动态语言自己封装了这些类型,并提供给你一个安全的类型使用,而且都处理为Object类型也可以方便类型管理,连指针都省了
      

  4.   

    MARK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      

  5.   

    配置:
         硬盘:15G
         内存:256M
         IP  :  1个 HK出口(可以提供电信/网通/国际出口)
         Hot backup : 1
    PBS VPS刚买的时候有点担心,因为一个月180块,如果买便宜的VPS,可以买好多个。在买之前我联系了他们试用了两天,打消了我的疑虑。我主要看中了有HK的出口,还有hot backup的功能,而且那里的NOC团队也给我了很大的帮助。在试用的两天,我装了几次系统和遇到了几个问题,他们的NOC团队总是能给我最好的解决。我让我HK和美国的朋友测试一下到我的网站速度,他们的感觉都是好快的。这点我是比较满意的。
    有点不满意的是他们那里提供的VPS只有CentOS版的,我原本想要RHEL版的,不过他那里没有,不过都是相通的,就用了CentOS了。
    好了,大家也可以去试试PBS VPS,有想了解的,可以站内发短信给我。
      

  6.   

    学习了 呵呵  感谢 http://www.kbysq.com
      

  7.   

    学习以下,javascript要有大作为了
      

  8.   

    这个学习了
    但是会有一些情况并不能完全判断准确。比如typeof new String('')的值为object。
      

  9.   

    最近刚学了javascript,但没想到那么精深!!!
      

  10.   

    真是精华啊,前些日子刚学了javascript,都太基本了。这些总结的太及时了,谢谢楼主喽