Js基本语法、变量、数据类型

基本语法:

  1. Javascript跟Java一样区分大小写
  2. 变量是弱类型的:变量可以存放不同类型的值
  3. 每行结尾的分号可有可无
  4. 括号代表代码块(与大多数编程语言不一样,JavaScript的区块不构成单独的作用域(scope)。也就是说,区块中的变量与区块外的变量,属于同一个作用域。)
  5. 变量声明不是必须的

严格地说,var a = 1 与 a =1,这两条语句的效果不完全一样,主要体现在delete命令无法删除前者。不过,绝大多数情况下,这种差异是可以忽略的。

变量

通俗地来讲,变量就是用来装内容的容器。那么所指的内容又是什么?在Js中变量可以存在两种类型的值:原始值、引用值。而这两种形式的值又引出了Js的数据类型:原始类型、引用类型。

原始类型有5种: Undefined、Null、Boolean、Number 和 String
引用类型:对象(方法和属性的集合)。
对象又可以分成三个子类型:狭义的对象(object)、数组(array)、函数(function)

1、那么原始值与引用值又有什么不同?

这就涉及到了Js的内存机制。原始类型数据占据的空间是固定的,所以可将他们存储在较小的内存区域 - 中。这样存储便于迅速查寻变量的值。
所以原始类型的值是按值访问的(简单数据段)。

而引用值是指的是那些可能由多个值构成的对象。对象拥有方法跟属性。javascript**不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间**,那我们操作啥呢? 实际上,是操作对象的引用,
所以引用类型的值是按引用访问的。

准确地说,引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,也可以说是该对象在堆内存的地址。

2、然而为什么会有栈内存和堆内存之分?

通常与垃圾回收机制有关。为了使程序运行时占用的内存最小。
栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
一般来说,栈内存中存放的是存储对象的地址,而堆内存中存放的是存储对象的具体内容。对于原始类型的值而言,其地址和具体内容都存在与栈内存中;而基于引用类型的值,其地址存在栈内存,其具体内容存在堆内存中。堆内存与栈内存是有区别的,栈内存运行效率比堆内存高,空间相对堆内存来说较小,反之则是堆内存的特点。所以将构造简单的原始类型值放在栈内存中,将构造复杂的引用类型值放在堆中而不影响栈的效率。

var str = "Hello"; // str:"Hello"存在栈中
var obj = {value:"Hello"}; // obj存在栈中,{value:"Hello"}存在堆中,通过栈中的变量名obj(访问地址)访问

3、内存中的存储对象生命周期是怎么样的呢?
我们来看看MDN中的介绍:
1.当对象将被需要的时候为其分配内存
2.使用已分配的内存(读、写操作)
3.当对象不在被需要的时候,释放存储这个对象的内存
第一步和第二步在所有语言中都是一样的,第三步的操作在JavaScript中不是那么明显。

如果本宝宝前面描述还足够清晰,您对下面代码的运行结果也不会惊讶!当然很多描述也是借鉴很多地方来的

var a = "a"; var b = a; console.log(a,b);
结果: a a
var a = "a"; var b = a; b = "b"; console.log(a,b);
结果: a b
var a = {a:"a"}; 
var b = a;
console.log(a,b);
结果: Object {a: "a"} Object {a: "a"}
var a = {a}; var b = a; b.a = "b"; console.log(a,b);
结果: Object {a: "b"} Object {a: "b"}
var a = {a:"a"}; b.a = "b"; console.log(a,b);
结果: Object {a: "a"} Object {a: "b"}
var a = {a:"a"}; var b = a; b.a = "b"; console.log(a,b);
结果: Object {a: "b"} Object {a: "b"}
var a = {a:"a"}; var b = a; b = "b"; console.log(a,b);
结果: Object {a: "a"} "b"

讲了变量、列了数据类型,那么ECMAScript 是如何判断一个值的数据类型的?变量的“隐式转换”又体现在哪里?ES5的变量声明还有什么不妥?null与undefined的区别又是什么?不由得又想到了“变量提升”这个词。

