《Javascript 高级程序设计(第三版)》通读后的总结笔记(三)

160 阅读14分钟

3 JS对象

3.1 Object

  • 对象是单个事物的抽象,如一本书、一辆车、一张网页;当实物被抽象成对象,实物间的关系就变成了对象间的关系,从而可以模拟现实情况,针对对象进行编程,故“万物皆对象”
  • 对象是一个容器,封装了属性(property)和方法(method),可简单理解为数据集或功能集,是状态和行为的集合,是变量和函数的集合,是无序属性的集合
  • Object 是一个基础类型,其他所有类型都从 Object 继承了基本的行为
  • 对象在JS中被称为引用类型的值,即每个对象都基于一个引用类型创建,可以是系统内置的原生类型,或是开发人员自定义类型
  • 对象的属性的操作:增、删、改、查、遍历

3.1.1 创建与访问

//使用 new + Object()创建
var person = new Object();
person.name = "Nicholas";
person.age = 29;

//省略new操作符创建		//{}相当于new Object() 的缩写
var person = {};
person.name = "Nicholas";
person.age = 29;

//对象字面量表示法创建	// 再进一步缩写 可省略对象名
var person = {
name : "Nicholas",
age : 29					//最后一个属性后不能加逗号(,)
};
// 通过点.或中括号[]来访问对象

console.log(person.name);  		//点表示法:更简洁(推荐)
console.log(person["name"]); 	//方括号表示法:更方便,可直接通过变量名访问

3.1.2 属性与方法

  • constructor 返回用于创建当前对象的函数

  • hasOwnProperty( ) 用于检查给定的属性在当前对象实例中是否存在

  • isPrototypeOf( ) 用于检查传入的对象是否是传入对象的原型

  • propertyIsEnumerable( ) 用于检查给定的属性是否能够使用 for-in 语句来枚举

  • toString( ) 返回对象的字符串表示

  • toLocaleString( ) 返回对象的字符串表示,该字符串与执行环境的地区对应

  • valueOf( ) 返回对象的字符串、数值或布尔值表示

复制变量值

复制引用类型的值,副本变量是一个指针(并非自身),原变量与副本都将引用同一个对象,其一改变都会影响另一变量,因为ECMAScript 中所有函数的参数都是按值传递的,即与复制变量值一样

var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //"Nicholas"

3.2 Array

  • Array类型是一组值的有序列表
  • 可以存储多个不同类型的数据
  • 数组是一种特殊类型的对象

3.2.1 创建与访问

// new操作符构建法
var arr = new Array();		//创建空数组
var arr = new Array(20);	//创建确定容量的数组
var arr = new Array("red", "blue", "green");//创建带有数据的数组
var arr = Array(); 			//省略new 构造法

// 字面量表示法
var arr = []; // 创建空数组
var arr = ["red","blue","green"]; //创建一个包含3个字符串的数组
var arr = [1,2,]; //不要这样!这样会创建一个包含2或3项的数组
var arr = [,,,,,]; //不要这样!这样会创建一个包含5或6项的数组
  • 推荐使用字面量表示法来创建数组
  • 若函数没有return,使用new会返回一个对象,不使用new会返回undefined
var colors = ["red", "blue", "green"]; // 序号为0、1、2…

// 通过方括号中的数字下标索引,来访问数组中的值
var color1 = colors[0]; 		//创建一个变量保存数组第一项
console.log(color1);			//"red"

// 通过赋值来修改数组
colors[2] = "black"; 			//修改替换第三项
colors[3] = "brown"; 			//新增第四项(索引超过项数时)
console.log(colors);			//"red","blue","black","brown"

3.2.2 方法

检测方法
if (value instanceof Array){}	//旧方法,可能分别具有各自不同的构造函数
if (Array.isArray(value)){}		//新方法,能最终确定某个值到底是不是数组
遍历方法
var array = [1,2,3,4,5];

// forEach():ES5的新方法,不支持低版本IE
array.forEach(function(item, index, array){
	console.log(index + "-" + item);
});					//0-1 1-2 2-3 3-4 4-5

// for-in 快速遍历
for(var i in array){
	console.log(i);			//0 1 2 3 4
	console.log(array[i]);}	//1 2 3 4 5

// for 循环遍历
for(var i=0,len=array.length; i<len; i++){
	console.log(array[i]);}	//1 2 3 4 5
