zoukankan      html  css  js  c++  java
  • 《JavaScript高级程序设计》读书笔记(五)引用类型

    内容
    ---使用对象
    ---创建并操作数组
    ---理解基本的JavaScript类型
    ---使用基本类型和基本包装类型


    引用类型
    --引用类型的值(对象)是引用类型的一个实例
    --在ECMAScript中,引用类型是一种数据结构
    --用于将数据和功能组织在一起,也常称为类(并不妥当)
    --尽管ECMAScript从技术上讲是一门面向对象的语言
    --但是它不具备传统的面向对象语言所支持的类和接口等基本结构
    --引用类型有时候也被成为对象定义,描述一类对象所句有的属性和方法
    --引用类型和类并不是一个概念

    --使用new操作符后跟一个构造函数来创造新的对象
    --构造函数本身就是一个函数,只不过该函数处于创建新对象的目的而定义

    var person = new Object();
    --创建Object引用类型的一个新实例,并保存在变量person中
    --Object只为新对象定义了默认的属性和方法


    Object类型
    --使用new操作符后跟一个构造函数来创建Object实例

    var person = new Object();
    person.name = "luking";
    person.age = 22;
    --使用对象字面量表示法
    --不会调用Object构造函数

    var person = {
    name:"luking",
    age:22,
    "str":"asdasd"
    };
    --数值属性名会自动转化为字符串

    var person = {}; //等同于new Object()

    --访问对象属性时,可以使用点表示法,也可使用方括号语法
    --方括号语法可以接受变量

    person.name;
    person["name"];
    var name = "name";
    person[name];
    person["first name"]; //点表示法无法访问这种属性


    Array类型
    --ECMAScript中的数组的每一项可以保存不同类型的值
    --大小是动态的,可以随着数据的添加自动增长

    --使用Array构造函数,创建数组

    var colors = new Array(); //[]
    var colors = new Array(10); //[empty x 10]
    var colors = new Array("red","green","blue"); //["red","green","blue"]

    --可以省略new 操作符
    --使用数组字面量表示法创建
    --不会调用Array构造函数

    var colors = [];
    var colors = ["red","green","blue"];
    var colors = [1, 2, , ]; //不建议
    --空的逗号代表值为undefined
    --最后一位加逗号,一般浏览器不识别,IE8-会识别并多一位undefined

    --从0开始的索引,读取数组
    --数组length属性表示数组长度
    --length是动态的,修改其值,会增加(undefined)或着删除数组项
    --为超出length的索引项设置值,会更新length属性
    --中间的未赋值项是undefined
    --length上限为42亿
    --添加超过上限的项会异常
    --初始大小于上限接近的数组,会运行时间超长的脚本错误


    检测数组
    --对于同一个全局作用域 instanceof可以判断是不是array
    -- value instanceof Array
    --如果页面中包含多个框架,就会有多个全局执行环境
    --就会有两个以上不同版本的Array构造函数
    --es5新增Array.isArray()方法判断是不是数组


    转换方法
    --对象都具有,toLocaleString().toString()和valueOf()方法
    --toString()方法返回数组每一项的字符串形式以逗号拼接的一个字符串
    --会调用每一项的toString()方法,拼接成整个字符串
    --valueOf() 返回这个数组的指针
    --alert(),会自动调用toString()方法用于输出字符串
    var a = [1,2,"red"];
    a.toString(); //"1,2,red"
    a.valueOf(); //[1,2,"red"]

    --toLocaleString()方法于toString()类似
    --toLocaleString()会调用每一项的tolocalString()方法

    var person1 = {
    toLocaleString:function() {
    return "local1";
    },
    toString:function() {
    return "string1";
    }
    };
    var person2 = {
    toLocaleString:function() {
    return "local2";
    },
    toString:function() {
    return "string2";
    }
    };

    var people = [person1,person2];
    people.toString(); //"string1,string2"
    people.toLocaleString();//"local1,local2"

    --tolocaleString(),toString(),valueOf()默认以逗号分隔
    --join(String)函数会返回以String为分割符的数组字符串
    --String不写或传递undefined 默认以逗号分隔
    --传入null 则会以"null"为分割符
    --如果某一项是null或者undefined,
    --tolocaleString(),toString(),valueOf(),join()都以空字符串对待

    var colors = ["red", "blue", "green"];
    colors.join("-"); //"red-blue-green"
    colors.join(); //"red,blue,green"
    var u = undefined;
    var n = null;
    colors.join(u); //"red,blue,green"
    colors.join(n); //"rednullbluenullgreen"


    栈方法
    --数组提供实现栈操作的方法,来把数组当成栈数据结构来使用
    --栈 LIFO(last-in-first-out,后进先出),最新添加的项最早被移除
    --栈中项的插入(推入)和移除(弹出),只发生在栈顶
    --push() 入栈,pop() 出栈
    --push(args,....) 可推入任意数量的参数,推入栈中,并修改length的长度,并返回
    --pop() 弹出最后一项,并length-1


    队列方法
    --FIFO first-in-first-out 先进先出
    --shift(); 取得数组第一项,并length-1
    --push(args,...),同上

    --unshift(args,...) 在数组前端插入任意长度项,并修改length长度,并返回length
    --参数顺序 就是插入后 项的顺序,不会颠倒过来
    --结合pop()方法,可实现反向队列


    重排序方法
    --返回值都是重排之后的数组的索引值

    reverse() 反转数组序列
    --直接对原数组反转,影响原数组

    sort(function) 排序
    --默认升序排序,调用每一项的toSting()方法,进行字符串排序
    --可接受一个比较函数实现自定义排序
    --比较函数接受两个参数a,b
    --a<b return 负数, a==b return 0,a>b return 正数

    function compare(v1, v2) {
    if(v1 < v2) {
    return-1;
    } else if (v1 > v2) {
    return 1;
    } else {
    return 0;
    }
    }
    var vs = [0, 1, 5, 10, 15];
    vs.sort(); //[0, 1, 10, 15, 5]
    vs.sort(compare); //[0, 1, 5, 10, 15]

    --改变compare的返回值可以实现不同的排序
    --对于数值类型或者valueOf()会返回数值的对象类型可以简化compare函数

    function compare(v1, v2) {
    return v2 - v1;
    }


    数组操作方法

    concat(args,....);
    --基于当前数组的所有项创建一个新副本,并把接受的参数添加到这个副本的末尾
    --如果参数是数组,则把每一项都添加到副本中
    --如果不是数组,则简单的添加

    var colors = ["red", "green", "blue"];
    var colors2 = colors.concat("yellow", ["blcak", "brown"]);

    colors; //["red", "green", "blue"]
    colors2; //["red", "green", "blue", "yellow", "blcak", "brown"]

    slice(start[,end])
    --基于当前数组的一段(一个或者多个)创建新数组,一个参数或者两个
    --参数表示返回项的起始和结束,[start,end) 左闭右开
    --如果参数是负数,表示倒数,
    --开始位置必须在结束位置左边,否则取段无效,返回空数组
    --不在范围的取段 返回空数组

    var v = [0,1,2,3,4,5];
    v.slice(0,3); //[0, 1, 2]
    v.slice(2,3); //[2]
    v.slice(2); //[2, 3, 4, 5]
    v.slice(0,-2); //[0, 1, 2, 3]
    v.slice(-1,-2); //[]
    v.slice(-2,-1); //[4]

  • 相关阅读:
    UVALive 7141 BombX
    CodeForces 722D Generating Sets
    CodeForces 722C Destroying Array
    CodeForces 721D Maxim and Array
    CodeForces 721C Journey
    CodeForces 415D Mashmokh and ACM
    CodeForces 718C Sasha and Array
    CodeForces 635C XOR Equation
    CodeForces 631D Messenger
    田忌赛马问题
  • 原文地址:https://www.cnblogs.com/loveluking/p/9445094.html
Copyright © 2011-2022 走看看