第五章 JavaScript引用类型

引用类型

  1. 引用类型是一种数据结构,用于将数据和功能组织在一起,描述了一类对象所具有的属性和方法.
  2. JavaScript是面向对象的,但不具有传统的面向对象语言所支持的类和接口等基本结构.
  3. 引用类型的值(对象)是引用类型的一个实例.

5.1 Ojbect类型

创建Object实例的两种方式

  1. new: var person = new Object();
  2. 字面量: var person = {};

访问对象属性的方式

  1. 点表示法: person.name
  2. 方括号表示法: person[name]

方括号表示法的优点

  1. 可以通过变量访问属性
var propertyName = 'name';
person[propertyName];
  1. 属性名中包含空格: person['first name'];

5.2 Array类型

创建数组的两种方式

  1. Array构造函数
var colors = new Array();
var colors = new Array("yellow");
  1. 数组字面量
var colors = ["red","blue"]

注意: 数组的length属性有个特点 – 不是只读的.可以直接设置: arr.length = XXX

5.2.1 检测数组

-Array.isArray(value)

var arr = ["yellow"];
// 输出 true
console.log(Array.isArray(arr));

5.2.2 转换方法

  1. valueOf() 返回数组本身,输出含有[]
var arr = ['yellow','blue'];
// 输出: [ 'yellow', 'blue' ]
console.log(arr.valueOf())
  1. toString()数组中每个值的字符串形式以逗号分隔拼接而成的字符串. 输出无[]
  2. toLocaleString() 需要数组中的对象重写toLocaleString(), 否则同toString(), 输出无[]
  3. join()自定义分隔符, 输出无[]
var arr = ["yellow","blue","green"];
// 输出: yellow666,blue666,green
console.log(arr.join("666,"));

注意: 如果数组中某一项的值是null或者undefined,那么该值toString(),join(),toLocaleString()3个方法返回的结果中以空字符串表示:

var arr = ["yellow",null,undefined];
// 输出: yellow,,
console.log(arr.toString());
console.log(arr.toLocaleString());
console.log(arr.join(","));

valueOf()有点特殊

var arr = ["yellow",null,undefined];
// 输出: [ 'yellow', null, undefined ]
console.log(arr.valueOf())

5.2.3 栈方法

  1. push(): 接受任意数量的参数, 添加至数组末尾. 返回修改后的数组长度.
  2. pop(): 从数组末尾移除最后一项, 减少数组长度. 返回被移除的项.

5.2.4 队列方法

  1. unshift(): 在数组的前端, 添加任意项. 返回新数组的长度.
  2. shift(): 从数组的前端移除一项, 返回移除的项.

5.2.5 重排序方法, 会改变原始数组

  1. reverse(): 反转数组项的顺序
  2. sort(): sort()方法会调用每项的toString()方法, 比较字符串,默认升序
    但会有问题
    var arr = [0,5,10];
    arr.sort();
    // 输出: [ 0, 10, 5 ]
    console.log(arr.valueOf())
    
    • sort()可以传入比较函数. 比较函数接受两个参数: 如果第一参数应该在第二个之前则返回一个负数. 如果两个参数相等返回0, 如果第一个参数位于第二个参数之后则返回一个正数.
    var arr = [0,5,10];
    arr.sort(compare);
    // 输出: [ 0, 5, 10 ]
    console.log(arr.valueOf())
    
    function compare(v1, v2){
       	return v1 - v2;
    }
    

