JavaScript 代码块

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>javascript</title>
</head>
<body>
    <h1>网页</h1>
    <p id="demo">段落</p>
    <div id="div">一个div</div>
    <script>
        document.getElementById("demo").innerHTML = "我的第一个 JavaScript 段落。";
        document.getElementById("div").innerHTML = "这是div";
    </script>
</body>
</html>

以上例子就是一个很简单的JavaScript代码块,它可以在网页中显示一个段落和一个div元素。

JavaScript 语句标识符

语句描述
break用于跳出循环或switch语句。常用于循环体内部,立即终止当前循环。
catch与try配合使用的错误处理语句块。当try块中发生异常时,执行catch块中的代码。
continue跳过循环中的当前迭代,直接进入下一次循环。不会终止整个循环。
do...while先执行一次代码块,然后在条件为true时重复执行。至少会执行一次。
for创建一个计数循环,可指定初始值、条件和递增/递减步长。适用于明确循环次数的场景。
for...in遍历对象的可枚举属性或数组的索引。主要用于对象属性的遍历,不推荐用于数组。
function定义一个可重复使用的代码块。可以接收参数并返回值,是代码复用的基本单位。
if...else根据条件执行不同的代码块。可以有多个else if分支,实现多条件判断。
return结束函数执行并返回指定值。如果没有指定返回值,则返回undefined。
switch基于不同的条件值执行对应的代码块。适用于多分支条件判断,比多个if...else更清晰。
throw手动抛出异常,可以是任意类型的值。通常与try...catch配合使用。
try标记需要进行错误处理的代码块。如果发生错误,控制权会转移到catch块。
var声明变量。函数作用域,可以重复声明,有变量提升特性。建议使用let/const替代。
while当条件为true时重复执行代码块。如果初始条件为false,则一次都不会执行。
------------
catch与try配合使用的错误处理语句块。当try块中发生异常时,执行catch块中的代码。
continue跳过循环中的当前迭代,直接进入下一次循环。不会终止整个循环。
do...while先执行一次代码块,然后在条件为true时重复执行。至少会执行一次。
for创建一个计数循环,可指定初始值、条件和递增/递减步长。适用于明确循环次数的场景。
for...in遍历对象的可枚举属性或数组的索引。主要用于对象属性的遍历,不推荐用于数组。
function定义一个可重复使用的代码块。可以接收参数并返回值,是代码复用的基本单位。
if...else根据条件执行不同的代码块。可以有多个else if分支,实现多条件判断。
return结束函数执行并返回指定值。如果没有指定返回值,则返回undefined。
switch基于不同的条件值执行对应的代码块。适用于多分支条件判断,比多个if...else更清晰。
throw手动抛出异常,可以是任意类型的值。通常与try...catch配合使用。
try标记需要进行错误处理的代码块。如果发生错误,控制权会转移到catch块。
var声明变量。函数作用域,可以重复声明,有变量提升特性。建议使用let/const替代。
while当条件为true时重复执行代码块。如果初始条件为false,则一次都不会执行。
break用于跳出循环或switch语句。常用于循环体内部,立即终止当前循环。
continue跳过循环中的当前迭代,直接进入下一次循环。不会终止整个循环。
do...while先执行一次代码块,然后在条件为true时重复执行。至少会执行一次。
for创建一个计数循环,可指定初始值、条件和递增/递减步长。适用于明确循环次数的场景。
for...in遍历对象的可枚举属性或数组的索引。主要用于对象属性的遍历,不推荐用于数组。
function定义一个可重复使用的代码块。可以接收参数并返回值,是代码复用的基本单位。
if...else根据条件执行不同的代码块。可以有多个else if分支,实现多条件判断。
return结束函数执行并返回指定值。如果没有指定返回值,则返回undefined。
switch基于不同的条件值执行对应的代码块。适用于多分支条件判断,比多个if...else更清晰。
throw手动抛出异常,可以是任意类型的值。通常与try...catch配合使用。
try标记需要进行错误处理的代码块。如果发生错误,控制权会转移到catch块。
var声明变量。函数作用域,可以重复声明,有变量提升特性。建议使用let/const替代。
while当条件为true时重复执行代码块。如果初始条件为false,则一次都不会执行。
catch与try配合使用的错误处理语句块。当try块中发生异常时,执行catch块中的代码。
do...while先执行一次代码块,然后在条件为true时重复执行。至少会执行一次。
for创建一个计数循环,可指定初始值、条件和递增/递减步长。适用于明确循环次数的场景。
for...in遍历对象的可枚举属性或数组的索引。主要用于对象属性的遍历,不推荐用于数组。
function定义一个可重复使用的代码块。可以接收参数并返回值,是代码复用的基本单位。
if...else根据条件执行不同的代码块。可以有多个else if分支,实现多条件判断。
return结束函数执行并返回指定值。如果没有指定返回值,则返回undefined。
switch基于不同的条件值执行对应的代码块。适用于多分支条件判断,比多个if...else更清晰。
throw手动抛出异常,可以是任意类型的值。通常与try...catch配合使用。
try标记需要进行错误处理的代码块。如果发生错误,控制权会转移到catch块。
var声明变量。函数作用域,可以重复声明,有变量提升特性。建议使用let/const替代。
while当条件为true时重复执行代码块。如果初始条件为false,则一次都不会执行。
continue跳过循环中的当前迭代,直接进入下一次循环。不会终止整个循环。
for创建一个计数循环,可指定初始值、条件和递增/递减步长。适用于明确循环次数的场景。
for...in遍历对象的可枚举属性或数组的索引。主要用于对象属性的遍历,不推荐用于数组。
function定义一个可重复使用的代码块。可以接收参数并返回值,是代码复用的基本单位。
if...else根据条件执行不同的代码块。可以有多个else if分支,实现多条件判断。
return结束函数执行并返回指定值。如果没有指定返回值,则返回undefined。
switch基于不同的条件值执行对应的代码块。适用于多分支条件判断,比多个if...else更清晰。
throw手动抛出异常,可以是任意类型的值。通常与try...catch配合使用。
try标记需要进行错误处理的代码块。如果发生错误,控制权会转移到catch块。
var声明变量。函数作用域,可以重复声明,有变量提升特性。建议使用let/const替代。
while当条件为true时重复执行代码块。如果初始条件为false,则一次都不会执行。
do...while先执行一次代码块,然后在条件为true时重复执行。至少会执行一次。
for...in遍历对象的可枚举属性或数组的索引。主要用于对象属性的遍历,不推荐用于数组。
function定义一个可重复使用的代码块。可以接收参数并返回值,是代码复用的基本单位。
if...else根据条件执行不同的代码块。可以有多个else if分支,实现多条件判断。
return结束函数执行并返回指定值。如果没有指定返回值,则返回undefined。
switch基于不同的条件值执行对应的代码块。适用于多分支条件判断,比多个if...else更清晰。
throw手动抛出异常,可以是任意类型的值。通常与try...catch配合使用。
try标记需要进行错误处理的代码块。如果发生错误,控制权会转移到catch块。
var声明变量。函数作用域,可以重复声明,有变量提升特性。建议使用let/const替代。
while当条件为true时重复执行代码块。如果初始条件为false,则一次都不会执行。
for创建一个计数循环,可指定初始值、条件和递增/递减步长。适用于明确循环次数的场景。
function定义一个可重复使用的代码块。可以接收参数并返回值,是代码复用的基本单位。
if...else根据条件执行不同的代码块。可以有多个else if分支,实现多条件判断。
return结束函数执行并返回指定值。如果没有指定返回值,则返回undefined。
switch基于不同的条件值执行对应的代码块。适用于多分支条件判断,比多个if...else更清晰。
throw手动抛出异常,可以是任意类型的值。通常与try...catch配合使用。
try标记需要进行错误处理的代码块。如果发生错误,控制权会转移到catch块。
var声明变量。函数作用域,可以重复声明,有变量提升特性。建议使用let/const替代。
while当条件为true时重复执行代码块。如果初始条件为false,则一次都不会执行。
for...in遍历对象的可枚举属性或数组的索引。主要用于对象属性的遍历,不推荐用于数组。
if...else根据条件执行不同的代码块。可以有多个else if分支,实现多条件判断。
return结束函数执行并返回指定值。如果没有指定返回值,则返回undefined。
switch基于不同的条件值执行对应的代码块。适用于多分支条件判断,比多个if...else更清晰。
throw手动抛出异常,可以是任意类型的值。通常与try...catch配合使用。
try标记需要进行错误处理的代码块。如果发生错误,控制权会转移到catch块。
var声明变量。函数作用域,可以重复声明,有变量提升特性。建议使用let/const替代。
while当条件为true时重复执行代码块。如果初始条件为false,则一次都不会执行。
function定义一个可重复使用的代码块。可以接收参数并返回值,是代码复用的基本单位。
return结束函数执行并返回指定值。如果没有指定返回值,则返回undefined。
switch基于不同的条件值执行对应的代码块。适用于多分支条件判断,比多个if...else更清晰。
throw手动抛出异常,可以是任意类型的值。通常与try...catch配合使用。
try标记需要进行错误处理的代码块。如果发生错误,控制权会转移到catch块。
var声明变量。函数作用域,可以重复声明,有变量提升特性。建议使用let/const替代。
while当条件为true时重复执行代码块。如果初始条件为false,则一次都不会执行。
if...else根据条件执行不同的代码块。可以有多个else if分支,实现多条件判断。
switch基于不同的条件值执行对应的代码块。适用于多分支条件判断,比多个if...else更清晰。
throw手动抛出异常,可以是任意类型的值。通常与try...catch配合使用。
try标记需要进行错误处理的代码块。如果发生错误,控制权会转移到catch块。
var声明变量。函数作用域,可以重复声明,有变量提升特性。建议使用let/const替代。
while当条件为true时重复执行代码块。如果初始条件为false,则一次都不会执行。
return结束函数执行并返回指定值。如果没有指定返回值,则返回undefined。
throw手动抛出异常,可以是任意类型的值。通常与try...catch配合使用。
try标记需要进行错误处理的代码块。如果发生错误,控制权会转移到catch块。
var声明变量。函数作用域,可以重复声明,有变量提升特性。建议使用let/const替代。
while当条件为true时重复执行代码块。如果初始条件为false,则一次都不会执行。
switch基于不同的条件值执行对应的代码块。适用于多分支条件判断,比多个if...else更清晰。
try标记需要进行错误处理的代码块。如果发生错误,控制权会转移到catch块。
var声明变量。函数作用域,可以重复声明,有变量提升特性。建议使用let/const替代。
while当条件为true时重复执行代码块。如果初始条件为false,则一次都不会执行。
throw手动抛出异常,可以是任意类型的值。通常与try...catch配合使用。
var声明变量。函数作用域,可以重复声明,有变量提升特性。建议使用let/const替代。
while当条件为true时重复执行代码块。如果初始条件为false,则一次都不会执行。
try标记需要进行错误处理的代码块。如果发生错误,控制权会转移到catch块。
while当条件为true时重复执行代码块。如果初始条件为false,则一次都不会执行。
var声明变量。函数作用域,可以重复声明,有变量提升特性。建议使用let/const替代。

