javascript笔记基础总结篇

时间:2016-10-03 12:36:32   收藏:0   阅读:309

Created at 2016-09-24 Updated at 2016-10-02 CategoryFront-End TagJavascript

转载请声明出处博客原文

随手翻阅以前的学习笔记,顺便整理一下放在这里,方便自己复习,也希望你有也有帮助吧

第一课时 入门基础

知识点:

1、javascript介绍

2、基于对象的内存管理

3、变量

DOM在内存中的一些图示

技术分享

技术分享

技术分享

技术分享

第二课时

回顾上节:

知识点:

1、 window 作用域

2、数据类型

如何判断js中的数据类型:

vara ="iamstring.";
varb =222;
varc= [1,2,3];
vard =newDate();
vare =function(){alert(111);};
varf =function(){this.name="22";};

最常见的判断方法 : typeof

alert(typeofa) ------------> string
alert(typeofb) ------------> number
alert(typeofc) ------------> object
alert(typeofd) ------------> object
alert(typeofe) ------------>function
alert(typeof f) ------------>function
alert(typeofa =="string") ------------->true
alert(typeofa ==String) --------------->false

判断已知对象类型的方法 : instanceof

alert(c instanceofArray) --------------->true
alert(d instanceofDate)
alert(f instanceofFunction) ------------>true
alert(f instanceoffunction) ------------>false

根据对象的 constructor 判断 : constructor

alert(c.constructor === Array) ---------->true
alert(d.constructor === Date) ----------->true
alert(e.constructor === Function) ------->true
functionA(){};
functionB(){};
A.prototype = newB();//A继承自B
varaObj =newA();
alert(aobj.constructor === B) -----------> true;
alert(aobj.constructor === A) -----------> false;
alert(aobj instanceofB) ---------------->true;
alert(aobj instanceofB) ---------------->true;
aobj.constructor = A; //将自己的类赋值给对象的constructor属性
alert(aobj.constructor === A) -----------> true;
alert(aobj.constructor === B) -----------> false;//基类不会报true了;

通用但很繁琐的方法 : prototype

alert(Object.prototype.toString.call(a) === ‘[objectString]’) ------->true;
alert(Object.prototype.toString.call(b) === ‘[objectNumber]’) ------->true;
alert(Object.prototype.toString.call(c) === ‘[objectArray]’) ------->true;
alert(Object.prototype.toString.call(d) === ‘[objectDate]’) ------->true;
alert(Object.prototype.toString.call(e) === ‘[objectFunction]’) ------->true;
alert(Object.prototype.toString.call(f) === ‘[objectFunction]’) ------->true;

Javascript的数据类型有六种(ES6新增了第七种 Symbol )

内存中一共分为几种对象:

数据类型转换

转换函数

varn1 =12;
varn2 =true;
vara = [1,2,3];
varo = {};
functionf(){}
n1.toString(); //"12"
n2.toString(); //"true"
a.toString(); //"1,2,3"
o.toString(); //"[object Object]"
f.toString(); //"function f(){}"

强制类型转换

Boolean(123);//true
Boolean("");//false
Boolean([]);//true
Boolean({});//true
Boolean(null);//false
Boolean(undefined);//false
Number("123");//123
Number("123h");//NaN
Number(true);//1
Number(false);//0
Number(undefined);//NaN
Number(null);//0
Number([]);//0
Number({});//NaN

隐式转换

null和undefined

undefined==null//结果为true,但含义不同。
undefined===null//false,两者类型不一致,前者为“undefined”,后者为“object”

3、javascript脚本执行顺序

总结一下 == 运算的规则:(隐式转换)

第三课时

上节回顾:

知识点:

1、运算符

条件运符( 表达式1?表达式2:表达式3 )三元运算符

2、在js中 有四种被认为是  :

第四课时

上节回顾:

知识点:

1、 console.log 调试程序

2、条件结构

javascript 中 if 语句优化写法

if(foo) bar();elsebaz(); ==> foo?bar():baz();
if(!foo) bar();elsebaz(); ==> foo?baz():bar();
if(foo)returnbar();elsereturnbaz(); ==>returnfoo?bar():baz();
if(foo) bar(); ==> foo&&bar();
if(!foo) bar(); ==> foo||bar();

