值的介绍
一、 值类型:
-
原始值
stack栈
: 遵循后进先出原则,中主要存放一些基本类型的变量和对象的引用。如:Number String Boolean undefined null symbol BigInt
栈内不可修改值,内存满才会实现二次值覆盖
-
引用值
heap堆
:用于复杂数据类型(引用类型)分配空间。 如:array object function ...date RegExp
引用值在堆内存中,栈内存中存储的是堆内存的引用
-
图示:
-
思考题:
- 题:
var a = {},var b = {},为什么 a===b 为 false
- 解:
- 声明
a
和b
的时候,值{}
依次在堆里创建了空间,并分别给a
和b
暴露了一个指针路径 ===
比较的是a
和b
的指针路径,虽然a
和b
都为{}
,但是路径不一样,所以a===b
为false
- 声明
- 题:
二、运算符
顺序: 计算从左向右,赋值从右往左
- 算术运算符
+
:加法-
:减法*
:乘法/
:除法%
:取模(求余数)++
:递增--
:递减 - 比较运算符
==
:等于(类型转换后比较)===
:恒等(值和类型都相同)!=
:不等于(类型转换后比较)!==
:不恒等(值或类型不同)>
:大于<
:小于>=
:大于或等于<=
:小于或等于in
:检查对象是否包含某个属性instanceof
:检查对象是否是某个构造函数的实例 - 赋值运算符
=
:赋值+=
:加等于-=
:减等于*=
:乘等于/=
:除等于 - 逻辑运算符
&&
:逻辑与(and
)||
:逻辑或(or
)!
:逻辑非(not
):转成布尔值并取反data && fun() // `data`存在 执行`fun()` data || fun() // `data`或者`fun()`为`true` !'a' // false !'' // true
- 条件(三元)运算符
? :
:条件(三元)运算符var a = 'a' var b = !!a ? a : 'b' // b = a : 如果a是真的,则取a,否则取'b'
- 类型运算符
-
typeof
:返回变量的类型:返回值为字符串类型, 全部小写typeof null
返回结果为object
,早期null
被视为一个特殊的对象,充当占位符简单封装一个
typeof
工具类:function getType(par) { var obj = { '[Object Object]': 'object', '[Object Array]': 'array', '[Object Number]': 'object - number', '[Object Boolean]': 'object - boolean', '[Object String]': 'object - string', } if (par === 'null') { return 'null'; } else if (typeof (par) === 'object') { var str = Object.prototype.toString.call(par); return obj[str]; } else { return typeof (par) } }
Object.prototype.toString
是JavaScript
中一个非常重要的方法,它返回表示该对象的具体类型的字符串call
方法主要用途是改变函数执行时的上下文(即 this 的指向)
-
delete
:删除对象的属性var
定义的变量,delete
无法删除- 在
JavaScript
中,没有直接的方法可以“删除”一个作用域内的变量。一旦变量被声明,它就会一直存在,直到作用域结束或程序结束 - 你可以将变量的值设置为
undefined
或其他默认值,以此来“清空”该变量
- 在
-
void
:计算表达式并返回undefined
<a rel="nofollow" href="javascript:void(0);">点击这里不会做任何事情</a>
-
- 其他运算符
,
逗号运算符:用于分隔多个表达式,并返回最后一个表达式的值。var a = (1 - 1, 1 + 1); // 值为: 2
...
:扩展运算符,用于数组或对象的展开
这里不介绍位运算符
三、 练习
- 题:// 一、交换a和b的值:
var a = 1; var b = 2;
- 解法1:借用中间变量
var c = b; // c = 2 b = a; // b = 1; a = c; // a = 2
- 解法2:求和
a = a + b; b = a - b; // b= 1 a = a - b; // a= 2