zoukankan      html  css  js  c++  java
  • 总结c#和javascript中常见的相关的"空"

    一、C#中的null、string.Empty和""
    1、null
    "null" means the object reference is invalid in .NET。
    null关键字是表示不引用任何对象的空引用的文字值,是引用类型变量的默认值。那么也只有引用型的变量可以为NULL,如果 int num=null,的话,是不可以的,因为Int是值类型的。
    Code
    2、string.Empty和""
    这个很好理解,string.Empty就是"",大多数情况下,二者可以互换。
    Code
    3、三者主要区别
    (1)、string.Empty是在String类的静态构造函数中定义的.并且注意,由于CLR的string  interning的作用(传说中的拘留池),string.Empty和""完全指向同一片内存区域,不会每次""都出现一个新的字符串引用(所以线程lock空字符串的时候是会出大问题的).
    Code
    (2)、三者的内存分配情况
    a、string strTest=null这样定义后,只是定义了一个string 类的引用,strTest并没有指向任何地方,在使用前如果不实例化的话将报错。
    b、string strTest=string.Empty这样定义后,strTest是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的。string.Empty不分配存储空间
    c、string strTest="",""分配一个长度为空的存储空间   
    Code
    (3)判定空字符串的几种写法
    Code
    二、JavaScript中的null,""和undefined
    编程世界里只有数据和代码两种基本元素。javascript中代码只体现为一种形式即function。javascript中数据则可以总结为简单数据和复杂数据两种。其中复杂数据只有一种即object,而简单数据包含null,undefined,boolean,number和string这五种。
    下面简要介绍一下简单数据类型:

    null                          和c#差距很大(引用类型?),可以理解为有那么一个概念,但没有东西。
                                  ps:typeof(null)返回object,但null并不是object,
                                  具有null值的变量也并非object

    undefined                     代表一切未知事物,什么也没有。我们熟知的window对象
                                  就有一个undefined属性。可以将undefined赋值给任何变量或属性,
                                  但并不意味着消除了改变量,反而会因此多了一个属性。 
                                  ps:typeof(undefined)返回undefined

    boolean                       true或者false,对就对,错就错,绝对明确,没有疑义
                                  
    number                        数值类型,线性事物,大小和次序分明,多而不乱,便于代码进行批量处理,
                                  也控制代码的迭代和循环等
                                  ps:typeof(NaN)和typeof(Infinity)都返回number。NaN参与任何数值计算
                                  的结果都是NaN,而且NaN!=NaN. Infinity/Infinity=NaN.

    string                        字符串类型,面向人类的理性事物,非常适合人机编程交流,直接高效
    千万注意,上面的单词都是小写的,不要和javascript内置函数Boolean,Number,String,Object,Function等混淆。
    下面比较一下null,""和undefined的异同点。
    1、typeof的结果比较
    Code
    2、length属性比较
    function funcTest()
    {
      
    var obj=null;
      
    var str="";

     
    //alert(obj.length); //null没有length属性
      alert(str.length); //0
     //alert(undefined.length); //undefined没有length属性
    }
    3、相等比较
    (1)“==”
    关于相等,要多看几个示例:
    a、null,"",0和undefined转为逻辑值的情况
    Code
    ps:除了false外加上null,0,"",NaN(NaN比较特殊,有个isNaN方法可以直接判断)和undefined之外,其他任何东西(简单类型值,对象或者函数)转换为逻辑值时都是true。最怪的是:
    b、null,0,""和undefined各自相等吗?
    Code
    从运行的结果看,除了null==undefined,""==false和0==false返回值为真之外,其他都不相等。js的灵活可见一斑。
    (2)全等("===")
    function funcTest()
    {
      
    var obj=null;
      
    var str="";

      alert(obj
    ===str); //false
      alert(obj===undefined); //false
      alert(str===undefined); //false
     
    }


    关于相等==讨论到这里本来就可以了,可是考虑到实际开发中的需要,我们额外记录一点经验之谈:
    (3)、数字和字符串比较
    Code
    4、与数值和字符串运算时
    function funcTest()
    {
     
    var num=123;
     alert(num
    +null);   //123
     alert(num+undefined);   //NaN
     
     
    var str="123";
     alert(str
    +null);   //123null
     alert(str+undefined);   //123undefined
     
    }
    可见,与数值运算时,null参与数值运算时其值会自动转换为0,而undefined参与任何数值计算时,其结果一定是NaN;
    对于字符串运算,把null和undefined原封不动”连接“就可以了。
    5、是否关键字
    null是javascript保留关键字,而undefined是有特殊含义的属性,但却不是javascript的保留关键字。
    至于说undefined是特殊含义的属性,看代码:
    function funcTest()
    {
     alert(
    'undefined' in window);   //true
     alert(undefined in window);   //true
     var obj = {};
     alert(
    'undefined' in obj);    //false
     alert(undefined in obj);    //false
    }
    这证明undefined是window对象的属性。
    ps:NaN和Infinity是window对象的另外两个特殊属性。这俩特殊属性都不是javascript的保留关键字.
    ok,浅显地总结一下。从上面的篇幅中,你看不出它们的本质方面的东西,但是关于“空”这个东东在平时的项目中几乎都会碰到(笔者不止一次两次地碰到过在方法体中null然后ToString()一下,虽然也知道null不能这么干,但是你不能保证他人写好的方法被你调用,null的情况有没有特殊考虑一下),希望能引起你的注意并对你有用。欢迎补充。


    作者:Jeff Wong
    出处:http://jeffwongishandsome.cnblogs.com/
    本文版权归作者和博客园共有,欢迎围观转载。转载时请您务必在文章明显位置给出原文链接,谢谢您的合作。

  • 相关阅读:
    javascript之DOMReady
    JQuery之proxy实现绑定代理
    javascript之数据推送
    javascript之高级函数应用思想
    函数的四种调用方式
    javascript多线程简介
    数组之迭代应用
    Git快速上手 : Tortoise工具使用
    Git 服务器搭建
    Git 安装与使用(二)
  • 原文地址:https://www.cnblogs.com/jeffwongishandsome/p/1497796.html
Copyright © 2011-2022 走看看