| while | 当条件为true时重复执行代码块。如果初始条件为false,则一次都不会执行。 |

JavaScript 变量

变量是用于存储数据值的容器。在JavaScript中,变量可以使用varletconst关键字进行声明。

变量的声明

var 关键字

var关键字用于声明变量。它有函数作用域,意味着在函数内部声明的变量只能在函数内部访问。

var x = 10;

let 关键字

let关键字用于声明块级作用域的变量。它与var不同,let声明的变量只在其所在的代码块中有效。

let y = 20;

const 关键字

const关键字用于声明常量,其值在声明后不能被改变。const声明的变量也有块级作用域。

const z = 30;

变量的使用

变量在声明后可以被赋值和使用。

x = 100; // 合法
y = 200; // 合法
z = 300; // 错误,z是一个常量,不能被重新赋值

变量的作用域

变量的作用域决定了变量在代码中的可访问性。

  • 函数作用域:在函数内部声明的变量只能在函数内部访问。
  • 块级作用域:在{}内部声明的变量(如letconst)只能在该代码块内部访问。

变量的提升

var关键字声明的变量会发生变量提升,即变量可以在声明之前被访问,但是值为undefined

console.log(a); // 输出 undefined
var a = 10;

letconst关键字声明的变量不会发生变量提升,这意味着在声明之前访问这些变量会抛出错误。

