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) // "星期三"
首先要看一个问题,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为什么效率高?
3. for
for (初始化;条件;增量){
执行语句;
}
var sum=0; for (var i=1; i<101; i=i+1 ){ sum=sum+i; } alert(sum);
与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)
}
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
浙公网安备 33010602011771号