1.Object
//声明对象1
var person = new Object();
person.name = "Nicholas"
person.age = 29;
//声明对象2
var person = {
name : "Nicholas",
age : 29
}
2.Array
value instanceof Array判断对象是否为数组
转换方法demo
var color = ["red","green","blue"]
colors.tostaring(); //red,blue,green
colors.valueof(); //red,blue,green
colors.join(",") //red,blue,green
colors.join("||") //red||blue||green
栈方法demo
var colors = new Array();
var count = colors.push("red","green");
alert(count); //2
count = colors.put("blue");
alert(count); //3
var item = colors.pop(); //获取最后一项
alter(item); //"blue"
alter(colors.length); //2
队列防范demo
var colors = new Array();
var count = colors.push("red","green");
alert(count); //2
var item = colors.shift();
alter(item); //red
alert(colors.length)://2
重排序方法reverse、sort
//reverse
var values = [1,2,3,4,5];
vaules.reverse();
alert(values); //5,4,3,2,1
//sort()与其他语言的sort方法不同,相当于把数组中的每个值都toString后再比较
var values = [0,1,5,10,15];
values.sort();
alert(values); //0,1,10,15,5
//因此需要给sort方法传入参数
var values = [0,1,5,10,15];
values.sort(compare);
alert(values); //0,1,5,10,15
function compare(value1, value2) {
if (value1 < value2) {
return -1;
} else if (value1 > value2) {
return 1;
} else {
return 0; }
}
操作方法concat、slice、splice
var color = ["red","green","blue"];
var color2 = color.concat["yellow",["black","brown"]];
alert(color); //red,green,blue
alert(color2); //red,green,blue,yellow,black,brown
//slice()方法基于当前数组中的一个或多个项创建一个新的数组,入参为位置
var colors = ["red", "green", "blue", "yellow", "purple"];
var colors2 = colors.slice(1);
var colors3 = colors.slice(1,4);
alert(colors2); //green,blue,yellow,purple
alert(colors3); //green,blue,yellow
//splice()
- 删除splice(0,2)可以删除数组中的前两项
- 插入splice(2,0,"red","green"),起始位置、要删除的个数、插入的元素
- 替换splice(2,1,"red","green")
var color = ["red","green","blue"];
var removed = colors.splice(0,1);
alert(color); //green,blue
alert(removed); //red,返回的数组中只包含一项
removed = color.splice(1,0,"yellow","orange");
alert(color); //green,yellow,orange,blue
alert(removed); //返回为空
removed = colors.splice(1,1,"red","purple");
alert(color); //green,red,purple,orange,blue
alert(removed); //yellow
位置方法
var num = [1,2,3,4,5,4,3,2,1];
alert(num.indexOf(4)); //3
alert(num.lastInedxOf(4)); //5
alert(num.indexOf(4,4)); //5
alert(number.lastIndexOf(4,4)); //3
var person = {name : "Nicholas"};
var people = [{name : "Nicholas"}];
var morePeople = [person];
alert(people.indexof(person)); //-1
alert(morePeople.indexOf(person)); //0
迭代方法(以下方法都不会修改数组的值)
- every()对数组每个值执行一个函数,如果所有函数执行结果都是true,最后返回true(and)
- some()对数组每个值执行一个函数,如果有一个函数执行为true,最后返回true(or)
- filter()对数组每个值执行一个函数,返回执行结果为true的数组
- forEach()对数组每个值执行一个函数。无返回值
- map()对数组每个值执行一个函数,每个函数的结果组成数组
var num = [1,2,3,4,5,4,3,2,1];
var everyResult = num.every(function(item,index,array){
return (item > 2);
});
alert(everyResult); //false
var someResult = numbers.some(function(item,index,array){
return (item > 2);
});
alert(someResult); //true
var filterResult = numbers.some(function(item,index,array){
return (item > 2);
});
alert(filterResult); //[3,4,5,4,3]
var mapResult = numbers.map(function(item,index,array){
return (item * 2);
});
alert(mapResult); //[2,4,6,8,10,8,6,4,2]
归并方法 reduce、reduceRight
注:reduceRight()与reduce()结果一样,但是执行顺序相反
//reduce
var values = [1,2,3,4,5]
var sum = values.reduce(function(prev,cur,index,array){
return perv + cur;
});
alert(sum); //15
//reduceRight
var values = [1,2,3,4,5]
var sum = values.reduceRight(function(prev,cur,index,array){
return perv + cur;
});
alert(sum); //15
3.Date类型
var now = new Date();
//创建一个2004年5月25日的日期对象
var someDate = new Date(Date.parse("May 25, 2004"));
//GMT时间2005年5月5日下午5:55:55
var allFives = new Date(Date.UTC(2005, 5, 5, 17, 55, 55));
var allFives1 = new Date(2005, 4, 5, 17, 55, 55);
继承的方法
var date1 = new Date(2007,0,1); //"January 1, 2007"
var date2 = new Date(2007,1,1); //"February 1, 2007"
alert(date1 < date2); //true
alert(date1 > date2); //false
日期格式化方法
- toDateString()--以特定的格式展示星期、月、日、年
- toTimeString()--以特定的格式展示时、分、秒、时区
- toLocaleDateString()--以特定的地区展示星期、月、日、年
- toLocaleTimestiring()--以格式展示时、分、秒
- toUTCString()--以特定的格式展示完成的UTC日期
日期、时间组件方法
- getTime()
- setTime()
- getFullYear()
- getUTCFullYear()
- setFullYear()
- setUTCFullYear()
- getMonth()
- getUTCMonth()
- setMonth()
- setUTCMonth()
- getDate()
- getUTCDate()
- setDate()
- setUTCDate()
- getDay() --返回日期是星期几
- getUTCDay() --返回UTC中日期是星期几
- getHours()
- getUTCHours()
- setUTCHours()
- getMinutes()
- getUTCMinutes()
- setMinutes()
- setUTCMinutes()
- getSeconds()
- getUTCSeconds()
- setSeconds()
- setUTCSeconds()
- getMilliseconds()
- getUTCMilliseconds()
- setMilliseconds()
- setUTCMilliseconds
- getTimezoneOffset()
4.RegExp
- g:表示全局模式
- i:表示不区分大小写
- m:表示多行
//字符串中所有包含“at”的
var pattern1 = /at/g;
//匹配到第一个"bat"、"cat",不区分大小写
var pattern2 = /[bc]at/i;
//所有以“at”结尾的3个字符的组合,不区分大小写
var pattern3 = /.at/gi;
//第一个[bc]at,不区分大小写
var pattern2 = /\[bc\]at/i;
RegExp实例属性
RegExp的每个实例都有以下属性
- global:是否设置了g标志,boolean
- ignoreCase:是否设置了i标志,boolean
- lastIndex:从开始搜索下一个匹配项字符串位置,从0开始算
- multiline:是否设置了m标志,boolean
- source:
var pattern1 = /\[bc\]at/i;
alert(pattern1.global); //false
alert(pattern1.ignoreCase); //true
alert(pattern1.multiline); //false
alert(pattern1.lastIndex); //0
alert(pattern1.source); //"\[bc\]at"
RegExp实例方法
var text = "mom adn dad and bady";
var pattern = /mom( and dad( and baby)?)?/gi;
var matches = pattern.exec(text);
alert(matches.index); //0
alert(matches.input); //"mom and dad and baby"
alert(matches[0]); //"mom and dad and baby"
alert(matches[1]); //" and dad and baby"
alert(matches[2]); //" and baby"
5.Function类型 function经常用不解释
没有重载
//result会调用最近的方法执行
function addSomeNumber(num){
return num + 100;
}
function addSomeNumber(num){
return num + 200
}
var result = addSomeNumber(100); //300
函数声明与函数表达式
//解析器会先读取函数声明,并使其在执行任何代码之前可以被使用函数表达式,则必须等到解析器执行到它所在的代码行,才会被解析
//1.解析器先通过函数声明提升过程,读取函数声明并添加到环境中
//2.对代码求值是,js引擎也能把函数声明提升到顶部
alert(sum(10,10));
function sum(num1,num2){
return num1+num2;
}
//以上代码会在运行期间报错,函数位于一个初始化语句中,所以当sum加载的时候找不到function
alert(sum(10,10));
var sum = function sum(num1,num2){
return num1+num2;
};
值函数:
//可以将一个函数作为另一个函数的结果返回
function callSomeFunction(someFunction, someArgumert){
return someFunction(someArgument);
}
function add10(num){
return num + 10;
}
var result1 = callSomeFunction(add10,10);
alert(result1); //20
function getGreeting(name){
return "hello," +name;
}
var result2 = callSomeFunction(getGreeting, "Nicholas")
alert(result2); //"hello,Nicholas"
适用场景
例如,一个对象数组,需要根据某个对象属性对数组进行排序,而传递给数组sort()方法
比较函数只能接受两个参数。下面做一下尝试:
function createComparisonFunction(propertyName){
return function(object1, object2){
var value1 = object1[propertyName];
var value2 = object2[propertyName];
if(value1 < value2){
return -1;
} else if (value1 > value2){
return 1;
} else{
return 0;
}
};
}
//调用上面的方法,这个方法绝对经典
var data = [{name: "Zachary", age:28}, {name: "Nicholas", age: 29}];
data.sort(creatComparisonFunction("name"));
alert(data[0].name); //Nicolas
data.sort(creatComparisonFunction("age"));
alert(data[0].name); //Zachary
函数内部属性
函数内部有两个特殊对象:arguments和this
arguments demo:为了消除与方法名之间的耦合,可以用arguments.callee的方式
无论方法名称怎么改变,内部的调用无需更改。
//正常递归
function factorial(num){
if (num <=1){
return 1;
} else {
return num * factoral(num -1)
}
}
//arguments递归
function factorial(num){
if (num <= 1){
return 1;
} else {
return num * arguments.callee(num-1)
}
}
this,行为与java类似
window.color = "red";
var o = {color : "blue"};
function sayColor(){
alert(this.color);
}
syaColor(); //"red"
o.sayColor = sayColor;
o.sayColor(); //"blue"
解释一下:
上面函数sayColor()是在全局作用域中定义的,它引用了this对象,这里this引用了全局对象windwo。
当把这个函数赋值给对象o,调用o.sayColor(),this引用的是对象o,所以结果是blue。
函数属性和方法
每个函数都包含两个属性:length和prototype
length表示函数希望接受命名参数的个数
function sayName(){
alert(name);
}
function sum(num1, num2){
return num1 + num 2;
}
function sayHi(){
alert("hi");
}
alert(sayName.length); //1
alert(sum.length); //2
alert(sayHi.length); //0
prototype是保存所有实例方法的本质:apply()和call()
apply()demo
//apply方法可以传入运行函数作用域,另一个是数组(也可以是arguments对象)
function sum(num1, num2){
return num1 + num2;
}
function callSum1(num1, num2){
return sum.apply(this, arguments);
}
function callSum2(num1, num2){
retunr sum.apply(this, [num1, num2]);
}
alert(callSum1(10,10)); //20
alert(callSum2(10,10)); //20
call()demo,在使用callSum()的时候必须准去传入每一个参数
window.color = "red";
var o = {color:"blue"};
function sayColor(){
alert(this.color)
}
sayColor(); //red
sayColor().call(this); //red
sayColor().call(window); //red
sayColor().call(o); //blue
这次saycolor作为全局变量,所以直接执行方法是全局的color
sayColor.call(this)与sayColor.call(window)则是在全局作用域中调用函数的方式,结果是red
sayColor().call(o)时执行的对象变成了o,所以结果是blue。
bind() demo,相当于sayColor被绑定了
window.color = "red";
var o = {color : "blue"};
function sayColor(){
alert(this.color);
}
var objectSayColor = sayColor.bind(o);
bijectSayColor(); //blue
6.基本包装类型
为了方便操作基本类型,三个特殊引用类型:Boolean、Number、String
\\new Object
var obj = new Object("some text");
alert(obj instanceof String); //true
转型构造函数
\\构造函数
var value = "25";
var number = Number(value); //转型函数
alert(typeof number); //Number
var obj = new Number(value);//构造函数
alert(typeof obj); //Object
boolean类型
var falseObject = new Boolean(false);
var result = falseObject && true;
alert(result); //true
var falseObject = false;
result = false && true;
alert(result); //false
falseObject && true这段代码针对的是falseObject这个对象
Number类型
//把num转换成对应的二进制...
var num = 10;
alert(num.toString()); //10
alert(num.toString(2)); //1010
alert(num.toString(8)); //12
alert(num.toString(10)); //10
alert(num.toString(16)); //a
Number的格式化方法
//toFixed转换成小数
var num = 10;
alert(num.toFixed(2)); //10.00
//toFixed约等于
var num1 = 10.005;
alert(num1.toFixed(2)); //"10.01"
//toExponential
var num = 10;
alert(num.toExponential(1)); //"1.0e+1"
关于Number的转型
var numberObject = new Number(10);
var numberValue = 10;
alert(typeof numberObject); //"object"
alert(typeof numberValue); //"number"
alert(numberObject instanceof Number); //true
alert(numberValue instanceof Number); //false
String类型
length属性
var stringValue = "Hello world";
alert(stingValue.length); //11
字符方法
//chatAt
var stringValue = "hello world";
alert(stringValue.charAt(1)); //"e"
//charCodeAt:输出字母对应的字符编码
alert(stringValue.charCodeAt(1)); //"101"
//stringValue[index]
alert(stringValue[1]) //"e"
字符串操作方法
//concat()
var stringValue = "hello world";
var result = stringValue.concat("world","!");
alert(result);
alert(stringValue);
//slice()
alert(stringValue.slice(3)); //lo world
alert(stringValue.slice(3, 7)); //lo w
alert(stringValue.slice(-3)); //rld
alert(stringValue.slice(3, -4)); //"lo w"
//substr()
alert(stringValue.substr(3)); //lo world
alert(stringValue.substr(3, 7)); //lo worl
alert(stringValue.substr(-3)); //"rld"
alert(stringValue.substr(3, -4)); //""空字符串
//sbustring()
alert(stringValue.substring(3)) //lo world
alert(stringValue.substring(3,7)); //lo w
alert(stringValue.substring(-3)); //hello world
alert(stringValue.substring(3, -4));//"hel"
字符串位置方法
var stringValue = "hello world";
//indexof
alert(stringValue.indexOf("o")); //4
alert(stringValue.indexOf("o", 6)); //7
//lastIndexOf
alert(stringValue.lastIndexOf("o")); //7
alert(stringValue.lastIndexOf("o", 6)); //4
通过循环调用indexof()或lastIndexOf()来找到所有匹配的子字符串
var strinValue = "Lorem ipsum dolor sit amet, consectetur adipisicing elit";
var positions = new Array();
var pos = stringValue.indexOf("e");
while(pos > -1){
positions.push(pos);
pos = stringValue.indexOf("e", pos +1);
}
alert(positions); //"3,24,32,35,52"
trim()方法
var stringValue = " hello world ";
var trimmedStringValue = stringValue.trim();
alert(trimmedStringValue) //"hello world"
字符串大小写转换方法
var stringValue = "hello world";
alert(stringValue.toLocaleUpperCase()); //"HELLO WORLD"
alert(stringValue.toUpperCase()); //"HELLO WORLD"
alert(stringValue.toLocaleLowerCase()); //"hello world"
alert(stringValue.toLowerCase()); //"hello world"
字符串的模式匹配方法
//match方法返回一个数组
var text = "cat, bat, sat, fat";
var pattern = /.at/;
// 与pattern.exec(text)相同
var matches = text.match(pattern);
alert(matches.index); //0
alert(matches[0]); //"cat"
alert(pattern.lastIndex); //0
search()demo
var text = "cat, bat, sat, fat";
var pos = text.search(/at/);
alert(pos); //1
replace
var text = "cat, bat, sat, fat";
var result = text.rep;ace("at", "ond")
alert(result); //"cond, bat, sat, fat"
result = text.replace(/at/g, "ond");
alert(result); //"cond, bond, sond, fond"
localeCompare
//字符串比较大小
var stringValue = "yellow";
alert(stringValue.localeCompare("brick")); //1 alert(stringValue.localeCompare("yellow")); //0 alert(stringValue.localeCompare("zoo")); //-1
fromCharCode
把字符编码转换成字符
alert(String.fromCharCode(104, 101, 108, 108, 111)); //"hello"
7.单体内置对象
Global对象(全局对象)
URI编码方法
var uri = "http://www.wrox.com/illegal value.htm#start";
//"http://www.wrox.com/illegal%20value.htm#start"
alert(encodeURI(uri));
//"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start"
alert(encodeURIComponent(uri));
eval()方法:相当于一个完成的js解析器
eval("alert('hi')");
//相当于
alert("hi");
Global对象属性
- undefined
- NaN
- Infinity
- Object
- Array
- Function
- Boolean
- String
- Number
- Date
- RagExp
- Error
- EcalError
- RangeEror
- EvalError
- RangeError
- ReferenceError
- SyntaxError
- TypeError
- URIError
Math对象
var max = Math.max(3, 54, 32, 16)
alert(max); //54
var min = Math.min(3, 54, 32, 16);
alert(min); //3
舍入方法
alert(Math.ceil(25.9)); //26
alert(Math.ceil(25.5)); //26
alert(Math.ceil(25.1)); //26
alert(Math.round(25.9)); //26
alert(Math.round(25.5)); //26
alert(Math.round(25.1)); //25
alert(Math.floor(25.9)); //25
alert(Math.floor(25.5)); //25
alert(Math.floor(25.1)); //25
random()方法
//1到10随机数
var num = Math.floor(Math.random() * 9 + 2);
以上内容引用于《JavaScript高级程序设计(第三版)作者:Nicholas C.Zakas》