首页 > 编程语言 > 详细

犀牛读书笔记--数组

时间:2015-11-09 23:50:14      阅读:183      评论:0      收藏:0      [点我收藏+]
page128 6.4检测属性

javascript对象可以看作属性的集合,类似下面例子
 var obj={
     v:"变量",
     foo:function (){},

 }
 判断某个属性是否存在于对象中,可以用in运算符,hasOwnProperty()和propertyIsEnumerable()
使用格式:
"v" in obj;
"foo" in obj;

obj.hasOwnProperty("v");
obj.hasOwnProperty("foo");

propertyIsEnumerable()是hasOwnProperty()的增强版,只有检测到这个自有属性的可枚举性为true时才会返回true;


page130 可枚举性

for/in循环可以在循环体中遍历所有可枚举的属性(包括自有属性和继承的属性)
var obj={
 v:"变量",
 foo:function (){},
 }
 for(p in obj){
     console.log(p);
 }

object.create(obj);用于创建一个继承至obj的对象

page132 属性的setter和getter

  var o={
            $x:"我是o",
            get getX(){
                return this.$x;
            },
            set setX(x){
                this.$x=x;
            }
        };

调用时:
    console.log(o.getX);
    o.setX="new Obj";
    console.log(o.setX);

6.7属性的特性
    对象的属性有四个特性:(1)值(2)可写性writeable(3)可枚举性(4)可配置性
     
     var txt=Object.getOwnPropertyDescriptor({x:1},"x");
       console.log(txt);
    上面语句可用于查询一个对象的某个属性(自有属性,访问不到继承属性)的四大特性。

原型:
    通过字面量创建的对象采用 Object.prototype 作为原型
    通过new创建的对象采用构造函数的原型
    通过object.create()创建的对象使用第一个参数作为创建的对象的原型。

序列化对象:
    str=JSON.stringify(o);
    p=JSON.prase(str);


page144  数组

数组的创建
a.直接使用方括号,数组可以存储不同类型的元素  
var empty=[];
var primes=[1,2,3,4,5];
var misc=[1,true,2,"a"]; 

b.数组直接量可以不为常数
var base=1024;
var arr=[base,base+1,base+2,base+3]

c.数组可以包含数组or对象字面量
var foo=[[1,2,3],{x:1,y:2},[{foo:function...},{foo2:function...}]]

d.利用Array构造函数创建,调用时可以有个数值参数,为数组的长度
var arr1=new Array();
var arr2=new Array(10);

数组是对象的特殊形式,使用方括号访问数组元素就像用方括号访问对象的属性一样
对一个常规对象
    var o={};
    o[1]="one";
    数组就是将索引值变成字符串
    数组于常规对象的不同之处在于,使用2^32以内的非负整数作为属性名时,会自动维护其length的属性值
    事实上数组的索引与对象的属性名并无不同之处,所以数组的访问也不存在越界一说
    访问不存在的数组索引就像访问没定义的对象属性一样,返回undefined

数组属性length的特殊行为
a=[1,2,3,4,5];
a.length=3;//此时数组中只存在[1,2,3]
a.length=0;//此时数组中不存在元素
a.length=5;//数组等价于new Array(5)
给数组的length赋值会改变数组的内容

在E5中  可以让数组的length属性变为只读的
a=[1,2,3];
Object.defineProperty(a,"length",{writable:false});
这样数组的长度就不可以改变了
给一个定义了只读的数组push元素,程序会报错

pop()对应push("param"),push在数组尾部加上"param"元素,而pop()则删除数组最后一个元素,并返回这个删除的元素
shift()于unshift(),shift用于删除数组的第一个元素,并将后面的元素索引往前移动。而unshift则添加参数。

常用数组方法:
1.Array.join();
    将数组中所有元素转化成字符串并拼接在一起
        当其中有参数时,用参数字符串分割各元素;无参数时,默认为逗号:例如"1,2,3,4,5" "1-2-3-4-5"

2.Array.reverse();
    将数组颠倒顺序

3.Array.sort(function);
    排序,当没有参数时,以字母表顺序排序,undefined排在最后
        当要求以字母表顺序排序时,需指定一个比较函数传进sort()内;
        var a=[22,3,444,1111];
        a.sort();//字母表排序
        for(var i=0,len=a.length;i<len;i++) console.log(a[i]);
        a.sort(function(a,b) {return b-a});//函数返回正值,b在a之前,返回负值,b在a只后

    将字符串按忽略大小写的字母表排序

    var str=["ant","Bug","Dog","cat"];
    str.sort(function(s1,s2){
        st1=s1.toLowerCase();
        st2=s2.toLowerCase();
        if(st1>st2)return 1;
        if(st1<st2)return -1;
        return 0;
    })
    for(var i=0,len=str.length;i<len;i++) console.log(str[i]);

4.Array.contact()创建并返回一个新数组

5.Array.slice()返回指定数组的子数组
    Array.splice()与slice功能相似,但是splice会修改母数组

ECMA5中定义的数组方法:
1.forEach(function(v,i,arr){
    arr[i]=v+1;
});//回调函数读取v 元素值,i 元素索引,arr数组本身
    
    //模拟实现
       var o = {
            forEach: function (callback) {
               // alert(this.length);
                for (var i = 0, len = this.length; i < len; i++) {
                    callback && callback(this[i], i, this);
                }
            },
            get length(){
                var sum=0;
                for(var n in this) {
                    sum+=1;
                }
                return sum;
            }

        };
        Object.defineProperty(o,"length",{enumerable:false});
        Object.defineProperty(o,"forEach",{enumerable:false});

        /* 特别注意defineProperty和defineProperties的使用
        Object.defineProperties(o,{
               length:{enumerable:false},
             forEach:{enumerable:false}
        });
        */


        o[0] = 0;
        o[1] = 1;
        o[2] = 2;

        o.forEach(function(v,i,arr){
            arr[i]=v+1;
            console.log(arr[i]+"callback");
        });
    

2.map() 
    调用示例:
        a=[1,2,3];
        b=a.map(function(x){return x*x;});
    map返回一个数组,一个元素值在回调函数操作过后的数组

    //模拟实现
      map:function(callback){
                var temp=[];
                for (var i = 0, len = this.length; i < len; i++) {
                    temp[i]=callback && callback(this[i]);
                }
                return temp;
            },

3.    filter()
    every() 
    some()

数组对象的一些方法
isArray()

 

犀牛读书笔记--数组

原文:http://www.cnblogs.com/windSamW/p/4951452.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!