什么是javascript语言,它的历史、作用、基本语法(变量、表达式、作用域、各种关键字和流程控制语句)、数组处理、json、闭包(closure)。

JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。


历史:

  它最初由Netscape的Brendan Eich设计。JavaScript是甲骨文公司的注册商标。Ecma国际以JavaScript为基础制定了ECMAScript标准。JavaScript也可以用于其他场合,如服务器端编程。完整的JavaScript实现包含三个部分:ECMAScript,文档对象模型,浏览器对象模型。Netscape在最初将其脚本语言命名LiveScript,后来Netscape在与Sun合作之后将其改名为JavaScript。JavaScript最初受Java启发而开始设计的,目的之一就是“看上去像Java”,因此语法上有类似之处,一些名称和命名规范也借自Java。但JavaScript的主要设计原则源自Self和Scheme。JavaScript与Java名称上的近似,是当时Netscape为了营销考虑与Sun微系统达成协议的结果。为了取得技术优势,微软推出了JScript来迎战JavaScript的脚本语言。为了互用性,Ecma国际(前身为欧洲计算机制造商协会)创建了ECMA-262标准(ECMAScript)。两者都属于ECMAScript的实现。尽管JavaScript作为给非程序人员的脚本语言,而非作为给程序人员的脚本语言来推广和宣传,但是JavaScript具有非常丰富的特性。

  发展初期,JavaScript的标准并未确定,同期有Netscape的JavaScript,微软的JScript和CEnvi的ScriptEase三足鼎立。1997年,在ECMA(欧洲计算机制造商协会)的协调下,由Netscape、Sun、微软、Borland组成的工作组确定统一标准:ECMA-262。


  

作用:

1、是一种解释性脚本语言(代码不进行预编译)。

2、主要用来向HTML(标准通用标记语言下的一个应用)页面添加交互行为。

3、可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。

4、跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行(如Windows、Linux、Mac、Android、iOS等)


基本语法(变量、表达式、作用域、各种关键字和流程控制语句)


变量:与代数一样,JavaScript 变量可用于存放值(比如 x=2)和表达式(比如 c=a+b)。

变量可以使用短名称(比如 a 和 b),也可以使用描述性更好的名称(比如 name、height)。

注意:变量必须以字母开头

     变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做)

         变量名称对大小写敏感(y 和 Y 是不同的变量)

提示:JavaScript 语句和 JavaScript 变量都对大小写敏感。

表达式: javascript表达式在定义完变量后,就可以进行赋值、改变和计算等一系列操作。这一过程通常又由表达式来完成。

作用域:作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域局部作用域两种

1.  局作用域在代码中任何地方都能访问到的对象拥有全局作用域

        (1)最外层函数和在最外层函数外面定义的变量拥有全局作用域

        (2)所有末定义直接赋值的变量自动声明为拥有全局作用域

        (3)所有window对象的属性拥有全局作用域

2.  局部作用域 

  和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所以在一些地方也会看到有人把这种作用域称为函数作用域

关键字:

Javascript关键字列表:

break  delete function return typeof  
case  do  if  switch  var  
catch  else in  this  void  
continue false instanceof  throw  while  
debugger finally new true with  
default for   null  try    

   

Javascript未来关键字(Javascript Future Reserved Words)  
Javascript还有一些未来关键字,这些字虽然现在没有用到Javascript语言中,但是将来有可能用到。

Javascript未来关键字列表: 

abstract  double   goto native static
boolean enum  implements package super 
byte export import private synchronized 
char extends int protected  throws
class final  interface public transient
const float long short volatile 

 

流程控制语句

1.if语句的语法结构

  if (条件表达式A) {
    //条件表达式A为true,所执行的代码块
  } else if(条件表达式B) {
    //条件表达式B为true,所执行的代码块
  } else {
    // 条件表达式A和条件表达式B都为false,所执行的代码块
  }

2.switch语句的语法结构

  switch (表达式) {
    case 值1 :
      //表达式与值1匹配时,所执行的代码块
    break;
    case 值2 :
      //表达式与值2匹配时,所执行的代码块
    break;
    default :
      //所有case值都与表达式不匹配时,所执行的代码块
  }

3.for语句的语法结构

  for (初始化语句; 循环判断条件; 循环执行语句) {
    //循环体
  }

4.while语句的语法结构

  while (循环判断条件) {
    //循环体
  }

5.do…while语句的语法结构

  do {
    //循环体
  } while (循环判断条件);

数组处理

1、数组的创建

  var arrayObj = new Array(); //创建一个数组

  var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限,是长度

  注意:虽然这种方法创建数组指定了长度,但实际上所有情况下数组都是变长的,也就是说即使指定了长度,仍然可以将元素存储在规定长度以外的,这时长度会随之改变。

  var arrayObj = new Array([element0[, element1[, ...[, elementN]]]]); 创建一个数组并赋值

2、数组的元素的访问

  var testGetArrValue=arrayObj[1]; //获取数组的元素值

  arrayObj[1]= "这是新值"; //给数组元素赋予新的值

