《JavaScript高级程序设计 (第3版)》 第五章 引用类型读书笔记

● Object 类型
● Array类型
● Date类型
● RegExp类型
● Function类型
● 基本包装类型
● 单体内置对象

Object类型

创建对象: 使用new Object或者直接使用字面量var obj={} 字面量定义对象不会调用Object构造函数
访问对象属性: 使用点 . 或者方括号内字符串 obj["key"]
使用 value instenceof Object 可以引来判断对象

var s="hello";
var arr=[1,2,3,4,5];
console.log(s instanceof Array);    //false 对于基本类型,instanceof 总是返回 false
console.log(ob instanceof Array);   //true

Array类型

使用Array构造函数时可以省略 new 操作符.
修改length属性可以直接改变数组的长度.
如果数组的索引超过了当前数组, 也会直接改变数组的长度.
*可以使用arr[arr.length]在数组末尾添加新项

var arr = [1,2,3,4,5];  //字面量创建
var arr = Array(5)  //创建数组长度为5的空数组
var arr = Array(1,2,3,4,5) //使用构造函数创建
Array方法 说明
Array.isArray(arr) 判断某个值是不是数组 返回 true/false
arr.toString() 返回数组中每个值的字符串形式
arr.toLocaleString() 根据所在区域的字符串形式返回字符串
arr.valueOf() 返回当前数组
arr.join(separator) separator参数可选, 按指定的连接方式返回字符串,元素的连接符号为传入的参数, 默认为逗号。
nullundefined 用空格表示, 不会改变原有的数组。
arr.push(value)栈方法 压 接收任意数量的参数, 把他们逐个添加到数组末尾, 返回修改后的数组长度
arr.pop()栈方法 弹出 从数组末尾移除一项, length 的值-1,返回移除的项
arr.unshift(value)队列方法 接收任意数量的参数, 把他们逐个添加到数组前端, 返回修改后的数组长度
arr.shift()队列方法 从数组前端移除一项, length 的值-1,返回移除的项
arr.reverse()反转数组 反转当前数组元素的顺序,会直接改变当前的数组顺序
arr.sort(fucntion)重排序 接收一个函数,该函数接收2个参数,根据该函数的返回值重新排序数组,会改变当前的数组顺序
如果返回正数,则第一个参数在第二个参数之前;如果返回0,则位置相等;
如果返回负数,则第一个参数在第二个参数之后。
*可以使用return value2-value1 比较数字大小
arr.concat(value)连接数组 将接收的参数放到数组末尾,返回一个新的数组, 不会改变原有的数组。
arr.slice(star,end)截取数组 只有一个参数的情况下, 会截取从该参数指定的位置开始到数组结束
有两个参数的情况下,会截取从star指定的位置开始到end指定的位置的前一个元素, 不包括end。
*如果值为负数, 则实际的值为 length 加上该负值。不会改变原有的数组。
arr.splice(index,num,add1*…)
删除/插入数组
第1个参数为要操作(删除/插入)的起始位置, 第2个参数为要删除的个数,
从第3开始的参数为要插入的元素,使用前插法,即插入的项目会在操作位置之前
*会改变原有的数组, 返回值为被删除的元素。
arr.indexOf(item,index)查找数组 参数分别为: 要查找的元素, 从哪里开始查找(下标)。从数组开头往后方向查找。
返回该元素第一次出现的位置(下标), 如果未找到,则返回-1。*使用===全等操作。
arr.lastIndexOf(item,index) 同indexOf,不过是从数组末尾往前方向查找。
迭代方法 都接收2个参数,对每一项运行的 函数this 的值(可选)
arr.every(fun,this) 如果函数对每一项都返回true,则 every() 返回 true,否则返回false
arr.some(fun,this) 如果函数对任一项返回true,则 some() 返回 true,否则返回false
arr.filter(fun,this) 对每一项运行函数,filter()会返回函数运行结果为true的元素组成的数组
arr.map(fun,this) 对每一项运行函数,map()会返回每次函数调用结果组成的数组
arr.forEach(fun,this) 单纯对每一项运行函数,forEach() 没有返回值
归并方法 迭代数组所有项, 然后构建一个最终返回值
arr.reduce(fun,initvalue) 接收2个参数,分别为每一项上调用的函数, 归并的初始值(可选)
传入的函数接收4个参数分别为: 前一个值, 当前值, 当前项的索引, 数组对象本身
从第一项遍历到最后一项, 函数返回的任何值都会传递给下一项。
arr.reduceRight(fun,initvalue) 同reduce,不过遍历方向是从最后一项到第一项。

Date类型

创建一个日期对象:

var date = new Date()   //创建当前日期的Date对象

