JS红宝书笔记之引用类型

第五章 引用类型

引用类型的值(对象)是引用类型的一个实例。与相似。

ECMAScript提供了很多原生引用类型(例如Object)

5.1 Object类型

对象在JS中被称为引用类型的值。object是一个基础类型,其他所有类型都从object继承了基本的行为。

5.1.1 创建Object实例有两种方式

  • var person = new Object() //使用new操作符后跟Object构造函数
  • var person = {} // 使用对象字面量表示法,属性名加不加引号都可以。

在对象中,可以用typeof obj.prop == 'string' | 'number'...来判断有没有这个属性

5.1.2 访问对象属性

  • 点表示法(更推荐):obj.name
  • 方括号法:obj[“name”]
    • 方括号主要优点是可以用过变量来访问属性,例如:var a = “name”,obj[a] == obj[“name”]。当属性名中包含会导致语法错误的字符时(比如字符间有空格), 用方括号表示法会比较好。

5.2 Array类型

5.2.1 创建Array类型的两种方式

  • var arr = new Array(nums|…arr:Sring) //预先知道项目数量的话,可以添加nums参数设置。或者可以预先设置里面有的项。也可省略new :var arr = Array()
  • var arr = []

5.2.2 数组的length属性

arr.length 既可以读也可以写,设置小于原本长度时会删掉后面的项,设置大于原本长度时,会往后添加项(undefined)

也可以直接在大于长度的后面直接设置值。arr[arr.length+n] = number,数组的长度会变为arr.length+n+1

5.2.3 检测数组

Array.isArray(arr)

5.2.4 数组的方法

转换方法

  • arr.toSring():返回以逗号分隔的字符串

  • arr.valueof():返回数组

  • arr.toLocaleString():返回以逗号分隔的字符串

  • arr.join(’’):返回以规定符号分隔的字符串

栈方法

  • arr.push(’’,’’ …) 返回修改后数组的长度
  • arr.pop() 移除最后一项,返回移除的项

队列方法

  • arr.shift() 移除第一项,返回移除的项
  • arr.unshift 在前端添加一项,返回修改后数组的长度

重排序

  • arr.sort(),sort()方法会调用每个数组项的toString(),然后进行比较,也就是比较的是ascaII码。

因此sort()可以接受一个比较函数作参数。当比较函数返回1时会调换顺序。

  • arr.reverse()可直接反转函数,哪怕没有顺序。

操作方法

  • var narr = arr.concat(’’,[])。该方法先创建当前数组的一个副本,后将接收到的参数添加至末尾。
  • var narr = arr.slice(start, [end]) 返回从索引start到end前一个形成的数组
  • var narr = arr.splice(start,len,…[]) 返回从索引start算起长度为len的数组,原数组arr会被切割

位置方法

  • arr.indexOf(item,[index]) ,从索引inedx起,往后找,找item,返回索引值
  • arr.lastIndexOf(item,[index]) 从索引index起,往前找,找item,返回索引值

迭代方法

  • every() 若每一项返回true,则返回true
  • filter() 返回true的项组成的数组
  • forEach() 每一项运行一个函数,无返回值
  • map() 返回每次项调用函数的结果组成的数组
  • some() 若有一项返回true,则返回true

缩小方法

两者差异仅是左开始和从右开始

  • reduce(func(prev,cur,index,array),initvalue) 迭代数组的所有项,返回最终迭代值。
  • reduceRight()

5.3 Date类型

Date类型使用自UTC 1970年1月1日零时开始经过的毫秒数来保存日期。

5.3.1 创建Date的方式

var now = new Date(),其可以接受参数(毫秒数),返回特定的时间。

5.3.2 Date的方法

  • Date.parse() 接收一个表示日期的字符串参数,返回相应日期的毫秒数
  • Date.UTC() 其有固定的参数形式表示日期,返回响应日期的毫秒数
  • Date.now() 返回调用这个方法时的毫秒数 (与 +new Date() 相同 )
  • d.toLocaleString() 会按照浏览器设置的地区相应的格式返回日期和时间
  • d.toSring() 会返回带有失去信息的日期和时间
  • d.valueOf() 会返回毫秒数 (日期做比较的时候会自动调用valueOf)
  • getFullYear() 取得4位数的年份
  • getMonth() 取得月份(0是一月,11是12月)
  • getDate() 返回几号
  • getDay() 返回星期几 (0是周日,6是周六)
  • getHours()
  • getMinutes()
  • getSeconds()

5.4 RegExp类型

