zoukankan      html  css  js  c++  java
  • Javascript之旅——第二站:对象和数组

     原文出处: 一线码农的博客   欢迎分享原创到伯乐头条

    一觉睡到中午,本来准备起来洗洗继续睡,不过想想没辙,还得继续这个系列,走过变量的第一站,第二站我们再来看看对象和数组。

    一:对象

    说起对象,我们不自然就想起了面向对象中自封装的一个类,同样JS中也是遵循这个守则,在web编程中几乎天天用到的就是JSON。是的,这就是一个对象,不过这个对象下面的字段都是字符串和值类型,如下图。

    1
    2
    3
    4
    5
    var delivery = {
          no: 1,
          sendtime: "2014-11-25",
          way: "PJS"
    };

    从上面可以看出delivery中只具有基本的字符串和数值类型,当然给你玩的可不仅仅就这么多,除了基本的类型,我们还可以定义一个数组类型,函数类型字段,就像下面这样。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var delivery = {
            no: 1,
            sendtime: "2014-11-25",
     
            //三个可用配送地址
            address: ["北京", "上海", "南京"],
     
            way: "PJS",
     
            //根据逻辑是否支持配送
            cansend: function () {
                //logic code....
                return true;
            }
        };

    现在我们的delivery类刹那间就丰富起来了,有丰富的可用配送地址,有是否可以配送的逻辑运算,是不是有了C#中的类的感觉?可能有人会说,C#中有索引器,有属性,有事件等等这些,其实这些都是编译器给的语法糖,真的一点都不好玩,本质上都是些方法,有些人就会被这些糊弄到了而没有看到本质的东西。

    现在对象是创建出来了,下一步就是怎么用呢?通常有两种方法:

    <1>  ”.” 运算符

    这种方法,我想是人都应该知道,所以没什么好说的,比如:delivery.way。

    <2> 索引方式

    这种不知道有多少人清楚,就是用字符串索引的方法去寻找,比如我想去找delivery中字符串为“way”的字段值?因为这个“way”字符串可能来自用户的输入,那么这种情况在C#里面叫做后期绑定,只能用反射来寻找类的元数据,然后再输出强类型way的值,但是在JS中肯定是没有元数据的,不过大概也是用了类似反射的方法动态绑定的,说了这么多,我们来看看例子。

    可能有些人想问,JS在内部是不是用哈希做的,我只能说遗憾的是,不像C#可以反编译或者看看IL,但是在JS中你是没法看到底层做了些

    什么,不过我觉得看似哈希,其实跟C#反射差不多,毕竟key都是string,而value却是各种类型都有,string,function,int,array等等,

    有值类型,有引用类型,这些大杂烩都放到value,我觉的不好操作是一点,也不符合设计规范,既然觉得不是hash,在内部在寻找”way“的

    时候只能采用遍历的方式了。

    二:数组

    说起数组,先要看看数组的定义,两种方式,字面量和Array构造函数,如下图:

    1
    2
    var s = [1, "ctrip"];
    var a = new Array(1, "ctrip");

    不过要是你仔细观察,你也许会发现,字面量能做到的,array构造函数都能做到,字面量做不到的,array也能做到,比如初始化数组的个

    数。也就是array构造函数的第一个参数。

    因为看不到array中的底层代码,真是非常的伤心,所以我只能猜测一下,字面量[] 只是js提供给我们的语法糖,底层应该还是调用array的

    第二个重载函数。

    第二个觉得有意思的地方就是,我们会发现一个现象,数组居然还能和对象扯到一块,最后会搞得你眼花缭乱,也许这个就是无类型的灵活性,有利有弊吧。

    从图中我们可以看到,通过s.name=”cnblogs”这种类对象赋值的方式,可以将key和value加入到数组中,并且你还可以通过s.name和s["name"]输出结果值,这就说明数组本质上还是类,只不过在类里面做了一些高层封装,比如需要定时的统计length大小,也就造成了可以用两个方式输出结果值,不过这就造成了索引数组和关联数组并存的情况了。如果在C#里面,普通的索引数组,我们知道他们在堆中的空间具有连续性,这样就可以使用索引来达到O(1)查找,但是在js中这样各种类型混在一起,我想应该也没有办法做hash查找,因为这样hash函数真的很难做,让我写可能写不出来,不过同样很可惜的是,看不到array的源码,所以没有发言权了。

    然后数组方面就没什么好说的了,什么for和forin遍历,数组中常用的操作方法,比如pop,push,join,unshift,shift,大家都能看不到源码,也就只能见名识义的用吧。

  • 相关阅读:
    复杂模拟 | 1017 模拟N个顾客M个柜台进行排队
    徒手实现lower_bound和upper_bound
    树状数组 | 1057
    动态规划 | 最长回文子串 1040
    动态规划 | 背包问题 1068
    动态规划 | 对输入进行hash处理的LIS 1045
    总结那些有默认margin,padding值的html标签
    javascript 的七种基本数据类型
    牛客网笔试题整理
    JavaScript 的数据结构与算法
  • 原文地址:https://www.cnblogs.com/sunscheung/p/4341775.html
Copyright © 2011-2022 走看看