console.log(b); // 错误,b未定义
let b = 20;

JavaScript 数据类型

JavaScript 中的数据类型可以分为两大类:原始数据类型和引用数据类型。

引用数据类型(对象类型):对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)。

值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol。

原始数据类型

原始数据类型是指简单的数据类型,它们是不可变的,即一旦创建,就不能被修改。

数字类型(Number)

数字类型用于表示数值,包括整数和浮点数。

let a = 10; // 整数
let b = 3.14; // 浮点数

字符串类型(String)

字符串类型用于表示文本,由零个或多个字符组成。

let c = "Hello, World!";

布尔类型(Boolean)

布尔类型用于表示逻辑值,只有两个可能的取值:truefalse

let d = true;
let e = false;

空类型(Null)

空类型表示一个空值,只有一个可能的取值:null

let f = null;

未定义类型(Undefined)

未定义类型表示一个未初始化的变量,只有一个可能的取值:undefined

undefined表示“未定义”,下面是返回undefined的典型场景。

// 变量声明了,但没有赋值
var i;
i // undefined

// 调用函数时,应该提供的参数没有提供,该参数等于 undefined
function f(x) {
  return x;
}
f() // undefined

// 对象没有赋值的属性
var  o = new Object();
o.p // undefined

// 函数没有返回值时,默认返回 undefined
function f() {}
f() // undefined

