第5章 引用类型

5.1 Object

let person = {}
let person = new Object()
person.name = 'Nicholas';

5.2 Array

let colors = ['red','blue','yellow']
let colors = new Array('red','blue','yellow')
colors[0] //red
colors.length //3

5.2.2 转换方法

toString() / valueOf() / toLocalString() / join(',')

let colors = ['red','blue','yellow']
alert(colors.toString()) // "red,blue,yellow"
alert(colors)// "red,blue,yellow"
//alert只接收字符串,所以隐性调用toString方法

let person1,person2 = {}
let people = [person1,person2]
//如果组数中存着对象,则会调用每一项对象的toString方法

5.2.3 栈方法

让数组表现的像栈一样,Last-In-First-Out,后进先出
push() / pop()

let colors = [];
colors.push('red','green') //在数组后面推入两项,返回长度
colors.pop() //在数组后面移除一项,返回移除项

5.2.4 队列方法

让数组表现的像堆一样,First-In-First-Out,先进先出
unshift() / shift()

let colors = [];
colors.unshift() //在数组前面推入两项,返回长度
colors.shift() //在数组前面移出一项,返回移除项目

5.2.5 重排序方法

reverse() 反转排序,返回排列后的数组
sort() 自定义排序,默认转toString后按字符串排序,返回排列后的数组

let values = [0,1,5,10,15]
values.sort() // 0,1,10,15,5
function compare(value1,value2) {
  if(value1<value2){
    return -1; //值小,返回-1,排前面
  }else if(value1>vlaue2) {
    return 1 //值大,返回1,排后面
  }else {
    return 0 //相等,不变
  }
}
values.sort(compare) // 0,1,5,10,15

5.2.6 操作方法

concat() / slice() / splice()

let colors = ['red']
let colors2 = colors.concat('blue',['black'])// ['red','blue','black']
//concat() 创建一个数组副本,可添加额外参数

let colors = ['red','blue','black'];
let colors2 = colors.slice(0,2); //['red','blue']
//slice(start,end)分割数组,end不包括最后一个

splice(0,1,'A','B') //从0开始,删除一个,添加一个A字符,添加一个B字符

5.2.7 位置方法

indexOf() / lastIndexOf()
从头查 / 从尾查,从0开始数起

5.2.8 迭代方法

every() / some() / filter() / forEach() / map()

  1. 每个方法都接收两个参数:
    在每一项上运行的函数(必须)和运行该函数的作用域对象(可选)
  2. 传入这些方法的函数都接受三个参数:
    该数组项的值,该数组项的位置,和该数组本身
let number = [1,2,3,4,3,2,1]
let fun = (item,index,array)=>{ return (item>2) }
let fun2 = (item,index,array)=>{ return (item*2) }
number.every( fun ) //false ; 全true返true,否则返false
number.some( fun ) //true ; 有true就返true,没有返false
number.filter( fun ) //[3,4,3] ; 筛选出返回true的项,组成数组
number.map( fun2 ) //[2,4,6,8,6,4,3,2] ; 返回结果所组成的数组
number.forEach( ( item,index,array )=>{ ... } )

5.2.9 归并方法

reduce() / reduceRight()

  1. 这两个方法都会迭代数组的所有项,然后构建一个最终的返回值。
  2. reduce()从数组的第一项开始,逐个遍历到最后一项
  3. educeRight()从数组的最后一项开始,逐个遍历到第一项
  4. 这两个方法都接收两个参数:
    在每一项上调用的回调函数,和作为归并基础的初始值(可选)
  5. 回调函数接收4个参数:前一个值,当前值,项的索引,数组对象
let num = [ 1, 2, 3, 4, 5 ]
let fun = ( prev, cur, index, array )=>{ return prev+cur }
num.reduce( fun ) //15
num.reduceRight( fun ) //15

5.3 Date类型

new Date() //创建一个Date对象
Date.parse() //接收一个字符串返回相应的毫秒数
new Date( Date.parse("2018/06/22 08:00:20") )
简写:new Date("2018/06/22 08:00:20")