如果要创建指定日期和事件的Date对象, 则必须传入毫秒数(Number类型), 该毫秒数为1970年1月1日 0:00:00起至该日期经过的毫秒数。

var date = new Date(Date.parse("2018/8/8 12:00:00"));   // 2018年8月8日 12:00:00
var date2= new Date(Date.UTC(2018,7,8,12,00,00));       // 2018年8月8日 12:00:00
var date2= new Date(1533700800000)                      // 2018年8月8日 12:00:00
创建特定日期时间的Date方法 返回1970年1月1日 0:00:00起至该日期经过的毫秒数(Number)
Date.parse(string) 接收一个用字符串表示的日期, 返回毫秒数
如果字符串不能表示日期, 则返回 NaN
Date.UTC(年,月-1,天,时,分,秒,毫秒) 传入参数表示日期, 月份是从0开始算的(一月是0,十二月是11)
前2个参数是必须的, 后面的参数如果省略, 则设为0。返回毫秒数
Date.now() 返回调用这个方法时的日期时间的毫秒数
*如果浏览器不支持, 也可以使用+new Date把当前日期的Data对象转为Number类型
Date继承的方法 说明
date.toString() 返回字符串形式的日期
Wed Aug 08 2018 12:00:00 GMT+0800 (中国标准时间)
date.toLocaleString() 根据所在区域的返回字符串形式的日期
2018/8/8 下午12:00:00
date.valueOf() 返回当前日期的毫秒数形式
1533700800000

RegExp类型

创建正则表达式:var exp=/express/flags;每个正则表达式都可带有标志(flags):
g 表示全局模式, 会应用于所有字符串, 每次调用后, index不会归0。
i 表示不区分大小写。
m 表示多行模式, 在到达文本末尾时还会继续查找下一行。
javascript 正则表达式不支持后发断言。
RegExp对象的 toString()toLocaleString() 方法都会返回正则表达式的字面量形式, 与创建方式无关。

var exp = /\.at/gim                 //匹配.at
var exp2= new RegExp("\\.at","gi")  //使用RegExp构造函数要对元字符进行双重转义
exp.toString();     //返回 /\.at/gim 
exp2.toString();    //返回 /\.at/gim 
RegExp实例属性 作用于单个正则表达式实例
global 布尔值,表示是否设置了g标志
ignoreCase 布尔值,表示是否设置了i标志
multiline 布尔值,表示是否设置了m标志
lastIndex 整数,表示开始搜索下一个匹配项的字符位置 (匹配项的下一个元素)
source 正则表达式的字符串表示
RegExp实例方法 作用于单个正则表达式实例
exp.exec(string) 接收一个字符串参数, 返回包含第一个匹配项的数组
exp.test(string) 接收一个字符串参数, 如果有匹配项, 返回true, 否则返回false
RegExp构造函数的属性 适用于作用域中的所有正则表达式
RegExp.inputRegExp[$_] 最近一次要匹配的字符串
RegExp.lastMatchRegExp["$&"] 最近一次的匹配项
RegExp.lastparenRegExp["$+"] 最近一次匹配的捕获组(一对括号就是一个捕获组)
RegExp.leftContextRegExp["$`"] inpu字符串中lastparen之前的位置
RegExp.rightContextRegExp["$'"] inpu字符串中lastparen之后边的位置
RegExp.multilineRegExp["$*"] 布尔值,是否所有的表达式都使用多行模式

*非有效的ECMAScript标识符要用方括号语法访问


Function类型

  • 函数名实际上是一个指向函数对象的指针
  • 使用不带括号的函数名是访问函数指针, 而非调用函数。
  • 重复定义函数, 后面的函数会覆盖前面的函数。
  • 函数声明会得到变量提升, 未执行之前可以使用。函数表达式则不会, 必须执行到它所在的代码, 才能使用。
  • 函数可以作为参数传递给另一个函数, 也可以将函数作为另一个函数的结果返回。
callee属性

callee属性是一个指针,指向拥有argument对象的函数(当前函数),常用于递归函数, 分离函数的执行与函数名。
不能用于严格模式!

function fun(x,y){
    argument.callee()   //指向fun函数(函数本身)
}
caller属性

caller属性保存调用当前函数的函数的引用 (谁调用了它) , 在全局作用域中调用, 会返回 null
不能用于严格模式!

function fun(){
    return fun.caller;
}
function otherfunction(){
    console.log(fun());
}
console.log(fun()); //null
otherfunction();    //otherfunction
this属性

this指向函数执行的环境对象( 函数本身所在的作用域 )。
全局作用域中调用, this指向window严格模式下, 全局环境中的this指向undefined

window.color="red";
var o={color."blue"};

function sayColor(){
    alert(this.color);   //this指向函数本身所在的作用域
}

