基本数据类型:string、number、Boolean、undefined、null
复杂数据类型:Object
ES6新增数据类型:symbol、Map、Set
其中symbol是基本数据类型,每一个symbol都是一个全局唯一的字符串 // 在一个块级作用域里使用symbol,创造一个隐藏属性 { let a = Symbol(); let object = { name : 'okaychen', age : 3, [a] : '隐藏属性' } window.object = object } set是object里面的一种,set里无论原始值还是引用类型的值,重复的都只会保留一个Map可以允许任何类型作为对象的键,弥补了object只能使用字符串作为键(注意Map是ES6中的一种数据结构,区别于数组方法map)值类型:
占用空间固定,保存在栈中:当一个方法执行时,每个方法都会建立自己的内存栈,也就是所谓的函数作用域,基础变量的值是存储在栈中的,而引用类型变量存储在栈中的是指向堆中的数组或者对象的"地址"保存与复制的是值本身可以用**typeof**检测值类型基本数据类型是值类型引用类型:
占用空间不固定,保存在堆中:由于对象的创建成本比较大,在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用,这个运行时数据区就是堆内存保存与复制的是指向对象的一个指针使用**instanceof()**检测数据类型使用 new() 方法构造出的对象是引用型Array.from()
es6 语法
arr instanceof Array
instanceof 实际是通过原型链进行查找
实现原理:
每个构造函数都有显示原型prototype每个实例对象都有隐式原型__proto__实例对象的隐式原型指向构造函数的显示原型 A instanceof B function instanceof1(A,B){ B = B.prototype A = A.__proto__ while(true){ if(A === B){ return true } if(A === null){ return false } A = A.__proto__ } }数组也是一种数据类型,类比数据类型的学习我们可以从其特性,增删改查,其他方法,支持的运算符七个方面来学习,可以明显提高效率
数组的方法我们除了作用以外,我们还比较关心的就是该数组方法是否改变原数组,下面就按照这个规则来分类:
// 改变原数组的方法: pop() // 删除数组中的最后一个元素,把数组长度减 1,并且返回它删除的元素的值 push() // 该方法可把它的参数顺序添加到数组的尾部。它直接修改数组,返回后修改数组的长度 reverse() // 将数组元素倒序,改变原数组 unshift() // 可以向数组开头增加一个或多个元素,并返回新的长度 shift() // 数组的第一个元素从其中删除,并返回第一个元素的值,减少数组的长度 sort() // 在原数组上进行排序,不生成副本 splice(start,删除的个数,插入的元素) //可删除从index处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素 // 不改变原数组: concat() // 用于连接两个或多个数组,不改变原数组,返回一个新的数组 join() // 将数组中的所有元素都转化为字符串并拼接在一起,默认使用逗号,返回最终生成的字符串 map() // 对数组的每一项运行给定函数,返回每次函数调用的结果组成的数组,不改变原数组 indexof // 返回指定位置的元素值或字符串,通过搜索值与下标寻找 every() // 如果每一项都为true,则返回true some() // 某一项返回true,则返回true forEach() // 对数组的每一项运行给定函数,没有返回值因为会做隐式类型转换,所以会带来不必要的问题。所以除了null之外,其他一律使用===
if(obj.a == null){}相当于if(obj.a === null || obj.a === undefined) {}