第五课时

上节回顾:

知识点:

1、 switch

2、 for

第六课时

上节回顾:

1、 switch

2、 for

知识点:

1、 while/do...while 没有谁好谁坏 只有适应场景不同

2、代码内存解析

闭包

闭包 作用域

//alert(x);//9:执行弹出x,结果x没定义,错误.
alert(i);//9:执行弹出i,然而i之前已经定义,只不过没地址,因此是undefiend
vari =10;//1:var i; 10:把常量池中10的地址赋给栈中的i
varj ="你好";//2:var j; 11:把常量池中 你好 的地址复给栈中的j
vark = z =null;//3:var k,z; 12:把堆中null的地址赋值给z和k
varm =function(){//4:var m; 5:function匿名函数 13:把匿名函数在堆中的地址赋给栈中的m
 alert(2);
}
varb =document.body;//6:var b; 14:把堆中document.body对象的地址赋给栈中的b
varf =true;//7:var f; 15:把常量池中true的地址赋给栈中的变量f
functionm(){//8:function m;
 alert(1);
}
functionm(){
 c = 50;//在局部变量中找不到定义的c 沿着作用域链找到了全局变量的c
 alert(‘哈哈哈‘);
//var c;
}

varc =150;// 函数m()还未执行到 还没被销毁 此时全局c的值c=50
m();
varc =20;//到这里一步 m()已经执行完了 函数已经销毁了 这里的c还是20
alert(c);//20
functionm(){
 c = 50;//在局部变量中找不到定义的c 沿着作用域链找到了全局变量的c
 alert(‘哈哈哈‘);
functioninner(){
 c = 30;
 alert(‘嘻嘻‘);
 }
 inner();//c在函数内部找不到定义 所以沿着作用域链找到了全局的c
}

varc =20;//到这里一步 m()还没执行 函数没被销毁 这里的c是30
m();

alert(c);//30

4、object对象

5、面向对象的程序设计

一些内存图示

技术分享

技术分享

技术分享

技术分享

技术分享

原型链的几张图解

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

第七课时

上节回顾:

知识点:

1、object对象

new 原理详细解析

new创建对象的步骤

functionPerson(name, age){
this.name = name;
this.age = age;
this.say =function(){
console.log(this.name);
 };
}

functioncreatePerson(P){
// 创建一个新对象
varo =newObject();
// 获取传递给Person函数的参数
varargs =Array.prototype.slice.call(arguments,1);
// 新对象的__proto__属性指向Person的原型对象
 o.__proto__ = P.prototype;
// Person的原型对象的constructor指向Person
 P.prototype.constructor = P;
// 把Person构造函数的作用域赋给新对象
// 给这个新对象添加属性(name,age,say)
 P.apply(o, args);
// 返回这个新对象
returno;
}

varp = createPerson(Person,‘wang‘,35);

2、面向对象的程序设计

多种构造函数

传统的创建对象

varperson =newObject();

person.name = “lancer”;

person.age = 24;

person.job = “UI”;

person.sayName = function(){

alert(this.name);

}

person.sayName();

工厂模式

functioncreatePerson(name,age,job){

varo =newObject();

o.name = name;

o.age = age;

o.job = job;

o.sayName = function(){

alert(o.name);

}

returno;

}

varperson1 = createPerson(“lancer”,24,”UI”);

person1.sayName();

构造函数

functionPerson(name,age,job){

this.name = name;

this.age = age;

this.job =job;

this.sayName =function(){

alert(this.name)

}

}

varperson1 = createPerson(“lancer”,24,”UI”);

person1.sayName();

原型模式

functionPerson(){

}

Person.prototype.name =”lancer”;

Person.prototype.age =24;

Person.prototype.job = “UI”;

Person.prototype.sayName = function(){

alert(this.name)

}

varperson1 =newPerson();

person1.sayName();

varperson2 =newPerson();

person2.name =”lara”

person2.sayName();

简单原型模式

functionPerson(){

}

