zoukankan      html  css  js  c++  java
  • 关于Javascript"数组"那点事儿

    记住Javascript里没有“数组”
    忘掉一切吧,骚年...
    一切都是对象:书中还细分了下简单类型和对象类型
    基本类型:typeof xxx => "number"数字,"boolean"布尔,"string"字符串,还有两个特殊的成员(null,undefined)
    剩下的其他的是对象(有点像c#的引用类型)

    不是还有个数组吗?
    아니오.那个还不算真正的数组思密达。只能算是个“类数组”的假冒货,容我细细道来:
    var arr;//undefined
    arr=[];//typeof arr=>"object",arr.length==0
    这个对象比较特殊于普通Object的一点是有个length属性

    []-这个操作符当然啦不是“数组”的专属啦
    可以var b={hello:'world'};
    如访问对象属性值: b['hello']   //注意这里不能b[hello]直接,意义不一样,这里hello是个表达式(单个的就是变量啦),首先会计算这个表达式(一发现变量hello未声明就报错了)。

    可以实验:

    b[hello]='world';//ReferenceError: hello is not defined

    var hello;

    b[hello]='world';//这时hello声明了,值为undefined,转换为字符串'undefined'后作为“数组”的属性名

    所以console.info(b[undefined]);//会得到'world'


    对于使用'hello'作为属性名的可以var k='hello';alert(b[k]);这样就可以了。所以两者意义是不一样的。

    既然数组也是对象,所以也可以使用[]操作符

    //先设置几个“属性”,需要注意的是对数组来说,设置属性时,如果这个属性看上去是个非负整数的话,那么如果比当前length值大的话会加一并更新给数组的length属性,数组不要求“数字索引”(不是索引,同c#之类的不太一样)连续
    arr[999]='哈哈哈';//999>arr.length(==0),所以arr.length=999+1
    //但实际的arr来说不存在0-998这些键,arr看上去是这样的{999:'哈哈哈',length:1000} 

    自行测试: (判断是不是一个对象的属性名,可以用in操作符)

    999 in arr   ===>返回 true
    998 in arr  ====>返回 false

    []操作会计算它的表达式,并调用toString()转换一个字符串作为数组对象的属性名:

    arr['']=‘我是空’;//这也可以的,''不像整数不更新Length

    a['10']=123;//10比1000小,length不更新

    a[true]=1;//'true'做键

    a[1/0]='无穷';//1/0=>'Infinity'

    ...都是toString()....

    length也可以作为左值,可以修改的:

    arr.length=10000;//改大了,其实只是修改了length属性值而已,对元素没什么影响
    //好比 {....,length:10000}
    并不是前面多了N多个undefine,对于浏览器插件显示的有误,如chrome的控制台

    如果设置的比当前length值小,会截断:
    长得比length小的“类整数"键会抹掉,如"类数组{0:0,1:1,2:2,'true':true,8:'8',10:10,'':'empty',length:11}(注意:这里为了表达,故意用了个普通Object的形式~~)
    如果length设置为7,则只有小于7的“数字”属性名保留 
    {0:0,1:1,2:2,'true':true,'':'empty',length:11}

    当然了数组有个简洁的初始化语法 var a=[1,2,'true',undefined,false];

    上面的再提示一下:
    var a=[];
    a.length=5;

    var b=[undefined, 
    undefined, undefined, undefined, undefined];

    试试 3 in a 和 3 in b就知道区别了 

    还有关于”删除元素“提一下:

    var a=[1,2,3];

    delete a[1]; //1 in a ==false,会留下空档

    a[1]=undefined;不一样  // 1 in a ==true

  • 相关阅读:
    Scrapy之下载中间件与爬虫中间件
    Scrapy之twisted模块
    Scrapy之下载中间件中的代理中间件HttpProxyMiddleware
    Scrapy之start_urls、爬虫中间件之深度,优先级以及源码流程
    Scrapy之dupefilters(去重)以及源码分析/depth
    NOI 2013 书法家
    NOI2013 快餐店
    NOI2013 树的计数
    NOI2013 UOJ122 向量内积
    NOI2015
  • 原文地址:https://www.cnblogs.com/xcf007/p/3481101.html
Copyright © 2011-2022 走看看