JavaScript

Posted lize520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript相关的知识,希望对你有一定的参考价值。

一、什么是javascript

二、数据类型

  1.简单数据类型:Number、String、Boolean、Undefined、Null

1 undefined表示一个声明了没有赋值的变量,变量只声明的时候值默认是undefined;
2 null表示一个空,变量的值如果想为null,必须手动设置;

  2.复杂数据类型:Object

三、流程控制

  1.if 语句

1 语法结构:
2 if (/* 条件表达式 */)
3   // 成立执行语句
4  else 
5   // 否则执行语句
6 
7 
8 三元运算:对if……else语句的一种简化写法
9   条件表达式 ? 成立执行表达式 : 不成立执行表达式

  2.switch 语句

  3.while 语句

1 语法结构:
2 while (循环条件) 
3   //循环体
4 

  4.do...while 语句

  5.for 语句

语法结构:
// for循环的表达式之间用的是;号分隔的,千万不要写成,
for (初始化表达式1; 判断表达式2; 自增表达式3) 
  // 循环体4

  6.continue 和 break

break:立即跳出整个循环,即循环结束,开始执行循环后面的内容(直接跳到大括号);
continue:立即跳出当前循环,继续下一次循环(跳到i++的地方)

四、函数

  1.什么是函数

1 把一段相对独立的具有特定功能的代码块封装起来,形成一个独立实体,就是函数,起个名字(函数名),在后续开发中可以反复调用;
2 函数的作用就是封装一段代码,将来可以重复使用;

  2.函数的定义

1.函数声明:
function 函数名()
  // 函数体


2.函数表达式:
var fn = function() 
  // 函数体

  3.函数的调用

  4.函数的返回值

返回值详解:
    如果函数没有显示的使用 return 语句 ,那么函数有默认的返回值:undefined
    如果函数使用 return 语句,那么跟再 return 后面的值,就成了函数的返回值
    如果函数使用 return 语句,但是 return 后面没有任何值,那么函数的返回值也是:undefined
    函数使用 return 语句后,这个函数会在执行完 return 语句之后停止并立即退出,也就是说 return 后面的所有其他代码都不会再执行。

  5.apply、call、bind方法

apply 和 call 是调用的时候改变 this 指向;
bind 方法,是赋值一份的时候,改变了 this 的指向;

  6.高阶函数

  7.闭包

   7.1 什么是闭包:

     闭包简单理解:定义在一个函数内部的函数;

   7.2 闭包的用途:

     作用一:可以在函数外部读取函数内部成员;

     作用二:让函数内成员始终存活在内存中;

  8.递归

    8.1 什么是递归

      在函数中直接或间接的调用自己;

 

五、预解析

  1.什么是预解析

JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的。JavaScript解析器执行JavaScript代码的时候,分为两个过程:预解析过程和代码执行过程

预解析过程:
1. 把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。
2. 把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。
3. 先提升var,在提升function

六、对象

  1.对象的创建方式

第一种:对象字面量

var o = 
  name: zs,
  age: 18,
  sex: true,
  sayHi: function () 
    console.log(this.name);
  
; 

第二种:new Object()创建对象

var person = new Object();
  person.name = lisi;
  person.age = 35;
  person.job = actor;
  person.sayHi = function()
  console.log(Hello,everyBody);


第三种:工厂函数创建对象
function createPerson(name, age, job) 
  var person = new Object();
  person.name = name;
  person.age = age;
  person.job = job;
  person.sayHi = function()
    console.log(Hello,everyBody);
  
  return person;

var p1 = createPerson(张三, 22, actor);

第四种:自定义构造函数
function Person(name,age,job)
  this.name = name;
  this.age = age;
  this.job = job;
  this.sayHi = function()
      console.log(Hello,everyBody);
  

var p1 = new Person(张三, 22, actor);

  2.内置对象

JavaScript中的对象分为3种:内置对象、浏览器对象、自定义对象;
JavaScript 提供多个内置对象:Math/Array/Number/String/Boolean...

    2.1 Math 对象   

Math对象不是构造函数,它具有数学常数和函数的属性和方法,都是以静态成员的方式提供;

Math.PI                        // 圆周率
Math.random()                // 生成随机数
Math.floor()/Math.ceil()     // 向下取整/向上取整
Math.round()                // 取整,四舍五入
Math.abs()                    // 绝对值
Math.max()/Math.min()         // 求最大和最小值