3、数组元素的添加

  arrayObj. push([item1 [item2 [. . . [itemN ]]]]);// 将一个或多个新元素添加到数组结尾,并返回数组新长度

  arrayObj.unshift([item1 [item2 [. . . [itemN ]]]]);// 将一个或多个新元素添加到数组开始,数组中的元素自动后移,返回数组新长度

  arrayObj.splice(insertPos,0,[item1[, item2[, . . . [,itemN]]]]);//将一个或多个新元素插入到数组的指定位置,插入位置的元素自动后移,返回""。

4、数组元素的删除

  arrayObj.pop(); //移除最后一个元素并返回该元素值

  arrayObj.shift(); //移除最前一个元素并返回该元素值,数组中元素自动前移

  arrayObj.splice(deletePos,deleteCount); //删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返回所移除的元素

5、数组的截取和合并

  arrayObj.slice(start, [end]); //以数组的形式返回数组的一部分,注意不包括 end 对应的元素,如果省略 end 将复制start 之后的所有元素

  arrayObj.concat([item1[, item2[, . . . [,itemN]]]]); //将多个数组(也可以是字符串,或者是数组和字符串的混合)连接为一个数组,返回连接好的新的数组

6、数组的拷贝

  arrayObj.slice(0); //返回数组的拷贝数组,注意是一个新的数组,不是指向

  arrayObj.concat(); //返回数组的拷贝数组,注意是一个新的数组,不是指向

7、数组元素的排序

  arrayObj.reverse(); //反转元素(最前的排到最后、最后的排到最前),返回数组地址

  arrayObj.sort(); //对数组元素排序,返回数组地址

8、数组元素的字符串化

  arrayObj.join(separator); //返回字符串,这个字符串将数组的每一个元素值连接在一起,中间用 separator 隔开。

  toLocaleString 、toString 、valueOf:可以看作是join的特殊用法,不常用

JSON:

JSON:JavaScript 对象表示法(JavaScript Object Notation)。 是存储和交换文本信息的语法。

特点:

  • JSON 是轻量级的文本数据交换格式
  • JSON 独立于语言
  • JSON 具有自我描述性,更易理解
  •  JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。

 

在JSON中,有两种结构:对象数组

  1. 一个对象以 " " 开始," " 结束。每个"名称"后跟一个" " ;"名称:值" 组”之间运用 " , " 隔开。名称用 双引号 包起来;值如果是字符串则必须用 双引号 ,数值型则不需要。例如:

  var obj={"name":"Rue","age":21,"hobby":"running"};

    2. 数组是值(value)的有序集合。一个数组以"  [ "  开始,"  ] "  结束。值之间运用 "  , " 隔开。例如:

  var array=[

        {"name":"Rue","age":21,"hobby":"running"},

        {"name":"Sandra","age":20,"hobby":"reading"}

       ];


在数据传输流程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键,例如:    

  JSON字符串:var str_obj1 = ' { "name": "Rue", "age": 21} ';

  JSON对象:var str_obj2 = {"name": "Rue", "age": 21 };

转换: 

1、JSON字符串转换为JSON对象 :运用 eval() 函数、parseJSON() 、或者 parse()

  要运用上面的str_obj1 ,必须运用下面的要领先转化为JSON对象:

  var final_obj = eval('(' + str + ')');  //由JSON字符串转换为JSON对象  或者

  var final_obj = str.parseJSON(); //由JSON字符串转换为JSON对象      或者

  var final_obj = JSON.parse(str); //由JSON字符串转换为JSON对象

  读取方式:alert(final_obj .name);  alert(final_obj .age);

注意:如果final_obj 本来就是一个JSON对象,那么运用 eval()函数转换后(哪怕是多次转换)还是JSON对象,但是运用 parseJSON()函数处理后会有错误(抛出语法异常)。

2、JSON对象转换为JSON字符串 :运用 toJSONString()或者全局要领 JSON.stringify(),例如:

  var final_obj =str_obj2 .toJSONString();  //将JSON对象转化为JSON字符     或者

  var final_obj =JSON.stringify(str_obj2 );  //将JSON对象转化为JSON字符

注意:上面的多个要领中,除了eval()函数是js自带的之外,其他的多个要领都来自json.js包。新版本的 JSON 修改了 API,将 JSON.stringify() 和 JSON.parse() 两个要领都注入到了 Javascript 的内建对象里面,前者变成了 Object.toJSONString(),而后者变成了 String.parseJSON()。如果提示找不到toJSONString()和parseJSON()要领,则说明您的json包版本太低。

 

闭包(closure)

官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分
 
闭包的特点:
  1.作为一个函数变量的一个引用,当函数返回时,其处于激活状态。
  2.一个闭包就是当一个函数返回时,一个没有释放资源的栈区。

  简单的说,javascript允许使用内部函数---即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
  function closure(){
    var str = "I'm a part variable.";
    return function(){
      alert(str);
    }
  }
  var fObj = closure();
  fObj();
 
 
 
 
 
 
 
 
  在上面代码中,str是定义在函数closure中局部变量,若str在closure函数调用完成以后不能再被访问,则在函数执行完成后str将被释放。但是由于函数closure返回了一个内部函数,且这个返回的函数引用了str变量,导致了str可能会在closure函数执行完成以后还会被引用,所以str所占用的资源不会被回收。这样closure就形成了一个闭包。