Person.prototype = {

name: “lancer”,

age:24,

job: “UI”,

sayName:function(){

alert(this.name)

}

};

varperson1 =newPerson();

person1.sayName();

构造函数和原型模式

functionPerson(name,age,job){

this.name = name;

this.age = age;

this.job =job;

}

Person.prototype = {

constructor:Person,

sayName:function(){

alert(this.name)

}

};

varperson1 =newPerson(“lancer”,”24″,”UI”);

person1.sayName();

动态原型模式

functionPerson(name,age,job){

this.name = name;

this.age = age;

this.job =job;

}

if(typeofthis.sayName !=”function”){

Person.prototype = {

constructor:Person,

sayName:function(){

alert(this.name)

}

};

}

varperson1 =newPerson(“lancer”,”24″,”UI”);

person1.sayName();

稳妥构造函数

varPerson =function(name,age,job){

varO =newObject();

O.sayName = function(){

alert(name);

};

returnO

}

varperson1 = Person(“lancer”,24,”UI”);

person1.sayName();

其他:

一些内存图示

技术分享

第八课时

上节回顾:

1.object对象

2.面向对象的程序设计

知识点:

1.prototype内存解析

2.通过prototype扩展功能

//多个对象的构造 以及 多个对象之间如何建立联系
functionStudent(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;

}
functionBingqilin(name){
this.name = name;
}
functionGame(name){
this.name = name;
}
functionHour(time){
this.time = time;
}
Student.prototype = {

eat:function(b){
 alert(this.name+"喜欢吃"+b.name);
 },
mess:function(){
 alert(this.name+"的信息:"+this.age+‘,‘+this.sex);
 },
sleep:function(h){
 alert(this.name+"每天睡,"+h.time+‘小时‘);
 },
work:function(h){
 alert(this.name+"每天工作,"+h.time+‘小时‘);
 },
like:function(g){
 alert(this.name+"喜欢打,"+g.name);
 }

}
vars =newStudent("小明",22,"男");

varb =newBingqilin("黑色的冰淇淋");
s.eat(b);//小明喜欢吃黑色的冰淇淋

varg =newGame("英雄联盟");
s.like(g);//把对象的地址发送给like的参数即可访问构造函数Game的name属性

varh =newHour(10);
s.sleep(h);
s.work(h);

一些内存图示

技术分享

技术分享

第九课时

回顾:

1、prototype内存解析

2、通过prototype扩展功能

3、封装

//小头爸爸牵着大头儿子的手去吃饭,吃完饭之后,

//小头爸爸背着大头儿子回家,回家后儿子学习,老爸工作,工作学习完后

//儿子看动画片

//围裙妈妈带儿子睡觉

//张三和张四

//分析对象 小头爸爸 大头儿子 饭 以及功能

//设计构造器(类)

//创建对象以及他们之间的关联

functionPerson(name,age){

this.name = name;

this.age = age;

 }

functionRice(name){

this.name = name;

}

//Person.prototype.getHand = function(){//这样子写也可以 但还是用默认生成的那块空的内存对象 往里面添加属性 方法

//不浪费内存

//}

//在prototype中定义的每个对象都有这些功能

Person.prototype = {//这样子写 抛弃了默认生成的那块空的内存对象 重新创建了一块新的内存对象 记住:原型的本质是对象

//多个功能写在一起

 getHand:function(person){//牵手

 alert(this.name+"在牵着"+person.name+"的手....");

 },

eat:function(rice){

 alert(this.name+"在吃"+rice.name);

 },

//需求 18岁以上才能背人

/* //写法一 不推荐 这个满足18岁的功能是自己强加的 不是客户需求的

 carry:function(person){//这里设计不合理 让老爸有这个功能 儿子没有这个功能

 if(this.age>=18){

 alert(this.name+‘背着‘+person.name);

 }else{

 alert(this.name+",还未满18岁,背不起");

 }

 },*/

 backhome:function(){

 alert(this.name+"回家");

 },

study:function(){

 alert(this.name+"正在学习");

 },

watchTV:function(jm){

 alert(this.name+"正在看"+jm+‘...‘);

 }

};

varp1 =newPerson("老爸",20);

