1.知识点汇聚
1.1 面向对象的程序设计常用概念
对象(名词):是指“事物”在程序设计语言中的表现形式。是JavaScript的一个基本数据类型,是一种复合值,它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值。即属性的无序集合。
类:实际上就是对象的设计蓝图或制作配方。类更多的是一种模板,而对象就是在这些模版的基础上被创建出来的,就是用于构造对象的fn。
封装:主要阐述对象中包含的内容,方便复用。
聚合:将几个现有对象合并成一个新对象的过程
继承:实现代码重用,提高效率,提升代码清晰度,便于维护。
多态:不同对象通过相同的方法调用来实现各自行为的能力,通过把过程化的条件分支语句转化为对象的多态性,从而 消除这些条件分支语句
1.2 js 数据类型 五种基本数据类型(Number,String,Boolean,Undefined,Null),和一种复杂数据类型(Object)。
typeof 可能的取值:"number" "string" "boolean" "undefined" "object" "function" ( 包装类对象 && 对象与函数之间关系 && js 自身特点 )
typeof 1 "number"
typeof '1' "string"
typeof true "boolean"
typeof a "undefined"
typeof null "object"
typeof function(){} "function"
typeof Infinity // number
typeof NaN // number
1.3 惰性求值 || 与 &&
true || "something" //true ( 兼容语句 )
true && "something" //"something" ( 短路语句 )
1.4 函数
1.4.1 函数参数 - arguments
function sumOnSteroids(){ var i,res = 0; for(i = 0; i < arguments.length; i++){ res += arguments[i]; } return res; }
sumOnSteroids(1,2,3,4,5,6); //21
1.4.2 函数的作用域 - 声明提升 (ao && go)
var a = 123;
function f(){ alert(a); //undefined 这是因为函数域优先于全局域
var a = 1; alert(a); //1
}
f();
1.4.3 回调函数
A(a,b,c,B)
1.4.5 立即执行函数 - 适于执行一些一次性的或者初始化的任务
(function(name){
alert('Hello '+name+' !');
})('Jesse')
1.4.6 内部函数
function a(param){
function _b(theinput){
//私有函数
return theinput * 2
};
return 'The result is '+_b(param)
}
1.4.7 调用自身 - 重定义自身
function a(){
alert('A'); //第一次调用该函数时该语句会被执行
a = function(){ //第一次调用时a被赋予新函数
alert('B'); //第二次/往后 调用该函数时该语句会被执行
};
}
1.4.8 词法作用域 - 即函数自身定义时形成的作用域
function f1(){var a = 1;f2();}
function f2(){return a;} //f2()被定义时a是不可见的,只能访问自身作用域和全局作用域
f1(); //a is not defined
1.4.9 闭包突破函数作用域
function f(){
var b = "m";
return function(){
//有着私有作用域,可以访问f()的作用域和全局作用域
return b;
}
}
var n = f();
n(); //m
1.4.10 循环中的闭包
function f(){ var a = []; for(var i = 0; i < 3; i++){ a[i] = (function(x){ return function(){ return x; } })(i); } return a; } var s = f(); s[0](); //0 s[1](); //1 s[2](); //2
1.5 对象
1.5.1 对象基本知识
在javascript中我们用数组表示索引型数组,用对象表示关联型数组
一般通过以下两种方式访问对象的属性:
中括号表示法:hero['name']
点号表示法:hero.name
构造器属性实际上是一个指向用于创建该对象的构造器函数的引用 hero.contructor //Hero
通过instanceof操作符,我们可以测试一个对象是不是由某个指定的构造器函数所创建的 hero instanceof Hero; //true
1.5.2 内建对象
Object
所有对象都继承自Object对象,因此都具有toLocaleString()、toString()和valueOf()方法
由于alert()要接收字符串参数,所以它会在后台调用toString()方法
Array
Function
定义函数的三种方式:
function sum(a,b){return a + b;}; //函数声明
var sum = function(a,b){return a + b;}; //函数表达式
var sum = new Function('a','b','return a + b;'); //Function构造器 避免使用
Function对象的属性:
prototype属性 指向函数的原型对象 ,并最终返回到 null 境界
length:用于记录该函数所拥有的参数数量 ( 形参,函数定义时参数个数 )
caller:返回一个调用该函数对象的外层函数引用 ( arguments.callee 也可以做到 ,arguments.callee.length,arguments.length 分别指代 函数形参和实参长度)
function A(a,b){ return A.caller;}
function B(){return A();}
B();//function B(){return A();}
function A(a,b){ console.log(arguments.callee.length,arguments.length); }
A(1) // 2 1
Function对象的方法
call()、apply()方法都能让对象去借用其他对象中的方法为己所用,这也是一种代码重用的方式,也是一种继承的实现方式,虽然是治标不治本。
var someObj = {
name: 'Ninja',
say: function(who){ return 'Hello '+who+', my name is '+ this.name; }
};
var myObj = { name:'Jesse' };
someObj.say.call(myObj, 'Dude');
//"Hello Dude, my name is Jesse"
// apply()的工作方式与call()基本相同,唯一的不同之处在于第二个参数的传递形式apply()方法的第二个参数是通过一个数组来传递
arguments对象
在函数中通过arguments访问传递给函数的所有参数
arguments对象的callee属性,该属性返回的是当前被调用的函数对象
通过arguments.callee属性实现匿名函数的递归调用
(function(count){
if(count < 5){
console.log(count);
arguments.callee(++count);
}
})(1) //1,2,3,4
Boolean
var b = new Boolean(); // == false
Number
var n =new Number(255);
n.toString(16); // 'ff'
String
Math
既不能当做一般函数来使用,也不能用new操作符创建对象,只是一个包含一系列方法和属性的内建对象
Date
RegExp
global:如果该值为false(默认),相关搜索在找到第一个匹配位置时就会停止,如果为true则会找出所有匹配位置,简写为‘g’
ignoreCase:设置是否忽略大小写,默认为false,简写为'i'
multiline:设置是否跨行搜索,默认为false,简写为'm'
lastIndex:搜索开始的索引位置,默认为0。在对象创建之后可以修改
source:用于存储正则表达式匹配模式
RegExp对象的方法
test():返回的是一个布尔值(找到匹配内容为true,否则为false)
exec():返回的是一个由匹配字符串组成的数组
/j.*t/i.test('Javascript') //true
/j.*t/i.exec('Javascript')[0] //Javascript
十六进制值转为颜色函数getRGB()
function getRGB(hex){
var rgb=[0,0,0];
if(/#(..)(..)(..)/g.test(hex)){
rgb=[parseInt(RegExp.$1,16),parseInt(RegExp.$2,16),parseInt(RegExp.$3,16)];
};
return "rgb("+rgb.join(",")+")";
}
getRGB('#00ff00'); //"rgb(0,255,0)"
以正则表达式为参数的字符串方法
match():返回的是一个包含匹配内容的数组
search():返回的是第一个匹配内容所在的位置
replace():将匹配的文本替换成指定的字符串
split():根据指定的正则表达式将目标字符串分割成若干数组元素
var s = new String('HelloJavascriptWorld');
s.match(/j.*a/ig); //['Java']
s.search(/j.*a/i); //5
//当某个匹配对象被找到时,如果我们想让相关的替换字符串中包含匹配的文本,可以使用$&修饰符
s.replace(/[A-Z]/g,'_$&'); //"_Hello_Javascript_World"
//如果正则表达式分了组(即带括号),那么可以用$1代表匹配分组中的第一组,$2代表第二组
s.replace(/[A-Z]/g,'_$1'); //"_Hello_Javascript_World"
var csv = 'one, two,three ,four';
csv.split(/s*,s*/) //["one", "two", "three", "four"]
// s*匹配0个或多个空格
//以上的4个方法可以接受的参数也包括字符串
"test".replace('t','r'); //"rest"
Error对象
try{
//可能会导致错误的代码
}catch(e){
//在发生错误时处理代码
}finally{
//可选的
//无论如何都会执行的代码
}
在String()构造器不存在时,自定义MyString()构造器函数 function MyString(string){ //this.length = this.toString = function(){ return string.toString(); } this.valueOf = function(){ return string.valueOf(); } this.reverse = function(){ return Array.prototype.reverse.apply(string.split('')).join(''); } } var s = new MyString('hello'); s.length; //5 s[0]; //'h' s.toString(); //'hello' s.valueOf(); //'hello' s.chatAt(1); //'e' s.concat(' world!'); //'hello world!' s.slice(0,-1); //'hell' s.split('l'); //['he','','o']
2.相关文章