null和undefined的区别

null是一个表示“空”的对象,转为数值时为0;undefined是一个表示“此处无定义”的原始值,转为数值时为NaN。

引用数据类型

引用数据类型是指复杂的数据类型,它们是可变的,即可以被修改。

对象类型(Object)

对象类型用于表示复杂的数据结构,由属性和方法组成。

let person = {
    firstName: "John",
    lastName: "Doe",
    age: 50,
    eyeColor: "blue"
};

数组类型(Array)

数组类型用于表示有序的元素集合,每个元素都有一个唯一的索引。

let numbers = [1, 2, 3, 4, 5];

函数类型(Function)

函数类型用于表示可重复使用的代码块。

function sayHello() {
    console.log("Hello, World!");
}

数值精度

JavaScript 中的数值精度是有限的,最多只能表示 53 位二进制位(16 位十六进制位)。这意味着 JavaScript 只能准确表示从 -2^53 到 2^53 之间的整数,超出这个范围的数值将失去精度。

let a = 9007199254740991; // 2^53 - 1
let b = a + 1;
console.log(b); // 9007199254740992

在上面的示例中,变量 b 的值是 a 加 1 后的结果,但是由于 JavaScript 只能准确表示 53 位二进制位,所以 b 的值比预期的多了 1。

这是因为 JavaScript 中的数值是基于 IEEE 754 标准的双精度浮点数表示的,而双精度浮点数只能表示 53 位二进制位。

let a = 9007199254740992; // 2^53
let b = a + 1;
console.log(b); // 9007199254740992

在上面的示例中,变量 b 的值是 a 加 1 后的结果,但是由于 JavaScript 只能准确表示 53 位二进制位,所以 b 的值与预期的相同。

数值范围

JavaScript 中的数值范围是从 -2^53 到 2^53,这意味着 JavaScript 可以准确表示的整数范围是从 -9007199254740991 到 9007199254740991。

如果一个数大于等于2的1024次方,那么就会发生“正向溢出”,即 JavaScript 无法表示这么大的数,这时就会返回Infinity。