5.2.6 操作方法

  1. concat(): 基于当前数组项创建一个新数组, 参数可以为任意个数组或者单个的值. 不会影响原数组
  2. slice(): 从数组中截取值,形成新数组. 不会影响原数组.
    1. 接收一个参数, 从参数位置截取到数组末尾
    2. 接受两个参数, 截取值含头不含尾.
      注意: 如果slice()方法中,有一个是负数, 则用数组长度加上该数来确定位置. 例如在一个5项的数组上调用slice(-2, -1) = `slice(3, 4). 如果结束位置<起始位置, 则返回空数组.
     var arr = [0,5,10];
     var arr2 = arr.slice(1,0);
     // 输出: []
     console.log(arr2)
    
  3. splice(): 会改变原数组
    1. 删除: 两个参数,要删除的第一项的位置和删除的项数. 例如: splice(0,2)删除前两项
    2. 插入/替换: 三个参数. 起始位置, 要删除的项数, 和要插入的项.
    3. splice()返回值: 从原始数据中删除的项组成的数组. 如果没有删除的项, 则返回空数组.

5.2.7 位置方法

方法都接收两个参数: 起始位置(可选)和要查找的项.没找到返回-1.

  1. indexOf()
  2. lastIndexOf()

当查找项和数组中每一项进行比较时, 会使用全等操作符(===).

5.2.8 迭代方法

  1. every()/some()查询数组中的项是否满足某个条件.
    1. every()传入的函数必须对每一项都返回true, 这个方法才返回true; 否则返回false
    2. some()传入的函数对有一项返回true, 就会返回true
    3. 例子
     var arr = [3,4,5,6,7];
     // 每一项都大于3 ? false
     console.log(arr.every(function(item, index, array){
     	return item > 3
     }));
     // 有一些项大于3 ? true
     console.log(arr.some(function(item, index, array){
     	return item > 3;
     }));
    
  2. filter(): 利用指定的函数筛选出符合条件的项组成的数组.
var arr = [3,4,5,6,7];
var filterResult = arr.filter(function(item, index, array){
	return item > 5;
});
// [ 3, 4, 5, 6, 7 ] 不会改变原数组
console.log(arr);
// [ 6, 7 ]
console.log(filterResult);
  1. map(): 返回一个数组, 该数组的每一项是在原始数组中对应项上运行传入函数的结果.
var arr = [3,4,5,6,7];
var mapResult = arr.map(function(item, index, array){
	return item * 2;
});
// [ 3, 4, 5, 6, 7 ] 不会改变原数组
console.log(arr);
// [ 6, 8, 10, 12, 14 ]
console.log(mapResult);
  1. foreach(): 对数组中的每一项运行传入的函数. 方法没有返回值.
var arr = [3,4,5,6,7];
arr.forEach( function(item, index) {
	if (item == 5) {
		arr = [];
	}
});
// [] 可以改变原始数组
console.log(arr);

5.2.9 归并方法

  • reduce()/reduceRight(): reduce()从做到右, reduceRight()从右到左.两个参数: 每一项上调用的函数和归并起始值(可选的).返回求和的结果.
var arr = [0,1,2];
// 只传递一个参数时: pre是0, cur是1.
var sum = arr.reduce(function(pre, cur, index, array){
	return pre + cur;
})
// 3
console.log(sum);

5.3 Date类型

new Date()

  • 构造函数不传递参数, 新创建的对象自动获得当前日期和时间.
  • 传参需要传递日期毫秒数.
  • 计算日期毫秒数的两个方法: Date.parse(), Date.UTC().
var dateTest = new Date(2005, 4, 5, 17,55, 55);
// 2005年5月5日, 下午5点55分55秒
console.log(dateTest);

上述构造函数中会默认调用: Date.UTC();
月份是从0开始小时是24小时制

5.4 RegExp类型

5.5 Function类型

  • JavaScript函数是对象, 函数名是指向函数对象的指针.
  • js函数没有重载.
  • 函数声明与函数表达式的区别: js代码执行前会有函数声明提升的过程.

5.4.4 函数内部属性

1. arguments

  • arguments是一个类数组对象,包含传入的所有参数.
  • 该对象有一个callee属性, 该属性是一个指针, 指向拥有这个arguments对象的函数.
function factorial(num) {
	// true
	console.log(factorial === arguments.callee)
	// [Function: factorial]
	console.log(arguments.callee)
	// [Function: factorial]
	console.log(factorial)
}

2.this

3. Function.caller === arguments.callee.caller

  • caller这个属性保存调用当前函数的函数的引用
  • 如果在全局作用域中调用当前函数, 他的值为null
function inner(num) {
	// true
	console.log(inner.caller === outer)
	// [Function: outer]
	console.log(inner.caller)
}
function outer() {
	inner();
}
outer()

5.5.5 函数的属性和方法

  1. length和prototype属性
    1. length属性是函数的参数数量
    2. prototype是函数原型
  2. apply() / call()方法: 在特定的域中调用函数,两个参数,第一参数为运行函数的作用域, 第二个: apply()为数组, call()为所有单个参数
function sayColor(){
	console.log(this.color);
}
window.color = "red";

var obj = {
	color : "blue"
}
// red
sayColor.apply(window);
// blue
sayColor.apply(obj);
  1. bind(): 创建一个函数实例, 其this的值会绑定到传给bind()函数的值
function sayColor(){
	console.log(this.color);
}
window.color = "red";

var obj = {
	color : "blue"
}
var objeSayColor = sayColor.bind(obj);
// blue
objeSayColor();
// red
sayColor();

5.6 基本包装类型

  • 每当读取一个基本类型的值的时候, 后台会创建一个对应的基本包装类型的对象.从而能够调用一些方法操作这些数据.
    例如:
var s1 = "some text";
var s3 = s1.substring(2)

s1是字符串,基本类型的值.理论上不应该有方法.第二行代码访问s1时处于读取模式, 后台会自动完成下列处理.

var s1 = "some text";
var s2 = s1.substring(2);
s1 = null;
  • Object构造函数会像工厂方法一样, 根据传入的值的类型返回相应基本包装类型的实例(Number, String, Boolean).
var obj = new Object(1);
// true
console.log(obj instanceof Number);

使用new操作调用基本包装类型的构造函数, 与直接调用同名的转型函数是不一样的.例如:

var value = 25;

var number = Number(value);
// number
console.log(typeof number);

var number = new Number(value);
// obj
console.log(typeof number);

5.6.1 Boolean类型

需要理解基本类型的布尔值与Boolean对象之间的区别 – 建议永远不要使用boolean对象.

var obj = new Boolean(false);
// [Boolean: false]
console.log(obj);
// true, 布尔表达式中所有的对象都会被转换为true
console.log(obj && true);

5.6.2 Number类型

  1. toString()带参数,返回几进制的字符串形式.
var num = 10;
// 10 默认十进制
console.log(num.toString())
// 1010
console.log(num.toString(2))
// 12
console.log(num.toString(8))
// 10
console.log(num.toString(10))
// a
console.log(num.toString(16))

  1. toFixed()四舍五入保留一定的小数位
var num = 10.345;
// 10.35
console.log(num.toFixed(2));
var num2 = 0.345;
// 0.34 据MDN介绍,toFixed会要必要时对数值进行四舍五入,但所谓的必要时指的是啥就不清楚了,或许要查看源码实现了
console.log(num2.toFixed(2));
  1. toExponential(), 该方法返回指数表示法.接受一个参数,表示小数位数.
var num = -10.1;
// -1.01e+1
console.log(num.toExponential(2));
  1. toPrecision()可能返回fixed格式也可能是指数格式;具体规则是看哪种格式最合适, 接受一个参数表示数字位数.
var num = 99;
// 1e+2
console.log(num.toPrecision(1));
// 99
console.log(num.toPrecision(2));
// 99.0
console.log(num.toPrecision(3));

5.6.3 String类型

  1. 字符方法
  • charAt(): 返回某个位置的字符
  • charCodeAt(): 返回某个位置的字符的ASCII码
  1. 字符串操作方法
  • concat() 同 +
    var str = "hello";
    console.log(str.concat(" world"));
    console.log(str+" world")
    
  • slice()/ substring()/ substr()
    1. 两个参数都是正数slice()substring()含义相同
     var str = "hello";
     // 一个参数截取到末尾 ello
     console.log(str.slice(1));
     // 两个参数含头不含尾 el
     console.log(str.slice(1,3));
     console.log(str.substring(1));
     console.log(str.substring(1,3));
     // 一个参数截取到末尾 ello
     console.log(str.substr(1));
     // 两个参数: 从1开始截取3个数 ell
     console.log(str.substr(1,3));
    
    1. 参数有负数
    • slice()将所有负值与字符串的长度相加
    • substr()将负的第一个参数加上字符串的长度, 将负的第二个数转换为0
    • substring()将所有负参数都转换为0

substring()会将较小的数作为开始位置,所以substring(3,0)相当于substring(0,3)

  1. 字符串位置方法
  • indexOf() / lastIndexOf(): 两个参数,第一个要搜索的子串,第二个可选的起始位置.
  1. trim() 去除字符串两边的空格, 返回字符串副本, 不影响原字符串.

5.7 单体内置对象

内置对象: 由ECMAScript实现提供的, 不依赖于宿主环境的对象, 这些对象在ECMAScript程序执行之前就已经存在了.

5.7.1 Global对象

  1. URI编码方法
  2. eval()方法
  3. Global对象的属性
  4. window对象

5.7.2 Math对象

  1. Math对象的属性

  2. min()max()方法

    用于确定一组数值中的最小值和最大值,也可以用于数组

    var maxValue = Math.max(1,2,3,4,5);
    // 5
    console.log(maxValue);
    
    var values = [1,2,3,4,5];
    // 5
    console.log(Math.max.apply(Math,values))
    
  3. 舍入方法

  • Math.ceil(): 向上舍入最接近的整数
  • Math.floor(): 向下舍入最接近的整数
  • Math.round(): 四舍五入最接近的整数
// 2
console.log(Math.ceil(1.9))
// 1
console.log(Math.floor(1.9))
// 2
console.log(Math.ceil(1.9))
  1. random(): [0,1)的随机数
  • 从某个整数范围内随机选择一个值
= Math.floor(Math.random() * 可能值的总数 + 第一个可能的值)

例如: 选择一个2到10之间的值

// 2到10总共9个数
var num = Math.floor(Math.random() * 9 +2);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值