长度方法
var num = [1,2,3,4,5];

//查询数组长度(个数)
console.log(num.length);	//5

//数组长度增加与减少
num.length = 7; 	//增加时,默认赋值undefined
console.log(num);	//1,2,3,4,5,undefined,undefined
num.length = 3;		//减少时,从末项开始删除
console.log(num);	//1,2,3

//数组元素值的修改、添加与删除
num[2] = 10;		//若索引号重复,直接覆盖替换
console.log(num);	//1,2,10,4,5
num[7] = 10;		//若索引号超过数组长度,则添加指定值并自动补齐undefined
console.log(num);	//1,2,3,4,5,undefined,undefined,10
delete num[2];		//delete操作符不会改变数组长度,只是替换对应值为undefined
console.log(num);	//1,2,undefined,4,5
操作方法
var num = [1,2,3];

// 栈方法	(类似栈“后进先出”)
var numPush = num.push(7, 8); 		//在数组末尾推入两项
console.log(numPush);				//5 (返回修改后数组的长度)
console.log(num);					//1,2,3,7,8
var numPop = num.pop(); 			//删除数组的末项元素
console.log(numPop);				//3	(返回移除的项的长度)
console.log(num);					//1,2

//队列方法	(类似队列的“先进先出”)
var numShift = num.shift(); 			//移除第一项
console.log(numShift);					//1	(返回该项,这是一个值!)
console.log(num);						//2,3
var numUnshift = num.unshift(4,5,6); 	//在前端添加任意个项
console.log(numUnShift);				//6	(返回新数组的长度)
console.log(num);						//4,5,6,1,2,3

//字符串转换方法
var numJoin = num.join(-); 		//将数组中的元素用一个字符串拼接起来
console.log(numJoin);			//1-2-3	(返回拼接后的结果)
console.log(num);				//1,2,3 (原数组不会改变)
var num = [1,2,3,4,5,6];

//截取方法
var numASlice = num.slice(1); 	//单参数,返回该项至末项的所有项
var numBSlice = num.slice(1,4); //双参数,返回两参数对应项间不含末项的所有项
console.log(numASlice);			//2,3,4,5
console.log(numBSlice);			//2,3,4
console.log(num);				//1,2,3,4,5,6 (原数组不会改变)

//修改方法1:删除
var numASplice = num.splice(1,2); 	//两参数(起始位置、删除项数),
console.log(numASplice);			//2,3 (返回删除项)
console.log(num);					//1,4,5,6
//修改方法2:替换
var numBSplice = num.splice(2,2,9,11);//多参数(起始位置、删除项数、插入项..),
console.log(numASplice);			//3,4 (返回删除项)
console.log(num);					//1,2,9,11,5,6

//拼接方法
var numConcat = num.concat("ok",true,[9,11]);//
console.log(numConcat);				//1,2,3,4,5,6,"ok",true,9,11
console.log(num);					//1,2,3,4,5,6 (原数组不会改变)
重排序方法
var num2 = [10,5,40,25,1000,1];
var num3 = ["George","John","Thomas","James","Adrew"];

//倒置数组项的顺序
var num2Reverse = num2.reverse(); 
console.log(num2Reverse);		//1,1000,25,40,5,10

//按字符编码顺序升序排序
var num2Sort = num2.sort();		
console.log(num2Sort);			//1,10,1000,25,40,5
var num3Sort = num3.sort(); 	
console.log(num3Sort);			//Adrew,George,James,John,Thomas
//以上两种方法都会改变原数组原来的排序

//冒泡排序
......

位置方法
var num = [2,5,3,4,5,6,1];

//顺序查找位置方法
var numX = num.indexOf(3)		//单参数 (对应值)
var numY = num.indexOf(5,2)		//双参数 (对应值,第几个值)
console.log(numX); 			//2 (从左到右找到第一个对应值3,返回索引值2)
console.log(numY); 			//4 (从左到右找到第二个对应值5,返回索引值4)

//逆序查找位置方法
var numM = num.lastIndexOf(6)		//单参数 (对应值)
var numN = num.lastIndexOf(5,3)		//双参数 (对应值,第几个值)
console.log(numM); 			//5 (从右到左找到第一个对应值6,返回索引值5)
console.log(numN); 			//-1 (从右到左找到第三个对应值5,未找到,返回索引值-1)
迭代方法
var a = [1, 2];