varp2 =newPerson("儿子",15);

//p1.getHand(p2);

//p1.eat(new Rice("蛋炒饭"));

//p2.eat(new Rice("猪脚饭"));

//p1.carry(p2);//老爸背儿子

//p2.carry(p1);//让儿子背老爸 输出结果:儿子,还未满18岁,背不起

//p1.backhome();

//写法二 不推荐 100对关系 代码写很多遍

/*

//让老爸单独有背的这个功能 儿子没有这个功能

p1.carry = function(person){

 alert(this.name+‘背着‘+person.name);

}

p1.carry(p2);

*/

//-------通过继承解决这个 让老爸单独有背的这个功能 儿子没有这个功能 可以应对多功能 多需求

//功能函数

Object.prototype.extends =function(func,actions){//让所有的子孙 构造器都有这个功能

for(varpropinfunc.prototype){//传进一个func构造器 迭代构造器中的功能 把构造器中的功能全都映射过来 复制一份

this.prototype[prop] = func.prototype[prop];//迭代原型中的所有的功能到 当前里面去

 }

for(varpropinactions){

this.prototype[prop] = actions[prop];

 }

};

functionFather(name){

this.name = name;

}

Father.extends(Person,{

carry:function(person){

 alert(this.name+‘背着‘+person.name);

 },

work:function(){

 alert(this.name+"正在工作");

 }

});

//扩展

//设计程序有个原则:不修改只增加

functionChildren(name){

this.name = name;

}

Children.extends(Person);

functionMother(name){

this.name = name;

}

Mother.extends(Person,{

scoop:function(person){

//判断必须是children的对象才能执行这个功能

//if(){

 alert(this.name+"唱着摇篮曲哄"+person.name+"睡觉");

//}

 }

});

/*

Father.prototype.carry= function(person){//创建这个原型的想法是:原来Person有的功能 我都需要有 并在这些基础上加一个功能 carry

 //如何建立Father基础Person的功能?写一个继承的小工具来操作

 alert(this.name+‘背着‘+person.name);

};

Father.prototype.work = function(){

 alert(this.name+"正在工作");

}

*/

varp1 =newFather("老爸");

varp2 =newChildren("儿子");

p1.carry(p2);//只有老爸有carry这个功能

//p2.carry(p1);//error 儿子没有carry这个功能

p2.study();//儿子在学习

p1.work();//老爸在工作

p1.watchTV(‘看足球‘);

p2.watchTV(‘蜡笔小新‘);

varp3 =newMother(‘围裙妈妈‘);

p3.scoop(p2);

知识点:

一些内存图示

技术分享

技术分享

技术分享

技术分享

第十课时

上节回顾:

1.继承

2.call apply方法的使用

知识点:

API application program interface

常用API

日期型函数 Date

技术分享

varmyDate =newDate();//系统当前时间

varmyDate =newDate(yyyy, mm, dd, hh, mm, ss);

varmyDate =newDate(yyyy, mm, dd);

varmyDate =newDate(“monthName dd, yyyy hh:mm:ss”);

varmyDate =newDate(“monthName dd, yyyy”);

varmyDate =newDate(epochMilliseconds);
varmyDate =newDate();

myDate.getYear(); //获取当前年份(2位)

myDate.getFullYear(); //获取完整的年份(4位,1970-????)

myDate.getMonth(); //获取当前月份(0-11,0代表1月)

myDate.getDate(); //获取当前日(1-31)

myDate.getDay(); //获取当前星期X(0-6,0代表星期天)

myDate.getTime(); //获取当前时间(从1970.1.1开始的毫秒数) 时间戳!!

myDate.getHours(); //获取当前小时数(0-23)

myDate.getMinutes(); //获取当前分钟数(0-59)

myDate.getSeconds(); //获取当前秒数(0-59)

myDate.getMilliseconds(); //获取当前毫秒数(0-999)

myDate.toLocaleDateString(); //获取当前日期

myDate.toLocaleTimeString(); //获取当前时间

myDate.toLocaleString( ); //获取日期与时间
varmyDate =newDate();

