JavaScript高级程序设计(反刍)3

JavaScript不具备传统面向对象的编程语言中所支持的类和接口等基本结构,所以用类的概念描述一个引用类型不是特别的精确!

定义对象的方法:

  1. 使用new操作符跟Object构造函数
  2. 使用对象字面量的方法(因为属于连续定义,所以内部使用逗号分隔)

访问对象的属性可以使用点表示法,也可以使用方括号表示法
这里方括号表示法的优点是可以通过变量来访问属性,但是日常还是以点表示法为主。

Array类型:

创建数组的两种方式:

  1. 使用new操作符跟Array构造函数
  2. 使用对象字面量的方式直接定义

数组中可以放置任何类型的数据,一个数组中允许存在不同类型的数据,允许创建空数组,以及存在个数但不存在数据的数组。

var a1 = [“1”, 2, “3”, true];   //length=4,存放的String、Number、Boolean
var a2 = [];                    //length=0,空数组
var a3 = [1, 2, 3,];            //IE8之前为length=4,最后一位undefined,之后的全部浏览器改为length=3
var a4 =[ , , , , ,];           //IE8之前为length=6,全部为undefined,之后全部的浏览器改为length=5,全部为undefined

访问数组中的值可以直接使用值索引( array[number] ),如果索引小于数组的长度,那么直接返回数据,如果大于数组长度,需指定具体数值后,会数组拉伸至索引长度。

var a = [1,2,3,4];
a[5];
console.log(a);      //4
a[5] = 10;
console.log(a);      //5

数组中的length方法并非只是一个只读数据,而是可以操作数组的方法

var a = [1,3,4,5,6];
var b = a.length;
console.log(b);         //5
var c = a.length(3);
console.log(c);         //3; Array{1,3,4};
var d = a.length(4);
console.log(d);         //4; Array{1,3,4,undefined,undefined};

数组最多可以包含4292967295个项

检测数组可以使用instanceof() 方法或者isArray方法

数组转换成其他类型数据:

  1. toLocaleString()方法
  2. toString()方法,显式转换,直接转为String类型
  3. valueOf()方法
  4. alter()方法会隐式转换,先调用toString()方法,因为alter方法需要的是字符串参数
  5. join()方法,显式转换,但是这种方法可以设置分隔符

数组中的(先进后出)和队列(先进先出):
栈
数组中存在pop()方法与push()方法,从数组的尾端插入和取出,模拟栈
队列
数组中也存在unshift()与shift()方法,在数组的底端插入数据,在数组的顶端去除数据,模拟队列

重排序方法:

  • reverse()方法,反转数组项的顺序
  • sort()方法,升序排序

操作方法:

  • concat()方法,拼接数组(个人感觉还不如使用加号操作符)
  • slice()方法,截取数组,接收一个或两个参数,为截取开始的位置和结束位置
  • splice()方法,截取数组,接收1/2/3个参数,第一个参数为截取开始的位置,第二个参数为截取的个数,第三个参数为添加的参数(使用该方法组合形成截取/添加/替换方法)

位置方法:

  • indexOf()方法,从前向后查找数据
  • lastIndexOf()方法,从后向前查找数据
    两种方法都是找不到返回 -1

迭代方法:(个人还没感觉到具体的用处)

  • every(item, index, array)方法,全部为true则返回true
  • filter(item, index, array)方法,返回true项组成的数组
  • foreach(item, index, array)方法,没有返回值,与for循环类似
  • map(item, index, array)方法,返回函数每次调用结构组成的数组
  • some(item, index, array)方法,任意一项返回true,则返回true
    (item为数组项,index为索引,array为数组对象)

归并方法:(个人也还没感觉到具体的用处)

  • Reduce()方法,从前向后迭代所有项,构建一个最终返回值
  • ReduceRight()方法,从后向前迭代所有项,构建一个最终返回值
    两种方法都会接受四个值,prev前一个值,cur当前值,index项的索引,array数组对象

Date类型:
创建日期返回,但是这个类型个人感觉没必要非得掌握,也或许是个人阅历比较浅,返回值只是那么固定的几种,使用方面也基本上局限于日期时间的返回,构建一个以ajax方式交互的时钟,或者一个能活动的日历,其他地方一般用不到。
Data数据,直接使用new操作符创建即可,后面有比较具体的日期格式化方法,使用时依据个人情况判断即可