//使用迭代方法时,会接收2个参数(一个是每一项运行的函数,一个是运行该函数的作用域对象),这时会对数组中的每一项运行一个给定的函数,这个函数会接收三个参数(对应值,该项位置,数组对象本身)

//every():若该函数对“每”一项都返回true,则最终结果返回true
a.every(function(item, index, array){	//
	return (item >1);})			//false

//some():若该函数对“任”一项都返回true,则最终结果返回true
a.some(function(item) {
	return (item >1);})			//true

//filter():返回该函数中 会返回true的项 所组成的数组
a.filter(function(item) { 
	return (item >1);})			//[2]

//map():返回每次函数调用的结果 组成的数组
a.map(function(item) { 
	return item;})				//[1,2]

//forEach():此方法没有返回值
a.forEach(item) {
	console.log(item);}			//1 2
归并方法
var b = [1,2,3,4,5];

//reduce():顺序遍历
var sum1 = b.reduce(function(prev, cur, index, array){
	return prev + cur;});
alert(sum1); 			//15

//reduceRight():逆序遍历
var sum2 = b.reduceRight(function(prev, cur, index, array){
	return prev + cur;});
alert(sum2); 			//15

3.3 Date

3.3.1 时间格式

  • 格里尼治时间(GTM):英国郊区格林尼治天文台时间,用于世界上某些重大时间
  • 世界标准时间(UTC):世界时间1970年1月1日0时开始(毫秒数)

3.3.2 创建时间

//使用Date()函数创建
var nowDate = Date();			
console.log(nowDate);			//得到运行此语句时刻的当前时间
console.log(typeof nowDate);	//string (时间实际上是字符串类型)

//使用构造函数创建(对象类型)
var nowDate = new Date();
console.log(typeof nowDate);	//object

//可指定参数来设置时间格式
var date = new Date("2017/11/3 12:30:12");
console.log(date);//Wed Aug 07 2019 15:43:48 GMT+0800 (中国标准时间)

3.3.3 方法

//Date对象的方法大致分为3类
//get	获取(年、月、日、星期、时、分、秒、毫秒)
//set	设置(年、月、日、星期、时、分、秒、毫秒)
//to	格式化转换

//[注1]大部分的返回值中,0代表现实意义中的1(如1号、1月份、1秒)
//[注2]时间运算:两个时间对象相减,得到的是两个对象间相差的毫秒数

3.4 RegExp

正则表达式:用于匹配规律规则的表达式,一种过滤逻辑公式,通常被用来检索、替换那些符合某个模式(规则)的文本。

正则表达式实际上也是一种object类型。

3.4.1 创建

//字面量创建		
var 变量名 = /表达式/匹配模式修饰符;

//构造函数创建
var 变量名 = new RegExp("表达式","匹配模式修饰符");

3.4.2 表达式

//常用
[abc]		查找方括号之间的任何字符
[^abc]		查找任何不在方括号之间的字符
[0-9]		查找任何从 09 的数字
[a-z]		查找任何从小写 a 到小写 z 的字符
[A-Z]		查找任何从大写 A 到大写 Z 的字符
[A-z]		查找任何从大写 A 到小写 z 的字符
a[bcd]e		字符中间匹配 (abe,ace,ade都行)
X|y|z		或匹配 (匹配x或y或z,存在其中一个即可)

//单字符&数字
.			匹配除换行符之外的任意字符 (匹配点"."需要转义字符/\./)
\d			匹配数字
\D			匹配非数字
\w			匹配字母
\W			匹配非字母

//空白字符
\0			匹配 null 字符
\s			匹配空白字符、空格、制表符或换行符
\S			匹配非空白字符
\n 			匹配换行符
\r			匹配回车符
\f			匹配进纸符
\t			匹配制表符
\v			匹配垂直制表符

//定位符
^			行首匹配
$			行尾匹配
\A			只匹配字符串的开始处
\b			匹配单词边界,词在[]内无效(\bchild\b ≡ children× child√ )
\B			匹配非单词边界
\z			只匹配字符串结束处
\Z			匹配字符串结束处或行尾
\G			匹配当前搜索的开始位置