<think>我们正在总结JavaScript中的变量定义、基础语法数据类型。根据用户提供的引用和之前的回答,我们需要详细说明这些内容。 注意:引用[1]提到变量声明、数据类型等;引用[2]提到JavaScript基本结构;引用[3]详细说明了变量数据类型的动态特性;引用[4]提到了TypeScript中的null和undefined,但我们的重点是JavaScript;引用[5]提到了BigInt类型。 我们将按照以下结构组织回答: 1. 变量定义(三种方式:var, let, const) 2. 基础语法(注释、语句、标识符、关键字等) 3. 数据类型(包括基本数据类型和引用数据类型,以及ES6新增的Symbol和ES11新增的BigInt) 4. 类型检测与转换 5. 相关问题 注意:在回答中,我们将使用内公式(如$x^2$)和独立公式(如$$...$$)来表示数学表达式,但数据类型部分主要是文本描述,可能数学公式较少,但如果有数值范围等,我们可以用公式表示。 此外,我们将自然地添加引用标识,例如[^1]等,但注意用户提供的引用编号是[1]到[5],我们需要对应。 开始编写回答:</think>### JavaScript 变量定义、基础语法数据类型详解 #### 一、变量定义 1. **声明方式** - **`var`**(ES5): - 函数作用域,存在变量提升 ```javascript var name = "Alice"; if (true) { var name = "Bob"; } console.log(name); // "Bob"(作用域穿透) ``` - **`let`**(ES6): - 块级作用域,禁止重复声明 ```javascript let age = 25; if (true) { let age = 30; } console.log(age); // 25(块级隔离) ``` - **`const`**(ES6): - 块级作用域,声明时必须赋值,禁止重新赋值(对象属性可修改) ```javascript const PI = 3.14; const user = { name: "Tom" }; user.name = "Jerry"; // 允许修改属性 ``` 2. **变量提升(Hoisting)** - `var`声明的变量会提升至作用域顶部(值为`undefined`) - `let/const`存在**暂时性死区**(TDZ),声明前访问会报错 ```javascript console.log(a); // undefined(var提升) var a = 10; console.log(b); // ReferenceError(let在TDZ) let b = 20; ``` --- #### 二、基础语法 1. **语句与表达式** - **语句**:执操作的指令(如`if`、`for`) - **表达式**:产生值的代码单元(如`5 + 3`、`x > 0`) 2. **注释** ```javascript // 单注释 /* 多注释 */ ``` 3. **标识符规则** - 以字母、`_`或`$`开头,后续可为字母、数字、`_`或`$` - 区分大小写,不能使用保留字(如`class`、`function`) 4. **严格模式** ```javascript "use strict"; // 启用严格模式 x = 10; // 报错(未声明变量) ``` --- #### 三、数据类型详解 JavaScript 是**弱类型动态语言**,变量类型由赋值决定[^3]。 1. **基本数据类型(值类型)** | 类型 | 描述 | 示例 | 数学表示 | |---------------|-------------------------------|-----------------------|-----------------------| | **`number`** | 整数/浮点数/特殊值 | `42`, `3.14`, `NaN` | $[-2^{53}+1, 2^{53}-1]$ | | **`string`** | UTF-16编码的文本序列 | `"Hello"`, `'JS'` | `length`属性确定长度 | | **`boolean`** | 逻辑值 | `true`, `false` | $\{0,1\}$ | | **`undefined`**| 变量未初始化时的默认值 | `let a;` | 唯一值`undefined` | | **`null`** | 空对象指针 | `let b = null;` | 唯一值`null` | | **`symbol`**(ES6) | 唯一不可变标识符 | `Symbol("id")` | 无数学等价 | | **`bigint`**(ES11) | 任意精度整数 | `12345678901234567890n` | $\mathbb{Z}$(整数集) | 2. **引用数据类型(对象类型)** - **`Object`**:键值对集合 ```javascript let user = { name: "Alice", age: 25 }; ``` - **`Array`**:有序数据集合 ```javascript let colors = ["red", "green", "blue"]; ``` - **`Function`**:可调用对象 ```javascript function sum(a, b) { return a + b; } ``` - **`Date`**、**`RegExp`**等内置对象 3. **类型特性对比** | 特性 | 基本数据类型 | 引用数据类型 | |-----------------|----------------------------------|----------------------------| | **存储位置** | 栈内存(直接存储值) | 堆内存(存储地址指针) | | **赋值为** | 值复制(互不影响) | 地址引用(修改影响所有引用)| | **比较方式** | 值比较:`5 === 5` → `true` | 地址比较:`[] === []` → `false` | 4. **类型检测方法** - **`typeof`**:检测基本类型(除`null`) ```javascript typeof 42; // "number" typeof []; // "object"(局限:无法区分数组和对象)[^4] ``` - **`instanceof`**:检测对象类型 ```javascript [] instanceof Array; // true ``` - **`Array.isArray()`**:专用于数组检测 ```javascript Array.isArray([]); // true ``` 5. **类型转换规则** | 原始值 | 转数字 | 转字符串 | 转布尔值 | |----------------|-------------------|-------------------|------------------| | `0` | 0 | `"0"` | `false` | | `"5"` | 5 | `"5"` | `true` | | `""` | 0 | `""` | `false` | | `null` | 0 | `"null"` | `false` | | `undefined` | `NaN` | `"undefined"` | `false` | | `[]` | 0 | `""` | `true` | | `{}` | `NaN` | `"[object Object]"`| `true` | --- ### 关键概念总结 1. **作用域机制**: - `var`:函数作用域,易导致变量污染 - `let/const`:块级作用域,推荐使用 2. **类型本质**: - 动态类型:变量类型在运时确定 - 弱类型:支持隐式类型转换(如 `"5" - 3 = 2`) 3. **最佳实践**: - 优先使用`const`声明常量 - 用`===`代替`==`避免隐式转换 - 复杂对象使用深拷贝(如`JSON.parse(JSON.stringify(obj))`) > 示例:类型转换陷阱 > ```javascript > console.log(1 + "2"); // "12"(字符串拼接) > console.log("5" - 3); // 2(隐式转数字) > console.log(null == 0); // false(null仅与undefined或自身相等) > ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值