JavaScript 引用类型 读书笔记

● 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` 。 **不能用于严格模式!** ```js 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

基本包装类型

基本包装类型有:`Boolean`、`Number`、`String`。 每当读取一个基本类型的值时, 后台就会创建一个对应的基本包装类型。 自动创建的基本包装类型只存在于代码执行瞬间, 然后立即被摧毁, 所以不能在运行时添加属性和方法。
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类型
```js var value = 25; var number = Number(value); //转换为数字的函数 Number() alert(typeof number); //number (基本类型)

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

![Number类型的基本包装对象](https://img-blog.csdn.net/20180823131903682?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExMTM1Nzg0MDcw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
|Number基本包装对象实例的方法 | 作用于 |
|:-------------|:-------------|
|*num*.valueOf()|返回Number对象的**基本类型Number**的数值|
|*num*.toString(*radix*)|返回数值的**字符串**形式, 可以接收一个参数, 指定返回几进制的字符串形式。|
|*num*.toLocaleString()|根据浏览器设置的区域, 返回对应的**字符串**形式,没有参数。<br>中国地区会把数字每三位用逗号隔开。如:1,256,345|
|*num*.toFixed(*number*)|接收一个数值, 按指定数值保留小数点后的位数, 返回**字符串**的形式 (标准为0~20位)|
|*num*.toExponential(*number*)|同toFixed(),不过是**返回**以指数表示法(e表示法)表示的字符串形式。如 1.26e+6|
|*num*.toPrecision(numnber)|接收一个数值参数, 表示返回的数值的**所有数字位数**(不包括指数部分)。 <br>位数不够的话, 返回结果**可能会向上或向下舍入**<br>返回的形式可能是fixed的形式或者e表示法, 超出指定位数时将其转换为e表示法。|
<h5>String类型</h5>
string对象的`length`属性表示字符串的长度。
string对象的`valueOf()`, `toString()`,`toLocaleString()` 都返回String对象的**基本类型**值。
|字符方法|操作单个字符|
|:-|:-|
|*str*.charAt(*index*)|返回指定位置的字符, 跟方括号加索引一样。<br>`str.charAt(1)`等同于`srt[1]`|
|*str*.charCodeAt(*index*)|返回指定字符的**编码**。如:字母'e'会返回101(*Number类型*)|

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


<h5 id="replace">replace()方法</h5>
接收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® // “cing,bing,hing,ring”

<h2 id="dtnz">单体内置对象</h2>
由ECMAScript提供的,不依赖宿主环境对象,如`Object`, `Array`, `String`,`Global`, `Math`
|URI编码方法|对URI进行编码/解码|
|:-|:-|
|encodeURI(*string*)|主要用于对整个URI编码, 不会对特殊字符进行编码。|
|encodeURIComponent(*string*)|主要用于对URI中的某一段进行编码, 会对任何非标准字符进行编码。|
|decodeURI(*string*)|只能对encodeURI()替换的字符进行解码|
|decodeURIComponent(*string*)|用于对encodeURIComponent()编码过的字符进行解码, 可以解码任何特殊字符的编码|

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

<h5>Math对象</h5>
Math对象用于数学计算
|Math对象的属性|一些数学计算中可能用到的特殊值|
|:-|:-|
|`Math.E`|常量e|
|`Math.PI`|即π, 圆周率|
|`Math.LN10`|10的自然对数|
|`Math.SQRT1_2`|$\dfrac{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)<br>可以用`Math.random()*可能值的总数+初始值`来从某个范围内随机选择一个数<br>如:`Math.floor(Math.random()*9+2)`从2-10中选一个数|
|**Math**.abs(*Number*)|返回绝对值|
|**Math**.exp(*Number*)|返回e的*number*次幂|
|**Math**.pow(*Number*,*power*)|返回*number*的*power*次幂|
|**Math**.sqrt(*Number*)|返回*number*的平方根|
|**Math**.log(*Number*)|返回*number*的**自然对数**|
|**Math**.sin(*x*)|返回*x*的正弦值|
|**Math**.asin(*x*)|返回*x*的反正弦值|
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值