//进制数
\xxx		查找以八进制数 xxx 规定的字符
\xdd		查找以十六进制数 dd 规定的字符
\uxxxx		查找以十六进制数 xxxx 规定的 Unicode 字符

//限定符 量词
n+			匹配任何包含至少一个n的字符串 (n+ ≡ a× n√ nnn√)
n*			匹配任何包含零个或多个n的字符串
n?			匹配任何包含零个或一个n的字符串
n{X}		匹配包含X个n的序列的字符串 (n{4} ≡ nnnn)
n{X,Y}		匹配包含X至Y个n的序列的字符串 (an{1,3} ≡ an√ ann√ annn√)
n{X,}		匹配包含至少X个n的序列的字符串 (an{2,} ≡ an× ann√ annnnn√)
^n			匹配任何开头为n的字符串 (^n ≡ an× na√ nan√)
n$			匹配任何结尾为n的字符串
^n$			匹配开头为n且结尾为n的字符串(^n$ ≡ an× na× nan√)
?=n			匹配任何其后紧接指定字符串 n 的字符串
?!n			匹配任何其后没有紧接指定字符串 n 的字符串

//引用
\1..\9
$1...$9		返回九个在模式匹配期间找到的、最近保存的部分
匹配模式修饰符
g	globle 		全局匹配模式(查找所有匹配,而不光在找到第一个匹配后停止)
i	ignorCase 	忽略大小写模式
m	mutiple 	允许多行匹配模式

3.4.3 属性

