1.基本数据类型:Number,String,Boolean,Undefined,Null,Symbol
2.复杂数据类型:Object,Array,Function,Map,Set
可以判断Number,String,Boolean,Undefined,Function,Symbol但是Null,Object,Array,Map,Set这三种类型都会判断为Object
obj instanceof Object:判断Object是否在obj的调用链上
obj instanceof Object;// true arr instanceof Array;// true map instanceof Map //true set instanceof Set //true null instanceof Object;// false undefined instanceof Object;// false symbol instanceof Symbol //false
instanceof不能区别undefined和null,而且对于基本类型如果不是用new声明的则也测试不出来,对于是使用new声明的类型,它还可以检测出多层继承关系
- console.log(Object.prototype.toString.call(bool));//[object Boolean]
- console.log(Object.prototype.toString.call(num));//[object Number]
- console.log(Object.prototype.toString.call(str));//[object String]
- console.log(Object.prototype.toString.call(und));//[object Undefined]
- console.log(Object.prototype.toString.call(nul));//[object Null]
- console.log(Object.prototype.toString.call(arr));//[object Array]
- console.log(Object.prototype.toString.call(obj));//[object Object]
- console.log(Object.prototype.toString.call(fun));//[object Function]
- console.log(Object.prototype.toString.call(s1)); //[object Symbol]
- console.log(Object.prototype.toString.call(map));//[object Map]
- console.log(Object.prototype.toString.call(set)); //[object Set]
-
- function Person(){}
- function Student(){}
- Student.prototype = new Person()
- var haoxl = new Student()
- console.log(Object.prototype.toString.call(haoxl));//[object Object]
将obj1和obj2中的可枚举属性拷贝到第一个目标对象中,并且将这个对象返回
let obj = Object.assign({},obj1,obj2);
将alpha和numeric合并为一个新数组并返回
- var alpha = ['a', 'b', 'c'];
- var numeric = [1, 2, 3];
-
- alpha.concat(numeric);
- // result in ['a', 'b', 'c', 1, 2, 3]
slice() 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。
- const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];
-
- console.log(animals.slice(2));
- // expected output: Array ["camel", "duck", "elephant"]
-
- console.log(animals.slice(2, 4));
- // expected output: Array ["camel", "duck"]
封装一个函数来实现:
- function isObject(value) {
- const valueType = typeof value
- return (value !== null) && (valueType === "object")
- }
-
-
- function deepClone(originValue, map = new WeakMap()) {
- // 判断是否是一个Set类型
- if (originValue instanceof Set) {
- return new Set([...originValue])
- }
-
- // 判断是否是一个Map类型
- if (originValue instanceof Map) {
- return new Map([...originValue])
- }
-
- // 判断如果是Symbol的value, 那么创建一个新的Symbol
- if (typeof originValue === "symbol") {
- return Symbol(originValue.description)
- }
-
- // 判断如果是函数类型, 那么直接使用同一个函数
- if (typeof originValue === "function") {
- return originValue
- }
-
- // 判断传入的originValue是否是一个对象类型
- if (!isObject(originValue)) {
- return originValue
- }
- if (map.has(originValue)) {
- return map.get(originValue)
- }
-
- // 判断传入的对象是数组, 还是对象
- const newObject = Array.isArray(originValue) ? []: {}
- map.set(originValue, newObject)
- for (const key in originValue) {
- newObject[key] = deepClone(originValue[key], map)
- }
-
- // 对Symbol的key进行特殊的处理
- const symbolKeys = Object.getOwnPropertySymbols(originValue)
- for (const sKey of symbolKeys) {
- // const newSKey = Symbol(sKey.description)
- newObject[sKey] = deepClone(originValue[sKey], map)
- }
-
- return newObject
- }