什么是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 deletefunctionreturntypeof  
case do if switch var  
catch elsein this void  
continuefalseinstanceof throw while  
debuggerfinallynewtruewith  
defaultfor  null try   

   

 

 

 

 

 

 

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

Javascript未来关键字列表: 

abstract double  gotonativestatic
booleanenum implementspackagesuper 
byteexportimportprivatesynchronized 
charextendsintprotected throws
classfinal interfacepublictransient
constfloatlongshortvolatile 

 

 

 

 

 

 

流程控制语句

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就形成了一个闭包。

     

 

转载于:https://www.cnblogs.com/Sandra-R/p/4761258.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值