实例属性
global 		检测是否设置g标记
ignoreCase 	检测是否设置标记
multiline 	检测是否设置了m标记
source 		返回正则表达式的字符串表示
lastIndex 	返回被查找字符串中下一次成功匹配的开始位置
构造函数属性
$_	input		返回最近一次匹配的字符串
$&	lastMatch	返回最近一次的匹配项
$+	lastParen	返回最近一次匹配的捕获组
$`	leftContext	返回被查找的字符串中从字符串开始位置到最后匹配之前的位置之间的字符
$'	rightContext 返回被搜索的字符串中从最后一个匹配位置开始到字符串结尾之间的字符
s*	multiline	检测表达式是否采用多行模式匹配m

3.4.4 方法

实例方法
//exec()	检索字符串中指定的值。返回找到的值,并确定其位置。
特性	
	- 有全局标记g	持续查找所有匹配项并返回
	- 无全局标记g	始终返回第一个匹配项信息
执行过程
	1.检索字符串参数,获取正则表达式匹配文本
    2.找到匹配文本则返回一个数组
    	- 第0个元素 与整个模式匹配的字符串
        - 其他元素 与捕获组匹配的字符串
    3.否则返回null
 
//test()	在字符串中测试模式匹配,返回true或false
var reg = /aaa/;
console.1og(reg.test("aabc"));		//false
字符串方法
//match()	将符合条件的正则表达式的内容提取出来
	- 默认情况下,只会找到第一个符合要求的内容,找到后停止检索
	- 可以设置全局匹配模式,这样就能匹配到所有符合的内容
	- 匹配到的内容会封装到一个数组中返回,即使只查询到一个结果
var str = "1a2b3c4d5e6f7A8B9C";
var result1 = str.match(/[a-z]/);
var result2 = str.match(/[a-z]/ig);	//可设置多个匹配模式 顺序无所谓
console.log(result1);	//a
console.log(result2);	//a,b,c,d,e,f,A,B,C
console.log(typeof result1);	//object

//replace("表达式","替换内容")	将与正则表达式匹配的值替换为新的内容
	- 默认只会替换第一个
var str = "1a2b3c4";
var result = str.match(/[a-z]/,"@_@");
var result2 = str.match(/[a-z]/ig,"@_@");
console.log(result1);	//1@_@2b3c4
console.log(result2);	//1@_@2@_@3@_@4


//search() 	检索与指定的正则表达式相匹配的值
	- 如果搜索到指定内容,则会返回第一次出现的索引
	- 如果没有搜索到返回-1
var str = "hello abc hello aec afc";//搜索字符串中是否含有abc或aec或afc
var result = str.search(/a[bef]c/);
console.1og(result);	//6 (在索引6处首次被搜到)

//split() 	把字符串分割为字符串数组
var str="1a2b3c4d5e6f7"var result=str.split(/[A-z]/);	//1,2,3,4,5,6,7

3.4.5 实例

//手机号的规则	13567890123 (11位)
	1.1开头			   ^1
	2.第二位3-9任意数字	[3-9]
	3.三位以后任意数字9个   [0-9]{9}$

var phoneStr = "13067890123"    
var phoneReg = /^1[3-9][0-9]{9}$/;
console.log(phoneStr.test(phoneReg));	//ture
//去除误输入的字符前后空格		- 使用""来替换空格

var str = "      he    llo    ";   
str = str.replace(/\s/,"");		//去除一个空格
str = str.replace(/\s/g,"");	//去除所有的空格,包括中间
str = str.replace(/^\s*/,"");	//去除开头的空格
str = str.replace(/\s*$/,"");	//去除结尾的空格
str = str.replace(/^\s*$/g,"");	//无效
str = str.replace(/^\s*|\s*$/g,"");//匹配开头和结尾的空格
console.log(str);	//"hello"
//匹配中文字符
[\u4e00-\u9fa5]

//匹配双字节字符(包括汉字)
[^\x00-\xff]
 
//匹配空白行的正则表达式(用来删除空白行)
\n\s*\r				

//匹配HTML标记(对复杂的嵌套标记无用)
<(\S*?)[^>]*>.*?</\1>|<.*? /> 

//匹配首尾空白字符(删除行首行尾的空白字符)
^\s*|\s*$			

//匹配Email地址(表单验证)
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*	

//匹配网址URL的正则表达式
[a-zA-z]+://[^\s]*

//匹配帐号是否合法(表单验证:字母开头,允许5-16字节,允许字母数字下划线)
^[a-zA-Z][a-zA-Z0-9_]{4,15}$

//匹配国内电话号码(形式如 0511-4405222 或 021-87888822)
\d{3}-\d{8}|\d{4}-\d{7}

//匹配腾讯QQ号(QQ号从10000开始)
[1-9][0-9]{4,}

//匹配中国邮政编码(6位数字)
[1-9]\d{5}(?!\d)

//匹配身份证(一代15位或二代18位)
\d{15}|\d{18}

//匹配ip地址(用于提取ip地址)
\d+\.\d+\.\d+\.\d+

//匹配特定数字(处理大量数据)
^[1-9]\d*$			//正整数
^-[1-9]\d*$			//负整数
^-?[1-9]\d*$		//整数
^[1-9]\d*|0$		//非负整数(正整数 与 0)
^-[1-9]\d*|0$		//非正整数(负整数 与 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$			//正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$		//负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$	//浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //非负浮点数
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //非正浮点数

//匹配特定字符串
^[A-Za-z]+$		//由26个英文字母组成的字符串
^[A-Z]+$		//由26个英文字母的大写组成的字符串
^[a-z]+$		//由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$	//由数字和26个英文字母组成的字符串
^\w+$			//由数字、26个英文字母或者下划线组成的字符串

3.5 Function

函数实际上是 Function 类型的实例,因此函数也是对象;而这一点正是 JavaScript有特色的地方。由于函数是对象,所以函数也拥有方法,可以用来增强其行为。

属性与方法

  • arguments

    • arguments和this类似,都是函数中的隐含的参数
    • arguments是一个类数组元素,它用来封装函数执行过程中的实参 所以即使不定义形参,也可以通过arguments来使用实参
    • arguments中有一个属性callee表示当前执行的函数对象
  • this 函数的上下文对象,根据函数的调用方式不同会执向不同的对象

    • 隐式绑定:以方法的形式调用时,this是调用方法的对象

    • 构造函数绑定:以构造函数的形式调用时,this是新建的那个对象

    • 硬绑定:使用call和apply调用时,this是指定的那个对象

    • 默认绑定:以函数的形式调用,或在全局作用域中this代表window(若开启严格模式,this会输出undefined)

    谁调用this,其所在环境属于谁,this就指向谁

  • call( ) 直接调用函数1,直接传递函数的实参

  • apply( ) 直接调用函数2,将实参封装到一个数组中传递

3.6 Boolean

Boolean 对象在 ECMAScript 中的用处不大,因为它经常会造成人们的误解

var falseValue = false; 				//创建布尔值
result = falseValue && true; 
alert(result);  //false 

var falseObject = new Boolean(false); 	//创建布尔对象
var result = falseObject && true; 
alert(result);  //true 

//所以进行逻辑运算时,有这样一个规律
Boolean() && boolean	//结果是boolean
boolean && Boolean()	//结果是Boolean( )

//基本类型与引用类型的布尔值在进行typeof()instanceof()测试时,返回的结果都不同
alert(typeof falseObject);   			//object 
alert(typeof falseValue);    			//boolean 
alert(falseObject instanceof Boolean); 	//true
alert(falseValue instanceof Boolean);  	//false 

//所以,建议是永远不要使用 Boolean 对象!!!

3.7 Number

Number对象提供了 valueOf() toLocaleString() toString() toFixed() toExponential() toPrecision() 等方法,但是对不同的浏览器兼容性不同,并且在进行typeof()instanceof()测试时出现的情况与 Boolean 对象相似。

因此,仍然不建议直接使用实例化 Number 对象!!!

3.8 String

字符串有两种形式:基本类型、对象类型

  • 字符串在底层中是以字符数组的形式保存的
  • 对象类型字符串封装了一些属性及方法,而基本类型则没有

可直接用基本类型字符串调用字符串对象封装的属性及方法,无须手动转换

//基本类型字符串 String 
var str1 = "Hello World";
console.logtypeof str1);	//string

//对象类型字符串 Object 
var str2 = new String("Hello World");
console.log(typeof str2);	//object

3.8.1 方法

字符方法
var str ="what color do you like";

//charAt(index) 获取对应下标处的字符
console.log(str.charAt(9));			//r 
console.log(str.charAt(30));		//""(未找到返回空字符串)
console.log(typeof str.charAt(30));	//string

//charCodeAt(index) 获取对应下标处的字符编码(0~65535)
console.log(str.charCodeAt(3));			//116 (ASCII码)
console.log(str.charCodeAt(30));		//NaN
console.log(typeof str.charCodeAt(30));	//number

//下标索引直接获取法	(IE7即以下不支持)
console.log(str[11]);				//d

//String.fromCharCode(ASCII) 获取ASCII码对应的字符
var str1ASCII = String.fromCharCode(117);
console.log(str1ASCII);				//u
var str2ASCII = String.fromCharCode(104, 101, 108, 108, 111);
console.log(str2ASCII);				//"hello"
操作方法
var str = "hello world"; 

//concat() 将字符串拼接起来,返回拼接后的新字符串
var strConcat1 = str.concat(" wow");
var strConcat2 = str.concat(" wow", "!"); //多拼接
console.log(strConcat1);        //"hello world wow" 
console.log(strConcat2);        //"hello world wow!" 
console.log(str);      			//"hello world"

//slice() 截取介于两个指定下标之间的字符(开始索引,结束索引)
//substring() 截取介于两个指定下标之间的字符(开始索引,结束索引)
//substr()	截取从头索引开始的指定个数的字符(开始索引,截取位数)
//单参数时,默认截取到尾部
console.log(str.slice(3));        //"lo world" 
console.log(str.substring(3));    //"lo world" 
console.log(str.substr(3));       //"lo world" 
console.log(str.slice(3, 7));     //"lo w" 
console.log(str.substring(3,7));  //"lo w" 
console.log(str.substr(3, 7));    //"lo worl"
//参数为负值时,则从后往前截取 (substring所有负值参数都转换为0)
console.log(stringValue.slice(-3));         //"rld" 
console.log(stringValue.substring(-3));     //"hello world" 
console.log(stringValue.substr(-3));        //"rld" 
console.log(stringValue.slice(3, -4));      //"lo w" 
console.log(stringValue.substring(3, -4));  //"hel" 
console.log(stringValue.substr(3, -4));     //""(空字符串)

console.log(str);      			//"hello world"(原字符串不改变)
分割方法
//split() 把一个字符串分割成字符串数组

var str= "Tom is a good man!";

//未指定长度
console.log(str.split(" "));	//["Tom","is",a","good","man!"]
//指定返回数组的最大长度3
console.log(str.split(" ",3));	//["Tom","is","a"]
console.log(str.split("",6));	//["T","o","m","","i","s"]
位置方法
var str = "hello world"; 

//indexOf()	顺序查找指定字符,并返回索引值
//lastIndexOf() 逆序序查找指定字符,并返回索引值
console.log(str.indexOf("o"));            //4 
console.log(str.lastIndexOf("o"));        //7
//双参数时,第二个参数表示从哪个索引值位置开始搜索
console.log(str.indexOf("o", 6));         //7 
console.log(str.lastIndexOf("o", 6));     //4
//若找不到指定字符,会返回-1
console.log(str.indexOf("y"));            //-1
修整方法
//trim() 删除前置及后缀的所有空格创建其副本,返回结果
var str = "   hello world "; 
var strTrim = str.trim(); 
console.log(strTrim);     //"hello world"  
console.log(str);            //"   hello world "(原字符串不改变)

//trimLeft() 删除头部所有空格创建其副本,返回结果
//trimRight() 删除尾部所有空格创建其副本,返回结果
大小写转换方法
var str = "hello world"; 

console.log(str.toUpperCase());			//"HELLO WORLD" (转大写)
console.log(str.toLowerCase());			//"hello world" (转小写)
//针对特定地区的少数语言,使用以下方法
console.log(str.toLocaleUpperCase());  	//"HELLO WORLD"
console.log(str.toLocaleLowerCase());  //"hello world"

console.log(str);				//"hello world"(原字符串不改变)
模式匹配方法
//match()
//search()

//replace() 字符串替换
var str = "A good man!A nice man";//只能替换第一次出现的字符串
var strRep = str.replace("man","woman");
console.log(strRep);	//"A good woman!A nice man"
strRep = str.replace(/man/g,"woman");//通过正则表达式实现全部替换
console.log(strRep);	//"A good woman!A nice woman"
console.log(str);		//"A good man!A nice man" (原字符串不变)
比较大小方法
//localeCompare() 从左往右单字符比较其ASCII码值,值大者大
var str = "yellow";
console.log(str.localeCompare("brick"));    //1 (yellow更大)
console.log(str.localeCompare("yellow"));	//0 (相等)
console.log(str.localeCompare("zoo"));      //-1 (zoo更大)

3.9 Global

3.9.1 方法

URI 编码方法
//encodeURI() 对本身不属于URI的特殊字符进行编码
//encodeURIComponent() 对任何非标准字符进行编码	(开发中更常用)

var uri = "http://www.wrox.com/illegal value.htm#start";
alert(encodeURI(uri));	
//"http://www.wrox.com/illegal%20value.htm#start"
alert(encodeURIComponent(uri));
//"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start"
URI 解码方法
//decodeURI() 只能对使用encodeURI()替换的字符进行解码
//decodeURIComponent() 可解码任何特殊字符的编码

var uri="http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start";
alert(decodeURI(uri));
//http%3A%2F%2Fwww.wrox.com%2Fillegal value.htm%23start
alert(decodeURIComponent(uri));
//http://www.wrox.com/illegal value.htm#start

在以前会使用escape()和unescape()方法,但在ECMA-262第3版已经被废弃,请不要使用!!!

ECMAScript 解析器
//eval() 获取返回值,可将字符串转换为代码执行,并返回一或多个值,在执行时遇错,则抛出异常给调用者

eval("alert('hi')"); 	//等价于 alert("hi"); 
 
var msg = "hello world";
eval("alert(msg)"); 	//"hello world"

eval()方法解释代码字符串的能力非常强大,但也非常危险,所以谨慎使用!!!

3.9.2 属性

浏览器都会将全局对象作为window对象的一部分来实现。因此在全局作用域中声明的所有变量和函数,都是window 对象的属性

3.X Math

3.X.1 属性

Math.E				//自然对数的底数,即常量 e 的值
Math.LN10			//10的自然对数
Math.LN2			//2的自然对数
Math.LOG2E			//以2为底 e 的对数
Math.LOG10E			//以10为底 e 的对数
Math.PI				//π的值
Math.SQRT1_2		//1/2的平方根(即2的平方根的倒数)
Math.SQRT2			//2的平方根

3.X.2 方法

Math.round(4.5)				//5 四舍五入
Math.ceil(3.1)				//4 向上取整
Math.floor(3.9)				//3 向下取整
Math.max(3,6,76,8,89,32)	//89 取最大值
Math.min(3,6,76,8,89,32)	//3 取最小值
Math.abs(-10)				//10 取绝对值
Math.pow(2,3)				//8 x的y次方
Math.sqrt(25)				//5 开平方
Math.random()				//0.6334986525422 生成一个0-1之间的随机数