数据类型有number,string,Boolean,null,undefined,object,symbol
判断基本数据类型使用typeof 判断null返回object
判断object具体类型使用instanceof
比如array function regexp

如下
var as=[1]
console.log(as instanceof Array)

由于在数据类型里面的object比较复杂,又叫引用数据类型
因为object类型是存储在堆内存里面,用指针引用
不管是怎么赋值其实都是调用指针
所以会出现深浅拷贝的问题
不像基本数据类型存储在栈里面

var a={
b:2
}
var c=a
var d=a
d.b=3
console.log(c.b)//3
//var v=Object.assign({},a)这样解决
//如果属性存在array或者对象字面量那只能json.parse stringify

而数据又分全局与局部变量
以及作用域产生的链,同时又存在一个执行环境
里面有几个不一样的地方
比如在

if(true){
var a=1
}
console.log(a)
这个a位于全局作用域下面
for(var i=0;i<3;i++){
console.log(i)
}
这个i也是 在if与for里面都是位于全局

但是后面出现了let块级作用域
用来解决这个问题
if(true){
let a=1
}

而作用域存在的是由内到外 最后到全局作用域
但是效率不如定义在局部作用域的变量
类型于原型链一样 在局部找不到会一直到全局
在本身找不到会一直找到object的默认原型链

虽然在
Object.defineProperty(obj,key,数据属性或访问器属性)里面存在
数据属性get,set
访问器可以设置不让修改 读取删除遍历
但是不建议这样