sayColor();     //此时函数本身的作用域是window, 所以返回"red"
o.sayColor=sayColor;
o.sayColor();   //o.sayColor()的作用域是o对象, 所以返回"blue"
length属性和prototype属性

length属性表示函数希望接收的命名参数的个数。
prototype属性保存着所有实例的方法, 无法枚举。

apply方法

apply方法接收2个参数, 一个是运行函数的作用域 (让this指向哪里) , 另一个是参数数组。
apply需要把参数打包成数组传入。

call方法

同apply, 不同的地方是call的参数是逐个传给函数。这2个方法都可用来扩大作用域。

bind方法

bind方法会创建一个函数实例, 然后其this的值会被绑定传给bind()函数的值。

var o={color."blue"};
function sayColor(){
    alert(this.color); 
}
var objectSayColor=sayColor.bind(o);    //将对象o作为objectSayColor函数的this

基本包装类型

基本包装类型有:BooleanNumberString
每当读取一个基本类型的值时, 后台就会创建一个对应的基本包装类型。
自动创建的基本包装类型只存在于代码执行瞬间, 然后立即被摧毁, 所以不能在运行时添加属性和方法。

Boolean类型
var bo1 = new Boolean(false);   //创建一个Boolean类型的基本包装对象, 初始值为false
var bo2 = new Boolean(2);       //2会被自动转为true
var bo3 = true;                 //字面量创建的Boolean基本类型
alert(bo1 && true)              //返回true, 因为布尔表达式中 对象 会被转为true, 不论其初始值
//尽量不要使用Boolean构造函数, 容易造成误解。
typeof bo1;     //object (对象)
typeof bo3;     //boolean (基本类型)
typeof bo2.valueOf()    //boolean

Boolean对象的 valueOf() 方法会返回基本类型true 或者 false

Number类型
var value = 25;
var number = Number(value);     //转换为数字的函数 Number()
alert(typeof number);           //number (基本类型)

var obj = new Number(value);    //使用构造函数 new Number()
alert(typeof obj);              //object (基本包装类型的对象)

Number类型的基本包装对象

Number基本包装对象实例的方法 作用于
num.valueOf() 返回Number对象的基本类型Number的数值
num.toString(radix) 返回数值的字符串形式, 可以接收一个参数, 指定返回几进制的字符串形式。
num.toLocaleString() 根据浏览器设置的区域, 返回对应的字符串形式,没有参数。
中国地区会把数字每三位用逗号隔开。如:1,256,345
num.toFixed(number) 接收一个数值, 按指定数值保留小数点后的位数, 返回字符串的形式 (标准为0~20位)
num.toExponential(number) 同toFixed(),不过是返回以指数表示法(e表示法)表示的字符串形式。如 1.26e+6
num.toPrecision(numnber) 接收一个数值参数, 表示返回的数值的所有数字位数(不包括指数部分)。
位数不够的话, 返回结果可能会向上或向下舍入
返回的形式可能是fixed的形式或者e表示法, 超出指定位数时将其转换为e表示法。
String类型

string对象的length属性表示字符串的长度。
string对象的valueOf(), toString(),toLocaleString() 都返回String对象的基本类型值。

字符方法 操作单个字符
str.charAt(index) 返回指定位置的字符, 跟方括号加索引一样。
str.charAt(1)等同于srt[1]
str.charCodeAt(index) 返回指定字符的编码。如:字母’e’会返回101(Number类型)
字符串方法 操作整个字符串(不会改变原有的字符串)
str.concat(string1+,string2,…)连接字符串 接收一或多个字符串, 并依次把他们放到与原字符串连接起来, 返回连接后的字符串
str.slice(star,end?)按位置截取字符串 返回截取后的字符串,参数为开始的位置,结束位置的下一个位置(不会包含end的位置)
对于所有的负值参数, 会与length相加。如果省略第二个参数, 则截取到末尾。
str.substring(star,end?)按位置截取字符串 同slice(), 不同的是,substring()会把所有的负值参数转换为0
str.substr(star,howmany?)个数截取字符串 返回按个数截取后的字符串,参数为:开的位置,截取的个数。
如果第一个参数为负值,则与length相加,如果第二个参数为负值, 则转换为0
如果省略第二个参数, 则截取到末尾。
str.indexOf(item,index?)和
str.lastIndexOf(item,index?)位置查找
跟Array的indexOf()和lastIndexOf()一样
str.trim() 将字符串两边的空白去掉,并返回去掉空白后的字符串。
str.toUpperCase() 把字符串全部变为大写并返回, 可以对单个字符操作。
str.toLowerCase() 把字符串全部变为小写并返回, 可以对单个字符操作。
str.match(reg)正则匹配 接收一个参数, 可以是正则表达式或者RegExp对象, 返回匹配项数组。跟reg.exec()一样
str.search(reg) 与match()一样, 不同的是返回的是第一个匹配项的索引, 未找到则返回-1。
str.replace(reg|str,str|fun)替换字符串[1] 接收2个参数, 第1个参数可以是正则表达式(RegExp)或者字符串,
第2个参数可以是字符串或者函数。然后进行替换操作,返回替换后的新字符串。
str.split(string|reg,number)分割字符串 按指定方式将字符串分割成多个字符串,返回分割后字符串组成的数组。
第1个参数可以是字符串或者正则表达式, 不会包含在结果里。
第2个参数指定返回的数组的长度。
str.localeCompare(string) 与参数所给的字符串比较, 如果该字符串在参数所给的字符串在之前,则返回负值,
如果该字符串在参数所给的字符串在之后,则返回正值,位置相等返回0
String.fromCharCode(charcode+) 接收一或多个字符编码, 然后把他们转为一个字符串
replace()方法