RegExp类型:
ECMAScript通过RegExp类型来支持正则表达式
var ecpression = / pattern/ flags ;
pattern:模式部分,也就是正则表达式部分,还是原来正常的正则表达式写法
flags:标志部分,g(global)表示全局应用,i(case-insensitive)表示不区分大小写,m(multiline)表示多行
(剩下的部分个人理解的可能比较有局限性,感觉并非特别重要,后续可能用到时,有了深入理解再补上)

Function类型:

函数名在前面的文章中已经给了一些描述,这里就不再具体的描述了。其根本就是函数名并非函数,而仅仅是函数创建时被同时创造出的一个指向函数的指针
也正是因为函数名仅仅是一个指针,所以在JavaScript中函数没有重载这一说法,当函数出现同名情况时,就是将指针的指向进行了调整,这时原来的指向失去作用,所以再次使用函数名调用该函数时,指针指向新位置,旧位置被放弃。

函数的声明与函数表达式还存在细微差别
函数声明在声明的时候就已经进行了解析,浏览器内置的解析器在执行代码前会先行阅读一遍全部的js脚本程序,将其中的函数声明都拿出来,进行解析,也就是在脚本执行之初,函数声明部分已经被率先被解析完毕了。
函数表达式则需要等到函数运行到该行代码的时候在进行解析。
也正是因为解析的事件和位置不同,所以函数声明可以在后面写,前面可以直接调用,而函数表达式则不可以!

函数的内部属性:

  1. arguments属性:存储函数参数的类数组
  2. this属性:引用函数执行的环境对象
  3. callee属性,指向拥有某个属性/对象的函数
  4. caller属性,调用当前函数的函数引用,严格模式下不能为函数的caller属性赋值

函数的属性:

  1. length()方法,能够获取函数的长度
  2. prototype属性,保存所有实例方法的地方(后面的章节有详解,这里不赘述)
  3. call()方法,改变this的指向,接收多个参数,第一个参数指向运行参数的作用域,后面的参数是要传递给另一个函数的参数(逐个列举)
  4. aplle()方法,改变this的指向,接收两个参数,第一个参数指向运行参数的作用域,第二个参数是要传递给另一个函数的参数(数组形式给出)
  5. bind()方法,创建一个函数的实例,this的值绑定到传递给bind()函数的值

基本包装类型:
ECMAScript提供了三个特殊的引用类型:BooleanNumberString
这里需要注意这三种引用类型与直接创建出来的基本类型不同,同时可以使用引用类型直接实现强制类型转换
尤其是在String类型中,存在很多新方法:

  1. trim()方法,去除空格t
  2. oUpperCase()方法,变为大写
  3. toLocaleLowerCase()方法,变为小写
    (还有其他的一些方法个人觉得用处不大就没有写出,有需要的同学可以直接去这本书的P130查看)

Global对象:
Global对象是ECMAScript中最为特殊的一个对象,这个对象是一个全局对象,但是你是感觉不到它存在的。但是它是所有对象中最底层的一个,在全局作用域中定义的属性和函数都是Global对象的属性

URI编码:
EncodeURI()方法和encodeURIComponent()方法都是对URI进行编码,但是前者仅对主域名“/”后进行编码,而后者对于所有都进行编码
DecodeURI()方法和decodeURIComponent()方法对URI进行解码
Eval()方法,ECMAScript中最强大的方法,方法直接执行包含在其中的代码,且该代码的执行环境为所处的函数内执行环境,与函数的执行环境一致,也具有相同的作用域链。严格模式下为eval赋值会报错,且这种方法可以被用于代码注入。
Global是window对象的一部分

Math对象:
属性
Math.ceil()向上舍入、Math.floor()向下舍入、Math.round()标准四舍五入
random()随机数:
value = Math.floor( Math.random()*可能值总数 + 第一个可能值 )
(计算中如果不熟悉,可以使用“可能值总数+第一个可能值-1”的方法确定区间,也就是 “第一个可能值 —— 可能值总数+第一个可能值-1” )
方法

猜你喜欢

转载自blog.csdn.net/Feng_ye__/article/details/89281779