myDate.setDate(myDate.getDate() + 10);//当前时间加10天//类似的方法都基本相同,以set开头,具体参考第2点
vari = daysBetween(beginDate,endDate);//返回天数

vari = beginDate.getTimezoneOffset(endDate);//返回分钟数
//checkDate() 只允许”mm-dd-yyyy”或”mm/dd/yyyy”两种格式的日期
if( checkDate(“2006-01-01”) ){ }

//正则表达式(自己写的检查 yyyy-mm-dd, yy-mm-dd, yyyy/mm/dd, yy/mm/dd 四种)

varr =/^(\d{2}|\d{4})[\/-]\d{1,2}[\/-]\d{1,2}$/;if( r.test( myString ) ){ }

字符串String型函数API

技术分享

varmyString =newString(“Every good boy does fine.”);

varmyString = “Every good boy does fine.”;
varmyString = “Every ” + “good boy ” + “does fine.”;

varmyString = “Every “; myString += “good boy does fine.”;
//截取第 6 位开始的字符

varmyString = “Every good boy does fine.”;

varsection = myString.substring(6);//结果: “good boy does fine.”

//截取第 0 位开始至第 10 位为止的字符

varmyString = “Every good boy does fine.”;

varsection = myString.substring(0,10);//结果: “Every good”

//截取从第 11 位到倒数第 6 位为止的字符

varmyString = “Every good boy does fine.”;

varsection = myString.slice(11,-6);//结果: “boy does”

//从第 6 位开始截取长度为 4 的字符

varmyString = “Every good boy does fine.”;

varsection = myString.substr(6,4);//结果: “good”
varmyString = “Hello”;

varlcString = myString.toLowerCase();//结果: “hello”

varucString = myString.toUpperCase();//结果: “HELLO”
varaString = “Hello!”;

varbString =newString(“Hello!”);

if( aString == “Hello!” ){ }//结果: true

if( aString == bString ){ }//结果: true

if( aString === bString ){ }//结果: false (两个对象不同,尽管它们的值相同)
varmyString = “hello everybody.”;

// 如果检索不到会返回-1,检索到的话返回在该串中的起始位置

if( myString.indexOf(“every”) >-1){ }//结果: true
varmyString = “I is your father.”;

varresult = myString.replace(“is”,”am”);//结果: “I am your father.”
varmyString = “hello”;

varcode = myString.charCodeAt(3);//返回”l”的Unicode编码(整型)

varchar =String.fromCharCode(66);//返回Unicode为66的字符
varmyString = “hello all”;

varcode =encodeURI(myString);//结果: “hello%20all”

varstr =decodeURI(code);//结果: “hello all”

//相应的还有: encodeURIComponent() decodeURIComponent()

Math对象型

Number型 常用的数字函数

vari =1;

vari =newNumber(1);
vari =1;

varstr = i.toString();//结果: “1”

varstr =newString(i);//结果: “1”

i = parseInt(str);//结果: 1

i = parseFloat(str);//结果: 1.0

//注意: parseInt,parseFloat会把一个类似于”32G”的字符串,强制转换成32
vari =123;varstr = “string”;

if(typeofi == “number” ){ }//true

//某些方法(如:parseInt,parseFloat)会返回一个特殊的值NaN(Not a Number)

//请注意第2点中的[注意],此方法不完全适合判断一个字符串是否是数字型!!

i = parseInt(str);

if(isNaN(i) ){ }
//此知识与[字符串比较]相同

- **小数转整数**

varf =1.5;

vari =Math.round(f);//结果:2 (四舍五入)

vari =Math.ceil(f);//结果:2 (返回大于f的最小整数)

vari =Math.floor(f);//结果:1 (返回小于f的最大整数)
vari =3.14159;

//格式化为两位小数的浮点数

varstr = i.toFixed(2);//结果: “3.14”

//格式化为五位数字的浮点数(从左到右五位数字,不够补零)

varstr = i.toPrecision(5);//结果: “3.1415”
vari =parseInt(“0x1f”,16);

vari =parseInt(i,10);

vari =parseInt(“11010011”,2);
//返回0-1之间的任意小数

varrnd =Math.random();

//返回0-n之间的任意整数(不包括n)