5.3.1 继承的方法

toString() / toTimeString() / toDateString()
toLocaleString() / toLocaleTimeString() / toLocaleDateString()
indexOf() 毫秒数
toString与toLocaleString每个浏览器重写的都不同,所以没什么价值

5.3.2 日期/时间组件

getTime() //返回日期毫秒数,与valueOf值相同
getFullYear() //返回4位数年份
getMonth() //返回月份 0-11
getDate() //返回日数 1开始
getDay() //返回星期数 0为星期天
getHoure() //返回小时数 0-23
getMinutes() //返回分钟数 0-59
getSeconds() 返回秒数 0-59

5.4 RegExp类型

创建正则表达式

var expression = / pattern / flags
//flags:用以标明正则表达式的行为
//pattern:正则表达式描述字符
  1. 标志:g(全局) / i(不区分大小写) / m(表示多行)
  2. 常用元字符:
    . /w /W /d /D /s /S
  3. 描述字符范围:
    [abc] ^abc [0-9] [a-z] [A-Z] [A-z]
  4. 选择匹配:|
  5. 重复匹配:
    n+{1,} / n*{0,} / n?{0,1}
    n{x}(包含x个n) / n{x,}(最少x个n) / n{,y}(最多y个n) / n{x,y}(最少x个n,最多y个n)
  6. 边界量词:^ 匹配开头 / $ 匹配结尾
  7. 声明量词:
    正向声明:匹配模式(?=匹配条件) //满足条件才匹配
    反向声明:匹配模式(?!=匹配条件) //不满足条件才匹配
  8. 子表达式:(),用括号对匹配模式进行分组

5.4.2 RegExp实例方法

exec() / test()

let text = "mom and dad and baby";
let pattern = /mom( and dad( and baby))/g
pattern.exec(text);
//exec() 捕获分组

let text = 'ggle gogle google';
let pattern = /go?gle/g
pattern.exec(text) //true
//test() 是否匹配 返回布尔值

5.4.3 字符串的正则匹配方法

match() / search() / replace()

var s = "ggle gogle google gooogle";
var pattern = /go?gle/g;
s.match(pattern) //[ggle,gogle];
//match() 本质上是调用exec(),接收一个正则表达式,返回数组

var text = 'cat,bar,sat,fat';
var pos = text.search(/at/); //1
//search() 返回匹配项的第一个索引值

var text = 'cat,bar,sat,fat';
text.replace(/at/g,'ond') //cond,bond,sond,fond
//replace() 替换正则匹配项

5.5 Function 类型

  • 每个函数都是Function的实例,Function原型是Object。
  • 每个函数都是对象,与其他引用类型一样有属性与方法。
  • 函数名是基本类型指针,指向函数对象,所以不会与某个函数绑定;
function sum(x,y){ return x+y } //定义一个sum函数
sum(10,10) //20,sum指向该函数对象
var cp = sum; //cp也指向该函数对象
sum = null; //sum断开指向
cp(10,10) //20,sum依旧指向该函数对象

5.5.1 没有重载

  • 将函数名看为指针,就很好理解函数没有重载,
  • 第二个函数的引用覆盖了第一个函数的引用
function add(x){ return x+100 }
function add(y){ return y+200 } //add(100),300
add = (x)=>{return x+100}
add = (y)=>{return y+200} //add(100),300

5.5.2 函数声明与函数表达式

  • 解析器会提前读取函数声明,在任何代码执行之前就可以访问
  • 而函数表达式需要执行到他所在的代码时才会被解释执行
alert(sum())
function sum(){} //函数声明提升,可执行
alert(sum())
let sum = ()=>{} //报错

5.5.3 作为值的函数

  • 函数名本身就是变量,所以把函数当成变量一样进行传递
  • 将一个函数当成参数传给另一个函数
  • 或者在一个函数中把函数作为返回值返回

5.5.4 函数内部属性

两个特殊对象:arguments / this

  1. arguments,类数组对象,包含着传入函数中的所有参数
