JavaScript基础
历史 简介
一个完整的 JavaScript 实现是由以下 3 个不同部分组成
- 核心(ECMAScript)
- 文档对象模型(DOM) Document object model (整合js,css,html)
- 浏览器对象模型(BOM) Broswer object model(整合js和浏览器)
- Javascript 在开发中绝大多数情况是基于对象的.也是面向对象的.
所谓的基于对象就是直接使用,用new创建一个新的类
ECMAScript 描述了以下内容:
- 语法
- 类型
- 语句
- 关键字
- 保留字
- 运算符
- 对象 (封装 继承 多态) 基于对象的语言.使用对象.
- JavaScript的引入方式
JS的引入方式
{#1 直接编写#}
<script>
alert('hello yuan')
</script>
{#2 导入文件#}
<script src="hello.js"></script>
JS基础
强类型与弱类型的语言
Python是强类型的语言,是数据类型的原因,同时是动态语言(与声明和编译解释有关)
print(12+"hello") 会报错,是不同的数据类型,不能相加
JavaScript是弱类型的语言
这种是隐式转换,数字自动转换成字符串
console.log(12+"hello")//在编译的时候执行的是隐式的
无类型: 汇编
弱类型、静态类型 : C/C++
弱类型、动态类型检查: Perl/PHP
强类型、静态类型检查 :Java/C#
强类型、动态类型检查 :Python, Scheme
静态显式类型 :Java/C
静态隐式类型 :Ocaml, Haskell
变量
var x=5
var y=6
var z=x+y
-
声明变量时不用声明变量类型. 全都使用var关键字;
关键是分号结尾 -
一行可以声明多个变量.并且可以是不同类型.
var name="aa", age=20, job="bbb";
- 声明变量时 可以不用var. 如果不用var 那么它是全局变量.
- 变量命名,首字符只能是字母,下划线,$美元符 三选一,且区分大小写,x与X是两个变量
- 变量还应遵守以下某条著名的命名规则:
大驼峰 :首字母是大写的,接下来的字母都以大写字符开头
var myTestValue = 0;
小驼峰 :首字母是小写的,接下来的字母都以大写字符开头。
var MyTestValue = 0;
专业的:标记法命名的变量前附加一个小写字母(或小写字母序列),说明该变量的类型。
var iMyTestValue = 0; //i代表int s代表自付串
规范
分号结尾,可以不写,但是是以换行符进行区分
注释 支持多行注释和单行注释. /* */ //
使用{}来封装代码块
常量和标识符
**常量 **:直接在程序中出现的数据值
标识符:
- 由不以数字开头的字母、数字、下划线(_)、美元符号($)组成
- 常用于表示函数、变量等的名称
- 例如:_abc,$abc,abc,abc123是标识符,而1abc不是
- JavaScript语言中代表特定含义的词称为保留字,不允许程序再定义为标识符
数据类型
数字类型
不区分整型数值和浮点型数值
所有数字都采用64位浮点格式存储,相当于Java和C语言中的double格式
能表示的最大值是±1.7976931348623157 x 10308
能表示的最小值是±5 x 10 -324
-
整数
在JavaScript中10进制的整数由数字的序列组成
精确表达的范围是 -9007199254740992 (-253) 到 9007199254740992 (253)
超出范围的整数,精确度将受影响 -
浮点数
使用小数点记录数据
例如:3.4,5.6
使用指数记录数据
例如:4.3e23 = 4.3 x 1023
字符串
都是Unicode数据,所以没有字符编码的问题
是由Unicode字符、数字、标点符号组成的序列
字符串常量首尾由单引号或双引号括起
JavaScript中没有字符类型
常用特殊字符在字符串中的表达
字符串中部分特殊字符必须加上右划线
常用的转义字符 \n:换行 ':单引号 ":双引号 \:右划线
布尔型Boolean()
Boolean类型仅有两个值:true和false,也代表1和0,实际运算中true=1,false=0
if (2>1){
console.log(true+1)
}
结果是2
Null & Undefined
var n = 12;
var s = "hello";
var b = false;
var x;//没有初始化
console.log(typeof n);
console.log(typeof s);
console.log(typeof b);
console.log(typeof x);
结果:
number
string
boolean
undefined
-
undefiend类型
Undefined 类型只有一个值,即 undefined。当声明的变量未初始化时,该变量的默认值是 undefined。
当函数无明确返回值时,返回的也是值 "undefined"; -
Null 类型
另一种只有一个值的类型是 Null,它只有一个专用值 null,即它的字面量。值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。
尽管这两个值相等,但它们的含义不同。undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象(在讨论 typeof 运算符时,简单地介绍过这一点)。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。
强制类型转换
-
parseInt()
NaN:当涉及数据准换成数字的时候不行
console.log(parseInt("3.43abc"));//结果是3.43
console.log(parseInt("a3.43a"))//此时的结果就是NaN 不是一个数字 -
parseFloat()
强制转换成成数字 console.log(parseFloat("6.12"));//把字符串转转换成相应的浮点数 -
evel()
将字符串强制转换为表达式并返回结果 eval("1+1")=2 ;
类型查询函数
typeof
x=typeof("test"+3) ; // "string"
y=typeof(null) ; // "object "
z=typeof(true+1) ; // "number"
d=typeof(true-false) ; // number
console.log(x);
console.log(y);
console.log(z);
console.log(d);
运算符
算数运算符
加(+)、 减(-)、 乘(*) 、除(/) 、余数(% )
递增(++) 、递减(--)
先引用再赋值
var i =10;
var ret;
ret = i++;//先引用再赋值
console.log(ret);
console.log(i);
结果:
10
11
先计算 后引用
var i =10;
var ret;
ret = ++i;//先计算 后引用
console.log(ret);
console.log(i);
结果:
11
11
逻辑运算符
等于 ( == ) 、不等于( != ) 、 大于( > ) 、 小于( < ) 大于等于(>=) 、小于等于(<=) 与 (&&) 、或(||) 、非(!)
console.log(1&&3);//3
console.log(0&&3);//0
console.log(1||3);//1
console.log(0||3);//3
与运算的时候是同时为真才为真,有一个为假就是假
或运算的时候有一个为真就是真
辑 AND 运算的运算数可以是任何类型的,不止是 Boolean 值。
如果某个运算数不是原始的 Boolean 型值,逻辑 AND 运算并不一定返回 Boolean 值:
- 如果某个运算数是 null,返回 null。
- 如果某个运算数是 NaN,返回 NaN。
- 如果某个运算数是 undefined,返回undefined。
NaN
not a number
NaN 与参与的运算都是false,除了!=
console.log(NaN!=NaN);//只有这个的结果是True
等性运算
-
如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。
console.log(true == 1);console.log(false == 0); -
如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
console.log("3"==3) -
如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
-
如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。
全等号和非全等号
等号(==)和非等号(!==)的同类运算符是全等号(===)和非全等号。这两个运算符所做的与等号和非等号相同,只是它们在检查相等性前,不执行类型转换。
var sRusults ="3" ==3; //true
console.log(sRusults);
var sRusults ="3" ===3; // 结果是false 不会进行转换
console.log(sRusults);
关系运算符(重要)
var bResult = "aab" < "aac "; //从头开始比每一个的ASCII的值
console.log(bResult)
比较数字和字符串
var bResult = "25" < 3; //"25"会转换成数字25
alert(bResult); //输出 "false"
比较下面的情况
var bResult = "25" < "3"; //比较的ASCII
alert(bResult); //输出 "true"
上面这段代码比较的是字符串 "25" 和 "3"。两个运算数都是字符串,所以比较的是它们的字符代码("2" 的字符代码是 50,"3" 的字符代码是 51)。
总结:
- 比较运算符两侧如果一个是数字类型,一个是其他类型,会将其类型转换成数字类型.
- 比较运算符两侧如果都是字符串类型,比较的是最高位的asc码,如果最高位相等,继续取第二位比较.
流程控制
基本的语言都是这样的
- 顺序语句
- if-else
- 循环语句
if-else
if-else
if (表达式){
语句1;
......
}else{
语句2;
.....
}
if else if else
if (表达式1) {
语句1;
}else if (表达式2){
语句2;
}else if (表达式3){
语句3;
} else{
语句4;
}
switch 选择控制语句 switch case
switch (表达式) {
case 值1:语句1;break;
case 值2:语句2;break;
case 值3:语句3;break;
default:语句4;
}
var x = (new Date());//获取今天日期 周天是0
console.log(x);
switch(x){
case 1:console.log("周一");break;
case 2:console.log("周二");break;
case 3:console.log("周二");break;
case 4:console.log("周二");break;
default:console.log("数据错误");
}
for循环
for (初始化;条件;增量){
语句1;
...
}
for(var i=0;i<10;i++){
document.write("<h1>"+i+"</h1>")
}
求和
var sum_num=0;
for(var i=1;i<=100;i++){
sum_num +=i;
}
alert(sum_num)
while循环
var i = 0;
while( i<10){
document.write("<h1>"+i+"</h1>");
i++;
}
异常处理
try {
//这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行
}
catch (e) {
// 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。
//e是一个局部变量,用来指向Error对象或者其他抛出的对象
}
finally {
//无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。
}
参考资料: