本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一.HTML中嵌入js代码的两种方法
1、 在页面中直接嵌入JavaScript代码 (1)在页面的任何位置(head部分 body部分 body的后面 较好)插入script标签,对于该标签必要的属性type属性,该属性描述了文档的类型 JavaScript代码写在<script></script>之间
<script type="text/javascript">表示在<script></script>之间的是文本类型(text),javascript是为了告诉浏览器里面的文本是属于JavaScript语言。
(2)在script标签内部编写js语句 例如:alert("要提示的内容") 作用是在页面中弹出一个提示窗口,起到提醒和警告的作用。 在JavaScript中单引号和双引号没有区别,都是用来表示字符串的。 每条语句写完后最好加分号结束
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script type="text/javascript">
alert("请认真听讲!!");
</script>
</head>
<body>
</body>
</html>
2、链接外部JavaScript文件。 如果JavaScript语句比较多,应该将这些语句写在一个单独的js文件中。 (1)先建立JavaScript文件,扩展名是.js (2)将要编写的js代码写到Js文件中,并保存文件。 (3)将JavaScript文件引入到HTML文件中。script标签是双标记标签 <script type="text/javascript" src="JavaScript文件名和路径"></script> 注意:在一个已经引入外部js文件的script标签中,不能在它的开始标签和结束标签中写Js命令了。 惯例上,先引入外部js文件,如果文件不能完全满足编程的需求,再在文件中添加script标签,来编写语句。
注意:在JS文件中,不需要<script>标签,直接编写JavaScript代码就可以了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script type="text/javascript" src="file1.js"></script>
<script type="text/javascript">
alert("请认真听讲!!");
</script>
</head>
<body>
</body>
</html>
细致划分的例子 (这里明确了JavaScript的编程规范)
二.js中的规范问题
1.js在页面中的规范
我们可以将JavaScript代码放在html文件中任何位置,但是我们一般放在网页的head或者body部分。 放在<head>部分 最常用的方式是在页面中head部分放置<script>元素,浏览器解析head部分就会执行这个代码,然后才解析页面的其余部分。 放在<body>部分 JavaScript代码在网页读取到该语句的时候就会执行。
注意: javascript作为一种脚本语言可以放在html页面中任何位置,但是浏览器解释html时是按先后顺序的,所以前面的script就先被执行。比如进行页面显示初始化的js必须放在head里面,因为初始化都要求提前进行(如给页面body设置css等);而如果是通过事件调用执行的function那么对位置没什么要求的。
2.注释的规范
注释的作用是提高代码的可读性。注释可分为单行注释与多行注释两种。(这些在html和css中也有运用)
单行注释,在注释内容前加符号 “//”。
多行注释以"/"开始,以"/"结束。
此外,由于历史上 JavaScript 可以兼容 HTML 代码的注释,所以<!--和-->也被视为合法的单行注释。
x = 1; <!-- x = 2;java
--> x = 3;
上面代码中,只有x = 1会执行,其他的部分都被注释掉了。
需要注意的是,-->只有在行首,才会被当成单行注释,否则会当作正常的运算。
function countdown(n) {
while (n --> 0) console.log(n);
}
countdown(3)
// 2
// 1
// 0
上面代码中,n --> 0实际上会当作n-- > 0,因此输出2、1、0。
三.JavaScript语句初识(具体细分见五)
JavaScript语句是给浏览器发动指令,告诉浏览器要干什么,执行什么命令。
每一句JavaScript代码格式: 语句;
一行的结束就被认定为语句的结束,通常在结尾加上一个分号";"来表示语句的结束。
注意:
- “;”分号要在英文状态下输入,同样,JS中的代码和符号都要在英文状态下输入。
- 虽然分号“;”也可以不写,但我们要养成编程的好习惯,记得在语句末尾写上分号。
四.JavaScript中的基础语法
4.1 变量
4.1.1 什么是变量
变量是对“值”的具名引用。变量就是为“值”起名,然后引用这个名字,就等同于引用这个值。变量的名字就是变量名。
从编程角度讲,变量是用于存储某种/某些数值的存储器。我们可以把变量看做一个盒子,为了区分盒子,可以用BOX1,BOX2等名称代表不同盒子,BOX1就是盒子的名字(也就是变量的名字)。盒子用来存放物品,物品可以是衣服、玩具、水果...等。
定义变量使用关键字var(var,是变量声明命令),语法如下:
var 变量名
变量名可以任意取名,但要遵循命名规则:
1.变量必须使用字母、下划线(_)或者美元符($)开始,后面可以跟字母、下划线、美元符号和数字。
正确:
mysum
_mychar
$numa1
错误:
6num //开头不能用数字
%sum //开头不能用除(_ $)外特殊符号,如(% + /等)
sum+num //开头中间不能使用除(_ $)外特殊符号,如(% + /等)
2.然后可以使用任意多个英文字母、数字、下划线(_)或者美元符($)组成。
3.不能使用JavaScript关键词 与JavaScript保留字。
4.1.2 变量的声明 (var)
我们要使用盒子装东西,是不是先要找到盒子,在编程中,这个过程叫声明变量,找盒子的动作,如何表示:
声明变量语法: var 变量名;
var就相当于找盒子的动作,在JavaScript中是关键字(即保留字),这个关键字的作用是声明变量,并为"变量"准备位置(即内存)。
var mynum ; //声明一个变量mynum
当然,我们可以一次找一个盒子,也可以一次找多个盒子,所以Var还可以一次声明多个变量,变量之间用","逗号隔开。
var num1,mun2 ; //声明一个变量num1
注意:变量也可以不声明,直接使用,但为了规范,需要先声明,后使用。
变量要先声明再赋值,如下:
var mychar;
mychar="javascript";
var mynum = 6;
变量可以重复赋值,如下:
var mychar;
mychar="javascript";
mychar="hello";
变量的声明和赋值,是分开的两个步骤
如果只是声明变量而没有赋值,则该变量的值是undefined。undefined是一个特殊的值,表示“无定义”。
var a;
a // undefined
不写var的做法,不利于表达意图,而且容易不知不觉地创建全局变量,所以建议总是使用var命令声明变量。
如果一个变量没有声明就直接使用,JavaScript 会报错,告诉你变量未定义。
x
// ReferenceError: x is not defined
上面代码直接使用变量x,系统就报错,告诉你变量x没有声明。
4.1.3 变量赋值
我们使用"="号给变量存储内容,看下面的语句:
var mynum = 5 ; //声明变量mynum并赋值。
这个语句怎么读呢? 给变量mynum赋值,值为5。我们也可以这样写:
var mynum; //声明变量mynum
mynum = 5 ; //给变量mynum赋值
注:这里 "="号的作用是给变量赋值,不是等于号。 (其意义与c中一致)
盒子可以装衣服、玩具、水果...等。其实,变量是无所不能的容器,你可以把任何东西存储在变量里,如数值、字符串、布尔值等,例如:
var num1 = 123; // 123是数值
var num2 = "一二三"; //"一二三"是字符串
var num3=true; //布尔值true(真),false(假)
其中,num1变量存储的内容是数值;num2变量存储的内容是字符串,字符串需要用一对引号""括起来,num3变量存储的内容是布尔值(true、false)。
如果变量赋值的时候,忘了写var命令,这条语句也是有效的。
var a = 1;
// 基本等同
a = 1;
JavaScript 是一种动态类型语言,也就是说,变量的类型没有限制,变量可以随时更改类型。
var a = 1;
a = 'hello';
上面代码中,变量a起先被赋值为一个数值,后来又被重新赋值为一个字符串。第二次赋值的时候,因为变量a已经存在,所以不需要使用var命令。
如果使用var重新声明一个已经存在的变量,是无效的。
var x = 1;
var x;
x // 1
上面代码中,变量x声明了两次,第二次声明是无效的。
但是,如果第二次声明的时候还进行了赋值,则会覆盖掉前面的值。
var x = 1;
var x = 2;
// 等同于
var x = 1;
var x;
x = 2;
4.1.4变量提升
JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。
console.log(a);
var a = 1;
上面代码首先使用console.log方法,在控制台(console)显示变量a的值。这时变量a还没有声明和赋值,所以这是一种错误的做法,但是实际上不会报错。因为存在变量提升,真正运行的是下面的代码。
var a;
console.log(a);
a = 1;
最后的结果是显示undefined,表示变量a已声明,但还未赋值。
综上,JavaScript中的变量定义其实和c中的大同小异。
注意:
- 在JS中区分大小写,如变量mychar与myChar是不一样的,表示是两个变量。
- 变量虽然也可以不声明,直接使用,但不规范,需要先声明,后使用。
4.2 表达式
4.2.1什么是表达式
表达式与数学中的定义相似,表达式是指具有一定的值、用操作符把常数和变量连接起来的代数式。一个表达式可以包含常数或变量。
4.2.2表达式所表达的内容
(1)JavaScript语句
(2)串表达式 (串表达式中mychar是变量)
(3)数值表达式 (数值表达式中num是变量)
(4)布尔表达式 (布尔表达式中num是变量)
4.3 运算符(又称操作符)
4.3.1算术运算符
4.3.1.1加法运算符
基本规则
加法运算符(+)是最常见的运算符,用来求两个数值的和。
1 + 1 // 2
在JavaScript中,“+”不只代表加法,还可以连接两个字符串,例如:
mystring = "Java" + "Script"; // mystring的值“JavaScript”这个字符串
JavaScript 允许非数值的相加。
true + true // 2
1 + true // 2
上面代码中,第一行是两个布尔值相加,第二行是数值与布尔值相加。这两种情况,布尔值都会自动转成数值,然后再相加。
比较特殊的是,如果是两个字符串相加,这时加法运算符会变成连接运算符,返回一个新的字符串,将两个原字符串连接在一起。
'a' + 'bc' // "abc"
如果一个运算子是字符串,另一个运算子是非字符串,这时非字符串会转成字符串,再连接在一起。
1 + 'a' // "1a"
false + 'a' // "falsea"
加法运算符是在运行时决定,到底是执行相加,还是执行连接。也就是说,运算子的不同,导致了不同的语法行为,这种现象称为“重载”(overload)。由于加法运算符存在重载,可能执行两种运算,使用的时候必须很小心。
'3' + 4 + 5 // "345"
3 + 4 + '5' // "75"
上面代码中,由于从左到右的运算次序,字符串的位置不同会导致不同的结果。
除了加法运算符,其他算术运算符(比如减法、除法和乘法)都不会发生重载。它们的规则是:所有运算子一律转为数值,再进行相应的数学运算。
1 - '2' // -1
1 * '2' // 2
1 / '2' // 0.5
上面代码中,减法、除法和乘法运算符,都是将字符串自动转为数值,然后再运算。
对象的相加
如果运算子是对象,必须先转成原始类型的值,然后再相加。
var obj = { p: 1 };
obj + 2 // "[object Object]2"
上面代码中,对象obj转成原始类型的值是[object Object],再加2就得到了上面的结果。
对象转成原始类型的值,规则如下。
首先,自动调用对象的valueOf方法。
var obj = { p: 1 };
obj.valueOf() // { p: 1 }
一般来说,对象的valueOf方法总是返回对象自身,这时再自动调用对象的toString方法,将其转为字符串。
var obj = { p: 1 };
obj.valueOf().toString() // "[object Object]"
对象的toString方法默认返回[object Object],所以就得到了最前面那个例子的结果。
知道了这个规则以后,就可以自己定义valueOf方法或toString方法,得到想要的结果。
var obj = {
valueOf: function () {
return 1;
}
};
obj + 2 // 3
上面代码中,我们定义obj对象的valueOf方法返回1,于是obj + 2就得到了3。这个例子中,由于valueOf方法直接返回一个原始类型的值,所以不再调用toString方法。
下面是自定义toString方法的例子。
var obj = {
toString: function () {
return 'hello';
}
};
obj + 2 // "hello2"
上面代码中,对象obj的toString方法返回字符串hello。前面说过,只要有一个运算子是字符串,加法运算符就变成连接运算符,返回连接后的字符串。
这里有一个特例,如果运算子是一个Date对象的实例,那么会优先执行toString方法。
var obj = new Date();
obj.valueOf = function () { return 1 };
obj.toString = function () { return 'hello' };
obj + 2 // "hello2"
上面代码中,对象obj是一个Date对象的实例,并且自定义了valueOf方法和toString方法,结果toString方法优先执行。
4.3.1.2余数运算符
余数运算符(%)返回前一个运算子被后一个运算子除,所得的余数。
12 % 5 // 2
需要注意的是,运算结果的正负号由第一个运算子的正负号决定。
-1 % 2 // -1
1 % -2 // 1
所以,为了得到负数的正确余数值,可以先使用绝对值函数。
// 错误的写法
function isOdd(n) {
return n % 2 === 1;
}
isOdd(-5) // false
isOdd(-4) // false
// 正确的写法
function isOdd(n) {
return Math.abs(n % 2) === 1;
}
isOdd(-5) // true
isOdd(-4) // false
余数运算符还可以用于浮点数的运算。但是,由于浮点数不是精确的值,无法得到完全准确的结果。
6.5 % 2.1
// 0.19999999999999973