Chapter1—基础篇
文章目录
一、HTML中的Javascript
1.使用script标签
1.1 在script标签内部写代码,例如:
<script type="text/javascript" >
//...some codes
</script>
1.2 从外部引用代码,例如:
<script type="text/javascript" src="index.js"></script>
2.script标签的相关属性
async
:
立即开始下载脚本,但不阻碍其他页面动。相当于告知浏览器立即下载,但延迟执行。defer
:
脚本可以延迟到文档完全被解析和显示之后再执行。charset
:
指定字符集,较少使用。crossorigin
:
CORS(跨域资源共享)配置。默认不使用。integrity
:
允许对比接收到的资源和指定的加密签名,以验证子资源的完整性。该属性可用于保证CDN(内容分发网络)不会提供恶意的内容。language
:
已废弃。src
:
要执行的外部文件。type
:
用于替代language属性,该值始终都是text/javascript
。
3.使用script标签的注意事项
3.1.当出现下列情况的时候(在标签内部写JS代码的同时也外部引用JS代码),浏览器只会下载并执行外部脚本文件:
<script src="test.js" type="text/javascript">
//...some codes
</script>
例子:
index.html
<!DOCTYPE html>
<html lang="en">
<head>
meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script type="text/javascript" src="index.js">
alert("执行内部代码");
</script>
</body>
</html>
index.js
console.log("执行外部代码");
运行结果:
二、语言基础
1.变量
-
var
关键字:
1.使用var声明的变量会自动提升到函数作用或全局作用域的顶部(即var 声明提升
)。
2.在函数内部定义变量时,若忽略var
关键字,则在函数执行后该变量会被提升到全局作用域。
代码如下(示例):console.log(a); //不会报错,打印undefined var a; // 声明提升到全局作用域顶部 function test() { console.log(b); //不会报错, 打印2 var b = 2; //变量b会提升到函数作用域的顶部 c = 23; //函数执行后,该变量会提升到全局作用域 } console.log(c); //报错 test(); console.log(c); //不会报错, 打印23
-
let
关键字:
1.let
与var
类似,但是let
声明的变量不会出现提升
。
2.let
声明的变量会出现暂时性死区
,即在let
声明变量之前使用该变量,会报错。
3.在同一作用域中不可重复声明
同一变量。
4.不能使用let
进行条件式声明。
5.for
循环中的let
声明,JavaScript引擎在后台会为每个迭代循环声明一个新的迭代变量。
代码如下(示例):console.log(d);//let声明的变量不会出现“提升”,在let声明变量之前使用该变量,出现暂时性死区 let d; let d = 23;//报错,重复声明 for (let i = 0; i < 5; i++) { setTimeout(() => console.log(i), 0); //顺序打印 0 1 2 3 4 }
-
const
关键字:
1.与let
类似,但是在声明的同时也得初始化变量。
2.const
声明对于for-of
、for-in
有特别的意义。
3.在for
循环中不能使用const
来声明迭代变量。
代码如下(示例):const f = 23; f = 24; //报错 const arr = [1, 2, 3, 4, 5]; for (const val of arr) { console.log(val); //打印 1 2 3 4 5 } // 错误示例 for(const i = 0; i < 5; i++){ console.log(i); }
2.JavaScript中基本数据类型
JS中有6中基本数据类型Undefined、Null、Boolean、String、Number、Symbol
:
Undefined 类型
:
Undefined类型只有一个值,即undefined
;当一个变量未初始化时,它的值默认为undefined
。
代码如下(示例):let a; console.log(a === undefined); //true console.log(typeof a); // "undefined"
Null 类型
:
Null类型只有一个值,即null
,逻辑上null
表示一个空对象指针,因此typeof
返回的值是"object"
。
代码如下(示例):let b = null; console.log(typeof b); // "object"
Boolean 类型
:
1.Boolean有两个字面值true
和false
。
2.可以通过Boolean()
转型函数将其它类型的值转换为Boolean类型的值。
代码如下(示例):let c = false; console.log(typeof c); //boolean console.log(Boolean(a)); // false console.log(Boolean(b)); // false
Number 类型
:
1.Number类型使用IEEE754
格式表示整数和浮点数。
2.最小值保存在Number.MIN_VALUE
中,值为5e-324
;最大值保存在Number.MAX_VALUE
中,值为1.7976931348623157e+308
。
3.进行浮点数的等值比较时应当注意到浮点数的精确度最高可达17位小数。如0.1 + 0.2 != 0.3
4.NaN
,表示不是数字,使用0除任何值的结果都是NaN
;其他类型的数据转为Number失败时,结果都是NaN
。
5.使用Number()
,parseInt()
,parseFloat()
将其它类型的数据转为Number类型的数值。
代码如下(示例):let d = 076; //八进制数字 console.log(d); let e = 0xA6; //十六进制 console.log(e); console.log(Number(a)); //NaN console.log(Number(b)); //0 console.log(Number(c)); //0 console.log(Number("0123")); //123 console.log(Number("")); //0 console.log(Number("0xA6")); //166 console.log(Number.MAX_VALUE); //1.7976931348623157e+308 console.log(Number.MIN_VALUE); //5e-324
String 类型
:
1.toString()
方法,将其他类型的数据转换为String类型的值,几乎其他所有类型的值都有toString()
方法,但null
和undefined
没有。
2.String()
,将其他类型的数据转为String 类型与toString()
类似,但是对null
和undefined
会回"null"
和"undefined"
。
3.模板字面量`${variable}
`。
代码如下(示例):console.log(c.toString()); //false console.log(String(a)); //undefined console.log(`\u03a3 ${c}`); //Σ false
Symbol 类型
:
1.Symbol
是原始值,且Symbol
实列唯一和不可变。主要用途是避免对象属性冲突。
2.Symbol()
,生成Symbol
实例。
3.通过Symbol.for()
进行共享和重用Symbol
实例,在全局符号表中创建。
4.Symbol.iterator
表示一个方法,该方法返回对象默认的迭代器。由for-of使用
。
代码如下(示例):let g = Symbol(); console.log(typeof g); //symbol let gloabalSymbol = Symbol.for("foo"); let reuseSymbol = Symbol.for("foo"); console.log(gloabalSymbol === reuseSymbol); //true class Emitter { constructor(max) { this.idx = 0; this.max = max; } *[Symbol.iterator]() { while (this.idx < this.max) { yield this.idx++; } } } function count(n) { const emitter = new Emitter(n); for (const x of emitter) { console.log(x); } } count(5); //打印 0 1 2 3 4
typeof
操作符,typeof
操作符返回的值是下列字符串之一:
"undefined"
、"function"
、"string"
、"number"
、"boolean"
、"object"
、"symbol"
代码如下(示例):let t1; let t2 = null; let t3 = false; let sum = (a, b) => a + b; let str = "dwcw"; let num = 1.56e+6; let obj = { name:'lili', age:23 }; let s = Symbol("we"); console.log(typeof t1); // undefined console.log(typeof t2); // object console.log(typeof t3); // boolean console.log(typeof sum); // function console.log(typeof num); // number console.log(typeof str); // string console.log(typeof obj); // object console.log(typeof s); // symbol
3.JavaScript中操作符
-
按位非(
~
):
返回数字的补数。let a = 123; console.log(~a); //-124
-
按位与(
&
):
返回两个数字的与值。let a = 123; let b = 111; console.log(a & b); //107
-
按位异或(
^
):
返回两个数字的异或值。let a = 123; let b = 111; console.log(a ^ b); //20
-
左移(
<<
):
将数字的二进制数的所有位向左移。let a = 1123; console.log(a >> 5); // 3
-
有符号右移(
>>
):
将数字的二进制数的所有非符号位右移。let a = 123; console.log(a << 5); //3936
-
无符号右移(
>>>
):
将数字的二进制数的所有位向右移。let a = 123; console.log(a >>> 5); // 3
-
逻辑非(
!
):
返回布尔值。let a = 123; console.log(!a); // false console.log(!!a); // true
-
逻辑与(
&&
):
返回布尔值。let f1 = true, f2 = false; console.log(f1 && f2);// false
-
逻辑或(
||
):
返回布尔值。let f1 = true, f2 = false; console.log(f1 || f2);// true
-
指数操作符(
**
):
a**
b表示a的b次方。let a = 2, b = 3; console.log(a ** b);// 8
-
等于(
==
)和不等于(!=
):
1.这两个操作符都会先进行类型转换(强制类型转换
),再确定两个操作数是否相等。
2.如果任一操作数是布尔值,则先将其转换为数值(true–>1, false–>0),再进行比较。
3.如果一个数字一个是字符串,则将字符串尝试转换为数字,再进行比较。
4.如果一个是对象另一个不是,则将对象调用valueOf()
方法取得其原始值,再根据前面的规则比较。
5.如果两个都是对象,则看它们是否指向同一个对象,是则返回true
;否则返回false
。
6.null
和undefined
相等。
7.如果有一个是NaN
则不相等(!=)
返回true
, 相等(==)
返回false
。console.log(null == undefined); //true console.log("12" != 12); //false console.log("err" == 12); //false console.log({} == {}); //false;
-
全相等(
===
)和全不相等(===
):
这两个操作符不会进行类型转换。console.log(null === undefined); //flase console.log("12" !== 12); //true console.log("err" !== 12); //true console.log({} === {}); //false;
-
for-in
:
是一种严格的迭代语句,用于枚举对象中的非符号键属性。const book = { id:123, author:"佚名", publishedDate:"2022/2/5", bookName:"《JS》" }; for (const prop in book){ console.log(`${prop} : ${book[prop]}`); }
-
for-of
:
是一种严格的迭代语句,用于遍历可迭代对象的元素 。const arr = [1, 2, 3, 4, 5]; for (const item of arr){ console.log(item); }
-
注意
:
两个操作数相加,只要其中有一个是字符串,就会将另一个(如果不是字符串)转换为字符串,然后将两个字符串按照操作数出现的顺序进行拼接,得到一个字符串。let a = 123; let b = "q"; console.log(a + b) ;// 123q console.log(b + a) ;// q123
总结
以上内容主要是通过学习《JavaScript高级程序设计》总结而得出,初次发表博客,有不足之处,欢迎大家直到评论。