zoukankan      html  css  js  c++  java
  • JavaScript大杂烩5

    1. 类型检查:instanceof与typeof

      这是两个相似的操作符,instanceof用于检测函数的实例类型,主要是在面向对象编程中检查new出来的对象类型,需要注意instanceof是检查function对象的,前面实现的复制继承中的例子就不适用于使用instanceof来检查继承关系了。typeof,它用于检测变量的类型,在实际情况中应用的不是很多,稍微了解一下就可以了。

      在使用typeof之前,有一点需要确认,那就是string与String不是同一个类型,这个不用多说了,我们前面说过了,前一个是类似于值类型的基元类型,后一个是类似于引用类型的其对应的包装类型,而且默认使用字面量定义的基本类型都是前一种,就是"值类型"。

      了解了这个,我们就可以测试如下代码了:

    alert(typeof 'Frank');        // string
    alert(typeof 0);              // number
    alert(typeof true);           // boolean
    alert(typeof function(){});   // function
    alert(typeof {});             // object
    alert(typeof null);           // object
    alert(typeof undefined);      // undefined

      上面是基本的用法,其实通常也不会有太多的人使用用,毕竟动态语言不是太关注静态的类型,而且typeof只会返回上面出现的6中类型,像String这种包装类型和Array这种内置的对象全部返回object,所以很多场合这个返回值没什么意义。

    2. 对象的成员遍历:for..in,for与foreach
      对象遍历很简单,上面拷贝成员的时候,使用for..in操作符,遍历对象成员(注意会查找原型上的成员),然后拷贝出来。
      其实从上面对象字面量的定义方式来说,对象本质是键值对,就是常说的Map结构,是一种集合。
    对于集合(内置常用有Object和Array这两个集合)的遍历,历来有这么几种方式:
    1). for循环
      这是预先可以知道长度的集合的推荐访问方式,Array这个超级集合的遍历属于这种方式,看个例子:

    var names = ['Dong', 'Frank'];
    for(var i = 0, len = names.length; i < len; i++) {
      alert(names[i]);
    }

    2). for/in循环

      这是预先无法知道长度的集合的访问方式,对象成员的遍历属于这种,看个例子:

    var person = {
      name: 'Frank',
      age: 10
    };
    
    for(item in person) {
      if (person.hasOwnProperty(item)){
        alert(person[item]);
      }
    }

      当然了预先知道长度的集合也可以使用这种方式遍历,但是JavaScript不推荐这么做,因为for..in会访问原型链上的东东。所以通常来说,我们只使用for..in遍历对象的成员,而使用for遍历Array集合。

    3). 对象的forEach之类的方法 
      这是Array的内置方法,不多说了,简单看个例子:

    ['foo', 'bar', 'baz'].forEach(function(element, index, array){ console.log(element, index, array); });

      这个方法很好很强大,我们经常用它。


    3. hasOwnProperty

      JavaScript遍历对象有一个特点,这个上面也说到了,那就是遍历成员的时候,它会沿着对象本身和原型链来查找成员,所以很多时候需要知道一个成员是否是对象自身定义的,而不是原型链上带来的,这个时候就需要使用对象的方法hasOwnProperty了。

      hasOwnProperty是唯一的一个不会到原型链上查找的成员,它只会在对象本身检查是否包含某一个成员。体会下面两种遍历的区别:

    // 注意,这里只是一个例子,实际编程中并不推荐修改内置的对象
    Object.prototype.bar = 1;
    // foo的原型指向Object的原型,形成原型链
    var foo = {moo: 2};
    for(var i in foo) {
      alert(i); // 输出moo与bar
    }
    
    for(var i in foo) {
      if (foo.hasOwnProperty(i)) {
        alert(i);  // 只输出moo
      }
    }

    4. 对象的特殊用途

      对象是数据类型,而且是特殊的集合,这个特性使得我们可以使用对象模拟很多特殊的用途。
    1). 作为Dictionary
      这个不用说了,因为对象的本质就是键值对,也就是key和value可以是任何类型的广义的Dictionary。当做Dictionary自然是很方便的:

    var keyValueMap = {};
    keyValueMap['key1'] = { name: 'Dong'};
    keyValueMap['key2'] = { name: 'Frank'};
    
    alert(keyValueMap['key1'].name);
    alert(keyValueMap['key2'].name);

    2). 作为enum

      键值对当然可以作为enum使用了,看个例子:

    // 对象作为枚举来使用
    var LanguageType = {
      English: 0,
      Chinese: 1
    };
    
    function showLanguage(languageType) {
      // 枚举的黄金搭档:switch语句
      switch(languageType) {
        case LanguageType.English: {
            alert('English');
            break;
          }
        case LanguageType.Chinese: {
            alert('Chinese');
            break;
          }
        default:
          break;
      }
    }
    
    showLanguage(LanguageType.English);
    showLanguage(LanguageType.Chinese);

    3). 作为namespace

      基本上为了组织代码的方便,高级语言都提供了namespace这种结构,这个在JavaScript中也可以使用对象来模拟: 

    var application = application || {};
    application.server = {
      config: function() {
        alert('server config');
      }
    };
    application.server.config();

       当然还有另外一种使用自执行函数实现的namespace:

    var namespace = (function () {
     
        // 定义namespace下的私有成员
        var privateMethod1 = function () { alert('M1'); }
        var privateMethod2 = function () { alert('M2'); }
        var privateProperty1 = 'foobar';
     
        return {
            // 返回namespace中公开的成员
            publicMethod1: privateMethod1,
     
            //nested namespace with public properties
            properties:{
                publicProperty1: privateProperty1
            },
     
            // 嵌套的namespace
            utils:{
                publicMethod2: privateMethod2
            }
            //...
        }
    })();
    
    namespace.publicMethod1();

      这些实现比较灵活,组织起来的代码也比较清晰,团队也较容易协作。

    5. JSON是对象吗?

      要回答这个问题,我们需要先了解什么是JSON。
    1). JSON的定义
      JSON( 全称为JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于JavaScript语法标准的一个子集。它采用完全独立于语言的文本格式,可以很容易在各种网络、平台和程序之间传输。JSON的语法很简单,易于人阅读和编写,同时也易于机器解析和生成。
      通俗的讲:

    a. JSON是一种字符串,其是语言中立的,任何语言都可以访问,读写这种字符串。
    b. 书写这种字符串是需要一定规则的,这就是JSON的语法。
    c. 把JSON字符串写到文本文件中,然后把这个文件的扩展名改成".json",就是通常的JSON文件,很多的程序可以直接读取这种文件,这种文件通常用于网络传输。

    2). JSON语法
      JSON语法是JavaScript对象表示法语法的子集,所以就是如下几点:

    a. 数据在名称/值对中:名称是字符串,使用双引号表示。值可以是:数字(整数或浮点数),字符串(在双引号中),数组(在方括号中),对象(在花括号中),true/false/null。
    b. 数据由逗号分隔
    c. 花括号保存对象:对象可以包含各种数据,包括数组。
    d. 方括号保存数组:数组可以包含对象。

      例如:

    {
      "employees": [
        {
          "firstName": "Bill",
          "lastName": "Gates"
        },
        {
          "firstName": "George",
          "lastName": "Bush"
        }
      ]
    }

      有一点需要注意,如果JSON中含有转义字符,则需要转义。例如文件路径中需要使用"\"而不是""。例如:{ "file":"C:\a.txt"}。

    3). JSON vs. JavaScript的对象字面量
      搞清楚了JSON的本质,这个比较就很简单了,JSON是一种文件格式,读出来的是字符串,只不过这些字符串是按照对象字面量的语法组织起来的。
    4). JSON vs. Text
      JSON是文本格式,相对于以其他形式组织起来普通的文本来说,解析简单,很多语言都提供内建的类库方便编程,尤其是JavaScript,天生支持JSON的解析。
    5). JSON vs. XML
      可读性的比较:JSON和XML的可读性相比较而言,由于XML提供很多辅助的标签,更加适合人阅读和理解。
      文件大小与传输难度的比较:XML允许使用方便的标签,所以文件尺寸是要比JSON大的。而且JSON源于JavaScript对象字面量的语法,所以天生的主战场是JavaScript与网络,在这里,JSON有着XML无法赶超的优势。
    6). JSON Object
      在新的浏览器中,JavaScript确实内置了一个叫JSON的对象,这个对象的功能很简单,就是解析JSON字符串变成JavaScript的对象,和将JavaScript对象转变成JSON字符串,说白了,就是别的语言中序列化与反序列化的过程,简单看个例子:

    var json_string = '{ "name": "frank" }';
    // 将字符串反序列化成对象
    var obj = JSON.parse(json_string);
    alert(obj.name);
    // 将对象序列化成JSON字符串
    var json_string_copy = JSON.stringify(obj);
    alert(json_string_copy);
  • 相关阅读:
    tomcat虚拟目录配置
    关于JS闭包
    数据列表里结合负边距做间隔线的技巧需注意的小细节
    前端优化技巧笔记
    浏览器工作原理相关笔记
    工作小心得(关于绝对定位元素)
    关于定位和溢出处理的一些小经历
    关于定位和z-index的一些小经历
    fullpage实现(-)
    移动端布局-实例
  • 原文地址:https://www.cnblogs.com/dxy1982/p/3766606.html
Copyright © 2011-2022 走看看