arguments.callee //指针,指向拥有这个arguments对象的函数
arguments.callee() //调用函数,递归避免函数的执行与函数名绑定
Function.caller() //指针,指向调用该函数的函数引用,全局返回null
  1. this,引用的是函数执行的环境对象,网页全局函数执行对象是window
window.color = 'red';
var o = {color='blue'};
function sayColor(){
  alert(color);
}
sayColor() //red,sayColor执行环境对象为window,this=window
o.sayColor = sayColor;
o.sayColor() //'blue',say执行环境对象为o,this=o

5.5.5 函数的属性和方法

属性:length / prototype

  1. length 形参数量
  2. prototype 原型

方法:call() / apply() ,更改函数执行环境对象即this,并传递参数

  1. applay()
    接收两个参数:函数的执行环境对象,参数组数( [] || arguments )
window.color = 'red';
var o = {color:'blue'};
function sayColor(){ alert(color) }
sayColor.call(this) // 'red'
sayColor.call(window) //'red'
sayColor.call(o) // 'blue',this=o
  1. call()
    与applay作用相同,不同的是接收参数的方式不同:
    第一个参数一样,但是传递给函数的参数需要一个个单独列出
function sum(num1,num2){
  return num1+num2;
}
function callSum(num1,num2){
  return sum.call(this,num1,num2)
}
sum.callSum(10,10) //20
bind() //创建一个函数实例,有相同属性和方法,并更改指定执行环境对象
  1. bind()
    拷贝,或者将多个对象结合
window.color = 'red';
var o = {color:'blue'};
function sayColor(){
  alert(this.color)
}
sayColor() // 'red'
var copySayColor = sayColor.bind(o);
copySayColor() // 'blue'

5.6 基本包装类型

  1. 三个特殊的引用类型:Boolean / Number / String
  2. 基本类型可以调用方法是因为有隐式包装类型转换的过程
    var s1 = 'some text';
    var s2 = s1.substring(2);
  3. 引用类型与基本包装类型主要的区别是对象的生存期,new创建的引用实例,在执行流离开当前作用域之前会一直保存在内存中,而包装类型执行完后会立即销毁
  4. 基本包装类型实例typeof为Object
    typeOf(new Number(10)) //Object
    typeOf(Number(10)) //number
  5. Object实例会根据传入值的类型返回相应的包装类实例
    new Object('some text') instanceof String //true

5.6.3 String类型

  1. 指定位置的字符:charAt( 0 )
  2. 部分字符截取:
    slice(x,y) //0开始,y-1结束
    substring(x,y)
    substr(x,y)
  3. 指定字符位置查找:
    indexOf("x",0) //x字符,从0开始查找,默认从0
    lastIndexOf("",0)
  4. trim() 删除前后空格的字符
  5. split() 字符匹配分割成数组
    let str = "red","blue","black";
    str.splice(',') //["red","blue","black"]

5.7 单体内置对象

5.7.1Global对象

最外圈的全局对象,所有在全局作用域中定义的属性和方法都是Global的对象属性,
例如isNaN(),isFinite(),parseInt(),parseFloat()

  1. URI编码方法
    encodeURI() //只对URI中的空格转义
    encodeURIComponent() //对URI中的特殊字符转义
    decodeURI()
    deCodeURIComponent()
  2. eval()
    eval() 直接对字符串进行ECMAScript解析
  3. Global对象
    所有全局的引用对象都是Global的属性
  4. window对象
    提供了window对象,Global最外圈的属性方法,用window对象都能访问
    另外,window对象还是浏览器对象模型,后面详细讲解。

5.7.2 Math对象

  1. min() / max()
    Math.min(v1,v2,v3) / Math.max(v1,v2,v3) //求最大最小数
  2. 舍入方法
    Math.ceil() //向上舍入
    Math.floor() //四舍五入
    Math.round() //向下舍入
  3. 随机
    Math.random() // 0-1的随机数
    parseInt(Math.random()*10+1) // 1-10随机数
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容