varrnd =Math.floor(Math.random() * n)

5. Regex

//在这个最大的对象的原型上加一个extends方法 使得下面所有的原型 都有这个方法
//这个原型的作用是通过迭代 复制传进来的构造器的所有的原型的方法

Object.prototype.extends =function(parent){
//console.log(parent.prototype);

for(varpropinparent.prototype){
//console.log(prop);//eat extends
this.prototype[prop] = parent.prototype[prop];//复制传进来的构造器的所有的原型的方法给当前正在调用这个方法的对象
 }
 }

functionPerson(name){
this.name = name;
 }
 Person.prototype = {
eat:function(){
 alert(this.name+"在吃饭");
 }
 };

functionFather(name){
this.name = name;
 }

 Father.extends(Person);//extends方法是最大的对象Object加的方法 所有的子孙 构造器都有这个方法

varf =newFather("小头爸爸");
 f.eat();

一些图示

技术分享

技术分享

第十一课时

上节回顾:

知识点:

String.prototype.isEmail =function(){

 email = this;
if(email.indexOf("@")!=-1&&email.indexOf(".")!=-1)
 {
if(email.indexOf("@")<email.lastIndexOf("@")){
 alert("邮箱不合法");
 }else{
 alert("邮箱合法");
 }
 }

}
varemail ="jingguanliuye@gmail.com";
email.isEmail();
//===============================日历练习(方法简洁 高效)======================================

//var year = parseInt(prompt("请输入日历年份:"));
//var month = parseInt(prompt("请输入日历月份:"))-1;

Date.prototype.printCalendar =function(){

varyear =this.getFullYear(),month =this.getMonth();
vardate =newDate(year,month,1);

//alert(date.toLocaleString());
document.write("<div class=‘date‘>"+year+"年"+(month+1)+"月</div>");
document.write("日 一 二 三 四 五 六<br />");

varday = date.getDay();
for(vari=0;i<day;i++){
document.write(‘ ‘);
}

varcount =newDate(year,month+1,0).getDate();//这里的0返回一个月的最后一天
for(vari=1;i<=count;i++){
document.write(i+‘ ‘);
if((i+day)%7==0){
document.write(‘<br/>‘);
 }
}
}
newDate(2012,2).printCalendar();

第十二课时

上节回顾:

新知识点:

第十三课时

上节回顾:

新知识:

1.BOM 浏览器对象模型

技术分享

2. DOM 文档对象模型

第十四课时

上节回顾:

新知识点:

1.DOM 文档对象模型

document

element

DOM 操作:

操作DOM对象:

节点的查找:(最重要)

DOM 中查找节点的思路:(由大到小 个别情况 由子到父)

继续查找:

//============给Object原型加一个方法 消除文本节点对DOM操作的影响 例如:nextSibling` `previousSibling` `firstChild` `lastChild (受到换行 和文本节点影响)

Object.prototype.next =function(){
//NodeType == 3 text的代号
//NodeType == 1 tag的代号
if(this.nextSibling){//判断下一个兄弟节点是否存在
switch(this.nextSibling.nodeType){
case1:
returnthis.nextSibling;
case3:
returnthis.nextSibling.nextSibling;
 }
}else{
returnnull;
}
console.log(div1.next().next().innerText);

DOM与节点的关系:

//var p = document.createElement(‘p‘);
//p.innerHTML = "this is a p";
//var child = document.getElementsByTagName(‘div‘);

//给Div的HTMLDivElement构造器原型加一个创建元素的方法 要所有的元素都有这个方法 改成 Object
HTMLDivElement.prototype.createElement = function(tagName){
varchild =document.createElement(tagName);
this.appendChild(child);
returnchild;
}
varchild =document.getElementsByTagName(‘div‘)[2].createElement("p");
child.innerHTML = ‘pppppp‘;

DOM属性小结

DOM方法小结

第十五课时

上节回顾:

1.DOM 文档对象模型

document

新知识点:

1.事件(事故)基础

2.常用事件

浏览器事件注意事项:

总结

技术分享

技术分享

原文:http://www.cnblogs.com/wangkang1/p/5928898.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!