Math.sin()/Math.cos()         // 正弦/余弦
Math.power()/Math.sqrt()     // 求指数次幂/求平方根

    2.2 Data 对象

创建 Data 实例用来处理日期和时间。Date 对象基于1970年1月1日(世界标准时间)起的毫秒数。

    2.3 Array 对象

数组的常用方法:
// 1 栈操作(先进后出)
push()
pop()         //取出数组中的最后一项,修改length属性
// 2 队列操作(先进先出)
push()           
shift()        //取出数组中的第一个元素,修改length属性
unshift()     //在数组最前面插入项,返回数组的长度
// 3 排序方法
reverse()    //翻转数组
sort();     //即使是数组sort也是根据字符,从小到大排序
// 带参数的sort是如何实现的?
// 4 操作方法
concat()      //把参数拼接到当前数组
slice()     //从当前数组中截取一个新的数组,不影响原来的数组,参数start从0开始,end从1开始
splice()    //删除或替换当前数组的某些项目,参数start, deleteCount, options(要替换的项目)
// 5 位置方法
indexOf()、lastIndexOf()   //如果没找到返回-1
// 6 迭代方法 不会修改原数组(可选)
every()、filter()、forEach()、map()、some()
// 7 方法将数组的所有元素连接到一个字符串中。
join()                                                                        

    2.4 String 对象

字符串的常用方法:
// 1 字符方法
charAt()        //获取指定位置处字符
charCodeAt()      //获取指定位置处字符的ASCII码
str[0]           //html5,IE8+支持 和charAt()等效
// 2 字符串操作方法
concat()           //拼接字符串,等效于+,+更常用
slice()            //从start位置开始,截取到end位置,end取不到
substring()     //从start位置开始,截取到end位置,end取不到
substr()           //从start位置开始,截取length个字符
// 3 位置方法
indexOf()       //返回指定内容在元字符串中的位置
lastIndexOf()     //从后往前找,只找第一个匹配的
// 4 去除空白   
trim()          //只能去除字符串前后的空白
// 5 大小写转换方法
to(Locale)UpperCase()     //转换大写
to(Locale)LowerCase()     //转换小写
// 6 其它
search()
replace()
split()
fromCharCode()
// String.fromCharCode(101, 102, 103);     //把ASCII码转换成字符串

  3.构造函数

* 构造函数可以实例化对象
* 构造函数中有一个属性叫prototype,是构造函数的原型对象
* 构造函数的原型对象(prototype)中有一个constructor构造器,这个构造器指向的就是自己所在的原型对象所在的构造函数
* 实例对象的原型对象(__proto__)指向的是该构造函数的原型对象
* 构造函数的原型对象(prototype)中的方法是可以被实例对象直接访问的          

  4.原型和原型链

    4.1 什么是原型和原型链

      原型:__proto__和 prototype,都是原型对象;

      原型链:是一种关系,实例对象和原型对象之间的关系,关系是通过原型( __proto__ )来联系的;

原型链:
如果一个对象的原型对象(__proto__),是另一个构造函数的实例,这个对象的原型对象就会指向另一个对象的原型对象,如此循环,就行成了原型链。

    4.2 原型的作用

      作用一:共享数据,节省内存空间;

      作用二:为了实现继承

实例对象中有个属性,__proto__,也是对象,叫原型,不是标准的属性,浏览器使用的;
构造函数中有一个属性,prototype,也是对象,叫原型,是标准属性,程序员使用;

总结:

* 构造函数可以实例化对象
* 构造函数中有一个属性叫prototype,是构造函数的原型对象
* 构造函数的原型对象(prototype)中有一个constructor构造器,这个构造器指向的就是自己所在的原型对象所在的构造函数
* 实例对象的原型对象(__proto__)指向的是该构造函数的原型对象
* 构造函数的原型对象(prototype)中的方法是可以被实例对象直接访问的

  5.继承

    5.1 什么是继承

    继承:继承是一种关系,类(class)与类之间的关系;JS中没有类,但是可以通过构造函数模拟类,然后通过原型实现继承;继承也是为了数据共享;

    5.2 原型链继承

       核心:改变儿子的 prototype 属性为父亲的实例;   

 1     // 父亲类
 2     function Parent() 
 3         this.value = value;
 4     
 5     Parent.prototype.sayHi = function() 
 6             console.log(Hi);
 7         
 8         // 儿子类
 9     function Child() 
