前端小记(一)

166 阅读12分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一.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代码格式: 语句;

一行的结束就被认定为语句的结束,通常在结尾加上一个分号";"来表示语句的结束。

注意:

  1. “;”分号要在英文状态下输入,同样,JS中的代码和符号都要在英文状态下输入。
  2. 虽然分号“;”也可以不写,但我们要养成编程的好习惯,记得在语句末尾写上分号。

四.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";

变量的声明和赋值,是分开的两个步骤

如果只是声明变量而没有赋值,则该变量的值是undefinedundefined是一个特殊的值,表示“无定义”。

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中的大同小异。

注意:

  1. 在JS中区分大小写,如变量mychar与myChar是不一样的,表示是两个变量。
  2. 变量虽然也可以不声明,直接使用,但不规范,需要先声明,后使用

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"

上面代码中,对象objtoString方法返回字符串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