Math.pow(2, 1024) // Infinity

如果一个数小于等于2的-1075次方(指数部分最小值-1023,再加上小数部分的52位),那么就会发生为“负向溢出”,即 JavaScript 无法表示这么小的数,这时会直接返回0。

Math.pow(2, -1075) // 0

下面是一个实际的例子。

var x = 0.5;

for(var i = 0; i < 25; i++) {
  x = x * x;
}

x // 0

上面代码中,对0.5连续做25次平方,由于最后结果太接近0,超出了可表示的范围,JavaScript 就直接将其转为0。

JavaScript 提供Number对象的MAX_VALUE和MIN_VALUE属性,返回可以表示的具体的最大值和最小值。

Number.MAX_VALUE // 1.7976931348623157e+308
Number.MIN_VALUE // 5e-324

NaN

NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。

NaN 表示“非数值”(Not a Number),它是一个特殊的数值,用于表示不是有效数字的情况。

NaN === NaN // false

NaN 不等于任何值包括它自己

NaN与任何数(包括它自己)的运算,得到的都是NaN。

Infinity

Infinity 表示“无穷大”,它是一个特殊的数值,用于表示大于任何数的情况。

Infinity === Infinity // true

Infinity 与任何数(包括它自己)的运算,得到的都是 Infinity。

Infinity + 100 // Infinity
Infinity * 0 // NaN

Infinity有正负之分,Infinity表示正的无穷,-Infinity表示负的无穷。

与数值相关的全局方法

parseInt

基本用法

parseInt方法用于将字符串转为整数。

parseInt("123") // 123
parseInt("123.45") // 123
parseInt("010") // 8(前导零被忽略)
parseInt("123a") // 123(非数字字符后的部分被忽略)

字符串转为整数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分。

parseInt('8a') // 8
parseInt('12**') // 12
parseInt('12.34') // 12
parseInt('15e2') // 15
parseInt('15px') // 15

如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN。

parseInt('abc') // NaN
parseInt('.3') // NaN
parseInt('') // NaN
parseInt('+') // NaN
parseInt('+1') // 1

进制转换

parseInt方法还可以接受第二个参数(2到36之间的整数),表示被解析的字符串是多少进制的,返回一个十进制的整数。

parseInt('1000', 2) // 8(二进制转十进制)
parseInt('1000', 8) // 512(八进制转十进制)
parseInt('1000', 16) // 4096(十六进制转十进制)

parseFloat()

parseFloat方法用于将字符串转为浮点数。

parseFloat("123.45") // 123.45
parseFloat("010") // 10(前导零被忽略)
parseFloat("123a") // 123(非数字字符后的部分被忽略)

isNaN()

isNaN方法用于判断一个值是否为NaN。

isNaN(NaN) // true
isNaN(123) // false

isFinite()

isFinite方法用于判断一个值是否为有限的数值(即不是Infinity或NaN)。

isFinite(Infinity) // false
isFinite(-Infinity) // false
isFinite(NaN) // false
isFinite(undefined) // false
isFinite(null) // true
isFinite(-1) // true

使用 let 和 const (ES6)

let 关键字

let关键字用于声明块级作用域的变量。与var不同,let声明的变量只在其所在的代码块中有效。

let x = 10;

const 关键字

const关键字用于声明常量,其值在声明后不能被改变。const声明的变量也有块级作用域。

const y = 20;

块级作用域

letconst声明的变量只在其所在的代码块中有效。这意味着在{}内部声明的变量只能在该代码块内部访问。

{
  let z = 30;
  const w = 40;
}
console.log(z); // 错误,z未定义
console.log(w); // 错误,w未定义

在 2015 年以前,我们使用 var 关键字来声明 JavaScript 变量。

在 2015 后的 JavaScript 版本 (ES6) 允许我们使用 const 关键字来定义一个常量,使用 let 关键字定义的限定范围内作用域的变量。

let

let 是 ES6 引入的新变量声明方式,推荐使用。