变量类型
-
值类型,值类型存储在栈(Stack)内存中
-
栈内存是一种快速存取的内存区域,用于存储简单的数据值和局部变量。值类型的数据通常比较小,存储在栈中,能够快速地进行读取和写入操作。
例如,定义一个基本类型变量:
let a = 10;let b = a;b = 20;console.log(a); // 10console.log(b); // 20
值类型(基本类型):直接存储在变量中的值。这些类型包括:
- Number
- String
- Boolean
- Undefined
- Null
- Symbol(ES6 引入)
- BigInt(ES2020 引入)
-
-
引用类型-引用类型存储在堆(Heap)内存中
引用类型存的是内存地址引用类型:存储的是对象的引用,而不是对象本身。引用类型包括:- Object- Array- Function- Date- 其他自定义对象
typeof 运算符
typeof undefined; // undefined
typeof 'abc'; // String
typeof 123; // Number
typeof true; // boolean
typeof []; // object
typeof {}; // object
typeof null; // object
typeof console.log; // Function
注意,null是一个特殊的object,定义的一个空的指针(文职),但是它并没有指向任何的对象。null 特殊情况:尽管 typeof null 返回 “object”,但 null 实际上是基本类型之一,因此需要特别处理。typeof只能区分值类型(定义在栈上的数据),因此,判断引用类型需要使用其他方法。另外注意,function是一个非常非常特殊的引用类型,在js中函数的定位非常高,在使用上都有一些非常特殊的点,因此需要非常轻松的判断其类型。
判断数组:
const arr = [];
arr instanceof Array
其他,使用原型判断
Object.prototype.toString.call(arr);
// '[object Array]'
变量计算
js有强制类型转换,需要注意。
字符串拼接
如下例子:
var a = 100 +10 // 110
var b = 100 + '10' // 10010
==运算
100 = '100' //true
0 = '' // true
null == undefined // true
if语句
var a = true;
if (a) {...
}
var b = 100;
if (b) {...
}var c = '';
if (c) {...
}
逻辑运算
console.log(10 & 0); // 0
console.log('' || 'abc'); // abc
console.log(!Window.adc); // true
var a = 100
// 判断一个变量会被当成 true 还是 false
console.log(!!a); // true
从上面几个例子可以看出,我们在代码中进行逻辑判断时绝大部分情况一定要使用=== !,这里我们可以借鉴下jquery源码的类型判断。
下面这种特殊情况可以不使用===判断
var obj = {a: 'xx'
}
if (object.a == null) {...
}
这里的 *if (object.a == null)相当于 object.a === undefined || object.a === null,
其他情况都适用===进行类型判断。
JS的内置函数
- Object
- Array
- Number
- Boolean
- String
- Date
- Function
- RegExp
- Error
如何理解JSON
其实JSON和Math一样。都是JS内置的一个对象。