5.4.1 匹配模式

  • g 全局模式,即 并非在发现第一个匹配项时就停止
  • i 不区分大小写
  • m 多行模式,即到达一行末尾会继续查找下一行

5.4.2 字面量和构造函数创建的区别

var re = null
for(var i = 0; i < 10; i++){
    
    
    re = /cat/g                    //注意使用字面量形式时不用加引号
    re.test('catastrophe')
}
for(var i = 0; i < 10; i++){
    
    
	re = new RegExp('cat',g)
    re.test('catastrophe')
}

正则表达式字面量始终会共享同一个RegExp实例,使用构造函数创建的新实例都是独立的。

所以第一个循环在第二次调用是从索引为3的字符开始的,因此找不到。

.

.

.

未完待续

5.5 Function类型

由于函数是对象,因此函数名实际上也是一个指向函数对象的指针

5.5.1 定义函数的方式

  • function sum () {} :函数声明,解析器会率先读取函数声明,并使其在执行任何代码之前可用
  • var sum = function() {} :函数表达式 ,只有等到解析器执行到它时,才会真正被解释执行
  • var sum = new Function("","","") 使用Function构造函数。前面参数是函数的参数,最后一个参数是函数体(不推荐,会解析两次)

没有函数重载,后面定义的函数会覆盖前面定义的函数。

要访问函数的指针而不执行函数的话,必须去掉函数名后面的那对圆括号(把函数作为参数传递时)

5.5.2 函数内部属性

在函数内部,有两个特殊的对象:arguments和this

  • arguments是一个类数组对象,包含传入函数中所有的参数,其有一个名叫callee的属性,是一个指针,指向拥有这个arguments的函数
  • this 引用的是函数据以执行的环境对象。this的指向在函数创建的时候是决定不了的,在调用的时候才能决定,谁调用的就指向谁
    • 如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window,这里需要说明的是在js的严格版中this指向的不是window,但是我们这里不探讨严格版的问题,你想了解可以自行上网查找。
    • 如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。
    • 如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象
  • caller 这个属性保存着调用当前函数的函数的引用,如果是全局作用域中调用当前函数,则它的值为null
  • length 其返回的是函数希望接受的命名参数的个数
  • apply()和call()以及bind(),都是在特定作用域中调用函数,实际上等于设置函数体内this对象的值

5.6 基本包装类型

实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象。

例如:var s1 = "some text" var s2 = s1.substring(2)

逻辑上,基本类型不是对象,不应该有方法,但却可以调用方法。实际上,在读取模式中,后台会自动完成以下处理:

  • 创建String类型的一个实例 new String("some text")
  • 在实例上调用指定的方法
  • 销毁这个实例

使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。这以为这我们不能再运行时为基本类型添加属性和方法。

5.7 Boolean类型

布尔表达式中所有对象都会被转换为true。

var falseobj = new Boolean(false)
var result = faluseobj&&true
alert(result)   //true

5.8 Number类型

  • num.toString(x) 参数x表示化为x进制用字符串表示
  • num.toFixed(x) 参数x表示按照指定的x小数位返回数值以字符串表示
  • num.toExponential(x) 返回以指数表示法表示的字符串,x指定小数位数
  • num.toPrecision(x) x表示数值的所有数字的位数(不包括指数部分),然后返回以上合适的格式

5.9 String类型

  • str.charAt(index) 返回给定位置的那个字符
  • str.charCodeAt(index) 返回给定位置的那个字符的Ascii码
  • str1.concat(str2,str3…)

以下三个对原始字符串没有任何影响,会返回一个新的切割出来的子串

  • str.slice(start,[end]) //不包括end
  • str.substr(start,[length])
  • str.substring(start,[end])

位置方法

  • str.indexOf(子串,[start])
  • str.lastIndexOf(子串,[start])

.

.

.

还有很多方法

5.10 单体内置对象

内置对象指“由ECMAScript实现提供的、不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了,例如Object Array String ”,以及两个单体内置对象Global(全局)和Math(在所有代码执行之前,作用域中就存在了这两个对象)。

  • Global:该对象的encodeURI()和encodeURIComponent()方法可以对URI(通用资源标识符)进行编码,以便发送给浏览器。

    • eval()方法中创建的任何变量或函数都不会被提升
  • Math

    • Math.max()
    • Math.min()
    • Math.ceil() | floor() | round()
    • Math.random()

猜你喜欢

转载自blog.csdn.net/Pinoochio/article/details/113688599
今日推荐