44-1 javascript-变量、数据类型、运算符、控制语句

JavaScript概述

1、JavaScript的历史

  • 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中),后将其改名ScriptEase(客户端执行的语言)。
  • Netscape(网景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigator 2.0产品中开发出一套livescript的脚本语言。Sun和Netscape共同完成.后改名叫Javascript。
  • 微软随后模仿在其IE3.0的产品中搭载了一个JavaScript的克隆版叫Jscript。
  • 为了统一三家,ECMA(欧洲计算机制造协会)定义了ECMA-262规范。国际标准化组织及国际电工委员会(ISO/IEC)也采纳 ECMAScript 作为标准(ISO/IEC-16262)。从此,Web 浏览器就开始努力(虽然有着不同的程度的成功和失败)将 ECMAScript 作为 JavaScript 实现的基础。

2、ECMAScript

Javascript 在开发中绝大多数情况是基于对象的(即使用已被定义好的现成对象,而不是自己再去定义),也是面向对象的。

尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一的部分,当然,也不是唯一被标准化的部分。实际上,一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:

  • 核心(ECMAScript) 
  • 文档对象模型(DOM) Document object model (整合js,css,html)
  • 浏览器对象模型(BOM) Browser object model(整合js和浏览器)

简单地说,ECMAScript 描述了以下内容:

  • 语法 
  • 类型 
  • 语句 
  • 关键字 
  • 保留字 
  • 运算符 
  • 对象 (封装 继承 多态) 基于对象的语言.使用对象.

3、JavaScript的引入方式

(1)直接在html文件中写

一般放在body中的尾部,因为代码是从上往下执行的,先加载所有html后(所有定义的标签都加载上了)再执行javascript。(当然javascript是可以放在head中的,但建议放在body中的尾部)

<script>
    alert('hello yuan')
</script>

(2)导入外部javascript文件

这种情况,放在head中就可以

<script src="hello.js"></script> 
二、JavaScript的基础

1、变量

(1)变量的声明

JavaScript是弱变量类型,使用前需要声明,但不必给变量设定数据类型(变量赋值时自动确定数据类型)。

// 一行声明一个变量
    var a=1;
    var s="hello";       

// 一次声明多个变量
    var c=4, d=4; 

  声明变量时 可以不用var如果不用var 那么它是全局变量

(2)变量的命名

首字符只能是字母下划线美元符$ ,且区分大小写,x与X是两个变量

变量名的书写规范:

// Camel 标记法:首字母是小写的,接下来的字母都以大写字符开头
    var myTestValue = 0, mySecondValue = "hi";

// Pascal 标记法:首字母是大写的,接下来的字母都以大写字符开头
    Var MyTestValue = 0, MySecondValue = "hi";

// 匈牙利类型标记法(建议首选这种标记方法):
// 在以 Pascal 标记法命名的变量前附加一个小写字母(或小写字母序列),说明该变量的类型。例如,i 表示整数,s 表示字符串
    Var iMyTestValue = 0, sMySecondValue = "hi";

2、基础规范

(1)每行结束可以不加分号 没有分号会以换行符作为每行的结束但强烈建议加分号。

(2)多行注释可用/* */,单行注释可用//。

(3) 使用{ }来封装代码块。

3、常量和标识符

(1)常量 :直接在程序中出现的数据值

(2)标识符:用于表示函数、变量等的名称的符号,由不以数字开头的字母、数字、下划线(_)、美元符号($)组成

JavaScript语言中代表特定含义的词称为保留字,不允许程序再定义为标识符:

 

4、数据类型

JavaScript的数据类型和java的数据类型基本一样。“引用数据类型”在栈内存中存放的是地址,通过地址引用堆内存。

4.1 五种基本数据类型

(1)Number(数值型)

所有数值都采用64位浮点格式存储,相当于Java和C语言中的double格式。

浮点数: 如 4.3e23 = 4.3 x 1023

16进制和8进制数的表达:16进制数据前面加上0x,八进制前面加0

 (2)String(字符串)

Unicode编码。字符串常量需用单引号或双引号括起。字符串中特殊字符必须加上右划线\转义。

<script>
        var str="\u4f60\u597d\n欢迎来到\"JavaScript世界\"";
        alert(str);
</script>

(3)Boolean(布尔型)

Boolean类型仅有两个值:true和false,也代表1和0,实际运算中true=1,false=0。Boolean值主要用于JavaScript的控制语句。

 null、 undefined布尔值为false

(4)Undefined

如果声明了某个变量,但是未对它赋值,则该变量是Undifined数据类型,系统给这个变量自动赋一个值undefined。

<script>
    var a;
    alert(a)    // 返回值为:undefined
</script>

  (5)Null

<script>
    var obj=new Animal()   // 创建一个obj对象
    var obj=null           // obj先占一个对象位置,后面需要时再给它赋值。注意:空对象是一个对象,只是内容为空。比如列表[]是一个列表,只是值为空
</script>

值undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。尽管这两个值相等,但它们的含义不同:undefined 是声明了变量但未在对其初始化时同时赋值;null 则用于表示尚未存在的对象,如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。

4.2 数据类型的转换

(1)通过“+”

<script>
    alert(1+"hello");        // 输出为字符串:1hello
    alert(1+true);           // 输出为数值:2
    alert(1+false);          // 输出为数值:1
    alert(2==true);          // 输出为布尔值:false
    alert("hello"+true);     // 输出为字符串:hellotrue
</script>

  (2)通过函数

# parseInt: 强制转换成整数   
parseInt("6.12")=6 
parseInt("12a")=12       # 解析成int数据,容错性很强
parseInt("a12")=NaN
parseInt(“1a2")=1

# parseFloat:强制转换成浮点数  
parseFloat("6.12")=6.12

# eval:将字符串强制转换为表达式并返回结果 
eval("1+1")=2
eval("1<2")=true

  关于NaN:

<script>
    alert(NaN==0);      //false
    alert(NaN>0);       //false
    alert(NaN<0);       //false
    alert(NaN==NaN);    //false  和谁相等都false,即便和自己。
    alert(NaN!=0);      //用 != 输出ture
</script> 

NaN的数据类型为Number。NaN参与的所有的运算都是false,除了!=运算。

4.3 数据类型的查询

typeof 来判断一个值的基本数据类型,对于引用数据类型,只能判断出来是个object。

typeof("test"+3)      //"string"
typeof(null)          //"object "
typeof(true+1)        //"number"
typeof(true-false)    //"number"

对于引用数据类型,用 instanceof 判断object的类型: 

var s1 = "hello";                  // 直接创建字符串
var s2 = new String("nihao");      // 通过实例化一个对象的方法创建出字符串

alert(s1);                         // hello
alert(s2);                         // nihao

alert(typeof(s1));                 // string
alert(typeof(s2));                 // object    只能识别出是一个对象,而不知道是什么样的对象

alert(s1 instanceof String);       // false
alert(s2 instanceof String);       // true

  

三、ECMAScript 运算符

1、算术运算

(1)加(+)、 减(-)、 乘(*) 、除(/) 、余数(% )与python中相同。

(2)递增(++) 、递减(--)

var a=1;
var b=a++;       // a++ 相当于a=a+1  但先赋值,再加减
alert(b);        // 1
alert(a);        // 2

var d=1;
var c=++d;       // d++ 相当于d=d+1   但先加减,再赋值
alert(c);        // 2
alert(d);        // 2
<script>    
    x=1
    alert(x++)       // 1
    alert(++x)       // 3
    alert(--x)       // 2
    alert(x--)       // 2
    alert(x)         // 1
</script>
例题

2、逻辑运算符 

与:&&
1 && 1 = 1
1 && 0 = 0
0 && 0 = 0

或:||
1 || 1 = 1
1 || 0 = 1
0 || 0 = 0

非:!
!0=1

参与逻辑运算的运算数并不一定是 Boolean 型值,如果某个运算数不是原始的 Boolean 型值,逻辑运算并不一定直接返回 Boolean 值:

 false && obj          ====> false
 obj && false          ====> false
 true && obj           ====> obj  ==若obj不为空==> true
 obj && true           ====> true

 null && true          ====> null  ====> false
 NaN && true           ====> NaN
 NaN && null           ====> NaN
 null && NaN           ====> null

 undefined && true     ====> undefined
 false && undefined    ====> false

3、等性运算符 和 关系运算符

赋值运算符:=
x=1

等性运算符:==
alert(2==2)           // 返回true
alert(2=="2")         // 返回true

全等运算符:===
alert(2==="2")        // 返回false。即全等运算符在检查相等性前,不自动执行类型转换
  • 比较运算符两侧如果一个是数字类型,一个是其他类型,会将其类型转换成数字类型。
  • 比较运算符两侧如果都是字符串类型,比较的是最高位的asc码,如果最高位相等,继续取第二位比较。
同数据类型的比较:
"Blue" < "alpha"      // 返回true。取字符串首字母的ASCII码值,字母B为66,字母a为97
"25" < "3"            // "2" 的字符代码是 50,"3" 的字符代码是 51

不同数据类型的比较:
"25" < 3              // 字符串 "25" 将被转换成数字 25,然后与数字 3 进行比较

  特殊的:

四、控制语句

 1. if

if (表达式){
    语句1;
}else{
    语句2;
}
    

if (表达式1) {
    语句1;
}else if (表达式2){
    语句2;
}else if (表达式3){
    语句3;
} else{
    语句4;
}

2. switch

switch (表达式) {
    case 值1:语句1;break;
    case 值2:语句2;break;
    case 值3:语句3;break;
    default:语句4;
}

所有case中的值都没匹配上,执行default后的语句4。

var x=3;
switch(x){
    case 1:y="星期一";    break;
    case 2:y="星期二";    break;
    case 3:y="星期三";    break;
    case 4:y="星期四";    break;
    case 5:y="星期五";    break;
    case 6:y="星期六";    break;
    case 7:y="星期日";    break;
    default: y="未定义";
}

alert(y)       // "星期三"
View Code
首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断;而 switch 只能对基本类型进行数值比较。两者的可比性就仅限在两个基本类型比较的范围内。
说到基本类型的数值比较,那当然要有两个数。然后重点来了——
if 语句每一句都是独立的,看下面的语句:
if (a == 1) ...
else if (a == 2) ...
这样 a 要被读入寄存器两次,1 和 2 分别被读入寄存器一次。于是你是否发现其实 a 读两次是有点多余的,在你全部比较完之前只需要一次读入寄存器就行了,其余都是额外开销。但是 if 语句必须每次都把里面的两个数从内存拿出来读到寄存器,它不知道你其实比较的是同一个 a。
于是 switch case 就出来了,把上面的改成 switch case 版本:
switch (a) {
        case 0:
                break;
        case 1:
}
                
总结:

1.switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化
2.switch-case只将表达式计算一次,然后将表达式的值与每个case的值比较,进而选
  择执行哪一个case的语句块
3.if..else 的判断条件范围较广,每条语句基本上独立的,每次判断时都要条件加载
  一次。
所以在多路分支时用switch比if..else if .. else结构要效率高。

switch为什么效率高?
if 与 switch的比较

 3. for

for (初始化;条件;增量){
    执行语句;
}
 var sum=0;
 for (var i=1; i<101; i=i+1 ){
      sum=sum+i;
 }
 alert(sum);
for循环求1到100的和

与python中for的区别(for i in这种方式不推荐使用):

var a=[1, "hello", true];
for (var i in a){
    console.log(i);         // 0     1      2      注意:这里的i是索引号,与python中不同
    console.log(a[i]);      // 1     hello  true
}
    obj={"11":"111","22":[1, 2]}    //javaScript中没字典这种说法,也是一种数据类型 叫object
//    alert(typeof(obj))            //object
//    alert(obj)                    //[obj Obj]

    for (var i in obj){
        console.log(i);             // 11   22
        console.log(obj[i]);        // 111  Array(2)
    }
View Code

4. while

while (条件){
    执行语句;
}

5. 异常处理

try {
    //这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行
}
catch (e) {
    // 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。
    //e是一个局部变量,用来指向Error对象或者其他抛出的对象
}
finally {
     //无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。
}

主动抛出异常:throw Error('xxxx')

  

 参考:http://www.cnblogs.com/yuanchenqi/articles/5980312.html

posted @ 2017-08-22 16:07  seaidler  阅读(144)  评论(0)    收藏  举报