基础数据类型:number、string、boolean、null、undefined、bigint、symbol
引用数据类型:object
Symbol
“Symbol” 值表示唯一的标识符。
使用场景:
- 防止覆盖:作为对象属性key值,保证属性不会冲突覆盖(尤其是三方库)
- 隐藏属性:不会被for…in、Object.keys循环(Reflect.ownKeys可以返回所有健) ```javascript const id1 = Symbol(‘id’); const id2 = Symbol(‘id’); id1 == id2; //false id1.toString(); //Symbol(id) id1.description; //1
const User = { name: ‘Joy’, [id1]: ‘This is a Symbol key’, }; User[id1]; //‘This is a Symbol key’
for (let key in User) { console.log(key); //name Symbol被忽略 }
<a name="Y0uns"></a>
## Array
由于JavaScript 数组的长度和元素类型都是非固定的 -> **数组在内存中也可以不连续**[https://zhuanlan.zhihu.com/p/371236424](https://zhuanlan.zhihu.com/p/371236424)
```javascript
Array.prototype.myReduce=function(callback,initValue){
//如果没有传入回调函数,则报错
if(!callback) throw new TypeError('undefined is not a function');
if (typeof callback !== 'function') {//传入的不是函数也报错
throw new TypeError(callback + " is not a function");
}
var res,n=0;//定义返回结果以及定义数组循环开始的下标
if(initValue){//如果有设置初始值
res = initValue;
}else{//如果没有初始值则把数组的第一个元素赋值给返回结果
if(this.length===0){
throw new TypeError('Reduce of empty array with no initial value');
}else{//将第一个数组元素作为初始值
res = this[0];
n=1;//那数组循环的下标就应该是1
}
}
for(var i=n,len=this.length;i<len;i++){
res = callback(res,this[i],i,this);//将函数的返回值赋值给返回结果
}
return res;//返回结果
}
Set
Map
Number
Bigint