变量声明
在JavaScript中,你可以使用var、let或const关键字来声明变量:
var
:是最传统的声明方式,它声明的变量可以是局部的(如果在函数内部声明)或全局的(如果在函数外部声明)。var声明的变量存在变量提升现象,意味着变量可以在声明之前被引用。let
:是ES6引入的,支持块级作用域(block scope),即变量仅在声明它的块或子块中可用。const
:同样是ES6引入的,用于声明常量。一旦声明,其值就不能改变,并且必须在声明时初始化。const也支持块级作用域。
作用域
- 全局作用域:在函数外部声明的变量是全局变量,它们在代码的任何地方都是可访问的。
- 函数作用域:使用var在函数内部声明的变量,其作用域被限制在该函数内部,外部无法访问。
- 块级作用域:使用let和const声明的变量,其作用域被限制在声明它们的块(如循环、条件语句等)及其子块内部。
注意事项
- 变量命名:避免使用JavaScript保留字,推荐使用驼峰命名法。
- 避免全局变量:尽量减少全局变量的使用,以避免潜在的命名冲突和可维护性问题。
使用const和let:鉴于var的一些设计问题(如变量提升和非块级作用域),推荐使用let和const进行变量声明,以利用它们的块级作用域特性和更清晰的语义。 - 初始化常量:使用const声明常量时,必须同时初始化,因为其值后续不能更改。
基本数据类型
JavaScript有以下几种基本数据类型:
Number
:用于表示整数或浮点数。JavaScript中没有整数和浮点数的区别,它们都是Number类型。特殊的数值包括Infinity、-Infinity和NaN(不是一个数字)String
:用于表示文本数据,即字符序列。字符串可以使用单引号、双引号或反引号(ES6中的模板字符串)来创建Boolean
:表示逻辑值true或falseUndefined
:当一个变量被声明但没有被赋值时,它的值是undefinedNull
:表示一个空值或不存在的值。它是一个表示“无”的原始值Symbol
(ES6中新增):表示唯一的、不可变的数据值,常用作对象属性的键BigInt
(ES2020中新增):用于表示大于2^53 - 1的整数
复合数据类型
- Object:表示一个实体,可以包含多个键值对或复杂的实体。对象可以是普通对象、数组、函数、日期等
- Array:一种特殊的对象,用于存储有序的数据集合
- Function:函数实际上是可调用的对象,它执行一段代码块
特殊数据类型
Undefined
和Null
被视为特殊的数据类型,它们各自只有一个值:undefined
和null
类型转换
- JavaScript是一种弱类型语言,它允许在操作涉及不匹配类型时进行隐式类型转换。例如,当数字与字符串相加时,数字会被转换为字符串
运算符
JavaScript提供了多种运算符来执行数学运算、比较运算、逻辑运算等:
- 算术运算符:如加(
+
)、减(-
)、乘(*
)、除(/
)等 - 比较运算符:如等于(
==
)、不等于(!=)、严格等于(===
)、严格不等于(!==
)、大于(>
)、小于(<
)等; - 逻辑运算符:如逻辑与(
&&
)、逻辑或(||
)、逻辑非(!
)等 - 赋值运算符:如简单赋值(
=
)、加赋值(+=
)、减赋值(-=
)等 - 字符串运算符:加号(
+
)也可以用来连接字符串 - 条件(三元)运算符:格式为condition ? exprIfTrue : exprIfFalse,根据条件返回两个表达式中的一个
- 注: 在JavaScript中,
==
和===
都是比较运算符,但它们在比较值时的行为不同:
==
(等于):这是相等运算符,它在比较两个值时会进行类型转换(如果比较的值不是同一类型)。这意味着在比较之前,如果两个值的类型不同,JavaScript会尝试将它们转换为相同的类型,然后进行比较。例如,0 == '0’会返回true,因为字符串’0’会被转换为数字0,然后进行比较
===
(恒等于):这是严格相等运算符,它在比较两个值时不会进行类型转换。如果两个值的类型不同,那么这两个值就被认为是不相等的,即使它们的值在进行类型转换后可能相等。例如,0=== '0’会返回false,因为一个是数字类型,另一个是字符串类型,不进行类型转换直接比较,它们不相等
类型检测
可以使用typeof运算符来检测一个变量的数据类型。但是,对于null来说,typeof null会返回"object"。