接收2个参数, 第1个参数可以是正则表达式(或RegExp对象)或者字符串, 第2个参数可以是字符串或者函数。
如果第一个参数是字符串, 那么只会替换第一个匹配项, 如果要替换所有的匹配项, 则要用正则表达式, 并且要指定g标志。

var text = "cat, bat, sat, fat"; 
//第一个参数为字符串, 所以只会替换第一个匹配项
var result = text.replace("at","ond");  //"cond,bat,sat,fat"
//第一个参数是正则表达式, 并且指定g标志, 所以会替换所有的匹配项
result=text.replace(/at/g,"ond")    //"cond,bond,sond,fond"

如果第二个参数是函数:会向该函数传递参数分别为:
模式匹配项(匹配到的字符), (捕获组1),(捕获组2)…,模式匹配项在字符中的位置(索引),原始字符串
如果没有捕获组, 则为3个参数。模式匹配项在字符中的位置(索引)和原始字符串始终在参数的最后
该函数必须返回一个字符串

var s="cat,bat,hat,rat"
var r=s.replace(/.at/g,function(){
    console.log(arguments[0]);   //模式匹配项(此时是"cat")
    console.log(arguments[1]);
    console.log(arguments[2]);
    console.log(arguments[3]);
    console.log("倒数第二个参数"+arguments[arguments.length-2]); //模式匹配项在字符中的位置
    console.log("最后一个参数"+arguments[arguments.length-1]);   //原始字符串
    return "ing"
})
console.log(r)  // "cing,bing,hing,ring"

单体内置对象

由ECMAScript提供的,不依赖宿主环境对象,如Object, Array, String,Global, Math

URI编码方法 对URI进行编码/解码
encodeURI(string) 主要用于对整个URI编码, 不会对特殊字符进行编码。
encodeURIComponent(string) 主要用于对URI中的某一段进行编码, 会对任何非标准字符进行编码。
decodeURI(string) 只能对encodeURI()替换的字符进行解码
decodeURIComponent(string) 用于对encodeURIComponent()编码过的字符进行解码, 可以解码任何特殊字符的编码
eval()方法

eval(“code”)接收一个参数, 即要执行的JavaScript字符串。通过eval()执行的代码, 与eval()自身所在的环境作用域是相同的。
在eval()中创建的任何变量和函数都不会得到变量提升
严格模式下对eval赋值会导致错误, 在外部也访问不了eval()中创建的任何变量和函数。

Math对象

Math对象用于数学计算

Math对象的属性 一些数学计算中可能用到的特殊值
Math.E 常量e
Math.PI 即π, 圆周率
Math.LN10 10的自然对数
Math.SQRT1_2 1 2 的平方根
Math.SQRT2 2的平方根
Math对象的方法 数学计算的方法
Math.max(Number+) 接收多个数值参数, 返回其中的最大值
Math.min(Number+) 接收多个数值参数, 返回其中的最小值
Math.ceil(Number) 对参数进行向上舍入, 并返回。
Math.floor(Number) 对参数进行向下舍入, 并返回。
Math.round(Number) 对参数进行四舍五入, 并返回。
Math.random() 返回大于等于0小于1的一个随机数(0≤x<1)
可以用Math.random()*可能值的总数+初始值来从某个范围内随机选择一个数
如:Math.floor(Math.random()*9+2)从2-10中选一个数
Math.abs(Number) 返回绝对值
Math.exp(Number) 返回e的number次幂
Math.pow(Number,power) 返回numberpower次幂
Math.sqrt(Number) 返回number的平方根
Math.log(Number) 返回number自然对数
Math.sin(x) 返回x的正弦值
Math.asin(x) 返回x的反正弦值

猜你喜欢

转载自blog.csdn.net/a1135784070/article/details/81916625