10 
11     
12     // 改变儿子的prototype属性为父亲的实例
13     Child.prototype = new Parent();
14 
15     var child = new Child();
16     // 首先现在child实例上进行查找,未找到,
17     // 然后找到原型对象(Parent类的一个实例),在进行查找,未找到,
18     // 在根据__proto__进行找到原型,发现sayHi方法。
19 
20     // 实现了Child继承
21     child.sayHi();

      缺点一:这种继承存在问题,就是引用类型属性共享;

 1 // 父亲类
 2     function Parent() 
 3         this.color = [pink, red];
 4     
 5 
 6     // 儿子类
 7     function Child() 
 8 
 9     
10     Child.prototype = new Parent();
11 
12     var child1 = new Child();
13     var child2 = new Child();
14     // 先输出child1和child2种color的值
15     console.log(child1.color); // ["pink", "red"]
16     console.log(child2.color); // ["pink", "red"]
17 
18     // 在child1的color数组添加white
19     child1.color.push(white);
20     console.log(child1.color); // ["pink", "red", "white"]
21     // child1上的改动,child2也会受到影响
22     console.log(child2.color); // ["pink", "red", "white"]

        缺点二:无法向父类传参  

    5.3 借助构造函数

     在这里,我们借用call函数可以改变函数作用域的特性,在子类中用 call 方法调用父类构造函数,复制父类的属性。此时没调用一次子类,复制一次。此时,每个实例都有自己的属性,不共享。同时我们可以通过call函数给父类传递参数。

     好处一:解决应用类型共享问题

 1     // 父亲类
 2     function Parent(name) 
 3         this.name = name;
 4         this.color = [pink, red];
 5     
 6 
 7     // 儿子类
 8     function Child() 
 9         Parent.call(this);
10 
11         // 定义自己的属性
12         this.value = test;
13     
14 
15 
16     var child1 = new Child();
17     var child2 = new Child();
18 
19     // 先输出child1和child2种color的值
20     console.log(child1.color); // ["pink", "red"]
21     console.log(child2.color); // ["pink", "red"]
22 
23     // 在child1的color数组添加white
24     child1.color.push(white);
25     console.log(child1.color); // ["pink", "red", "white"]
26     // child1上的改动,child2并没有受到影响
27     console.log(child2.color); // ["pink", "red"]

     好处二:解决传参数问题

 1     // 父亲类
 2     function Parent(name) 
 3         this.name = name;
 4         this.color = [pink, red];
 5     
 6 
 7     // 儿子类
 8     function Child(name) 
 9         Parent.call(this, name);
10 
11         // 定义自己的属性
12         this.value = test;
13     
14 
15     var child = new Child(qq);
16     // 将qq传递给Parent
17     console.log(child.name); // qq

    缺点:上述方法也存在一个问题,共享的方法都在构造函数中定义,无法达到函数复用的效果。

    5.4 组合继承

    根据上述两种方式,我们可以扬长避短,将需要共享的属性使用原型链继承的方法继承,将实例特有的属性,用借用构造函数的方式继承。

    5.5 拷贝继承

 

  6.函数中 this 的指向

* 普通函数中的this是谁?-----window
* 对象.方法中的this是谁?----当前的实例对象
* 定时器方法中的this是谁?----window
* 构造函数中的this是谁?-----实例对象
* 原型对象方法中的this是谁?---实例对象

七、正则表达式

  1.JavaScript中创建正则表达式的方式

1.通过构造函数创建对象
    //对象创建完毕---
    var reg=new RegExp(/\d5/);
    //调用方法验证字符串是否匹配
    var flag=reg.test("我的电话是10086");
    console.log(flag);

2.字面量的方式创建对象
    var reg=/\d1,5/;
    var flag=reg.test("小苏的幸运数字:888");
    console.log(flag);

  2.重要的正则表达式

重要的正则表达式:
邮箱:
[0-9a-zA-Z_.-]+[@][0-9a-zA-Z_.-]+([.][a-zA-Z]+)1,2
中文:
\u4e00-\u9fa5
/^[\u4e00-\u9fa5]2,6$/  表示2到6个中文

八、JavaScript的垃圾回收机制

九、JavaScript的运行机制

 

以上是关于JavaScript的主要内容,如果未能解决你的问题,请参考以下文章

javascriptjavascript常用函数大全

javascriptJavaScript数组常用方法

javascriptjavascript设计模式之工厂模式

JavaScriptJavascript闭包

JavaScriptJavascript闭包

JavaScriptJavaScript中的时间函数