《JavaScript高级程序设计》第5章 引用类型
5.2.2 转换方法
所有对象都有toString()和valueOf()方法
调用数组的toString()方法,会返回一个字符串,由数组中的每个项通过逗号连接而成
调用valueOf()还是返回数组
var colors = ["red", "blue", "green"]; console.log(colors.toString()); // red,blue,green console.log(colors.valueOf()); // ["red", "blue", "green"]
join()方法接收一个参数,是用作分隔符的字符串,返回包含用这个分隔符连接而成的字符串,如果不传入参数,则默认使用逗号。
console.log(colors.join("||")); // red||blue||green
以上所有方法,如果数组中某个项是undefined或者null,则处理的时候以空字符串表示
5.2.3 栈方法
// push:向数组尾部添加元素。pop:移除数组尾部最后一项 var colors = []; colors.push("red", "green"); // ["red", "green"]
5.2.4 队列方法
// shift:移出数组头部第一项。unshift:向数组头部添加元素 var colors = []; colors.unshift("red", "green"); // ["red", "green"],无论是push还是unshift,添加多个元素时顺序始终保持一致
5.2.5 重排序方法
var values = [1, 30, 4, 22, 100, 21, 22]; // 如果 compareFunction(a, b)小于0 ,那么a会被排列到b之前; function compare (value1, value2) { return value1 - value2; // 数组升序排列 } values.sort(compare);
5.2.6~5.2.8 操作方法、位置方法、迭代方法
操作方法 concat() slice() splice()
位置方法 indexOf() lastIndexOf()
迭代方法 every() some() filter() map() forEach()
5.5.2 函数声明与函数表达式
解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);
至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。
console.log(sum(10, 10)); // 20,正常运行 function sum (num1, num2) { return num1 + num2; } console.log(anotherSum(10, 10)); // 报错,Uncaught TypeError: anotherSum is not a function var anotherSum = function (num1, num2) { return num1 + num2; }
5.5.4 函数内部属性 callee和caller
// callee:arguments对象的属性,指向拥有这个arguments对象的函数 function factorial (num) { if (num <= 1) { return 1; } else { return num * arguments.callee(num - 1); // 相当于 return num * factorial(num - 1); } } // caller:函数对象的属性,指向调用当前函数的函数的引用 function outer () { inner(); } function inner () { console.log(inner.caller); // outer函数的源代码,因为outer调用了inner } outer();
5.5.5 函数属性和方法
call、apply:函数对象的方法,用于改变函数体内this的值,同时调用它
call传入的是多个参数。
apply传入的是一个参数数组。
function sum (num1, num2) { return num1 + num2; } var num1 = 10; var num2 = 20; var nums = [10, 20]; console.log(sum.call(this, num1, num2)); // 传入多个参数 console.log(sum.apply(this, nums)); // 传入一个数组
bind:函数对象的方法,返回一个函数(用于赋值而非调用,区别于call和apply),这个函数改变了函数体内this的值
window.color = "red"; var o = {color: "blue"}; function sayColor () { console.log(this.color); } sayColor.call(this); // red sayColor.call(o); // blue var objectSayColor = sayColor.bind(o); objectSayColor(); // blue
5.6 基本包装类型
在声明基本数据类型的时候,实际上是创建了一个基本包装类型的对象的实例,使其有相应的方法可以被调用
5.6.3 String类型
trim方法:删除前置和后缀的所有空格
match方法:返回一个数组,第一项是与整个模式匹配的字符串,之后的每项保存与正则表达式匹配的字符串
replace方法:替换,如果要替换所有字符串,需要提供正则表达式,指定全局标志
5.7 单体内置对象
5.7.1 Global对象
所有全局作用域中定义的属性和函数,都是Global对象的属性,例如isNaN() parseInt()
大多数ECMAScript实现中都不能直接访问Global对象,不过Web浏览器实现了承担该角色的window对象
uri方法:encodeURI() encodeURIComponent() decodeURI() decodeURIComponent()
5.7.2 Math对象
var max = Math.max(3, 54, 32, 16); // 找最大值 var values = [1, 2, 3, 4, 5, 6]; var max = Math.max.apply(Math, values); // 找数组中的最大值,将Math对象作为apply的第一个参数从而正确设置this值 // Math.ceil() 向上取整 // Math.floor() 向下取整 // Math.round() 四舍五入 var num = Math.floor(Math.random() * 10 + 1); // 随机得到一个1到10之间的数 function selectFrom(lowerValue, upperValue) { var count = upperValue - lowerValue + 1; return Math.floor(Math.random() * count) + lowerValue; } var num = selectFrom(2, 10); // 随机得到一个2到10之间的数