声明变量
let
Let和var作用相似,只是let声明的范围是块作用域,var声明的范围是函数作用域
var
当省略关键词var时,这样定义的变量将成为全局变量(不过不建议这么做,太多的全局变量会让程序变得难以维护)
- function test(){ a="sichuan"; }
- test();//调用函数
- console.log(a);
const
基本上和let相同,只是使用const时,必须同时初始化变量,且尝试修改const声明的变量时会报错
const n="zhang";
n="li";//TypeError: Assignment to constant variable.
const a=12;
const a=9;//不可以重复声明
基本数据类型(在栈中存储,空间小,大小固定):String、Number、Boolean、Null、Undefined、(Symbol、BigInt)新增的
引用数据类型(在堆中存储,空间大,大小不固定):Object、function、Array
数据类型检测的方式:
(1)typeof
- 使用方式:
- typeof 数据
- 示例代码:
- console.log(typeof 123); //Number
- console.log(typeof "Hello,World!"); //String
- console.log(typeof true); //Boolean
- console.log(typeof undefined); //Undefined
- console.log(typeof function () {}); // function
- bug实例
- console.log(typeof null); //Object
typeof能检测到的数据有function、string,number,boolean, undefined,symbol,其他所有的类型,都会被检测为object。
(2)instanceof
- let a = [];
- let b = function () {};
- let c = 4;
- let d = new Number(4);
- console.log(a instanceof Array); // true
- console.log(b instanceof Function); // true
- console.log(c instanceof Number); // false
- console.log(d instanceof Number); // true
只能判断引用对象数据类型,不能判断基本数据类型,可以用来测试一个对象在其原型链中是否存在一个构造函数的prototype属性
(3)constructor
判断数据的类型
对象实例通过constructor对象访问它的构造函数
- let a = [];
- let b = function () {};
- let c = 4;
- let d = null;
- console.log(a.constructor === Array);
- console.log(b.constructor === Function);
- console.log(c.constructor === Number);
- console.log(d.constructor === null);
// true
// true
// true
// 控制台报错
注意:
1. null 和 undefined 是无效的对象,因此是不会有 constructor 存在的。
2. 函数的 constructor 是不稳定的,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor 会默认为 Object,它就不能用来判断数据类型了
(4)Object.prototype.toString.call()(推荐使用)
该方法最繁琐,但最通用(基本和引用类型都可以检测)
- let a = [];
- let b = function () {}
- let c = 4;
- let d = null;
- console.log(Object.prototype.toString.call(a));
- console.log(Object.pro totype.toString.call(b));
- console.log(Object.prototype.toString.call(c));
- console.log(Object.prototype.toString.call(d));
// [object Array]
// [object Function]
// [object Number]
// [object Null]