对象
JS的简单基本类型
string,number,bollean,null,undefined,object
内置(函数)(在object基础上衍生)
String,Number,Boolean,Array,Object,Function,Date,RegExp,Error以上这些不要当作类型看待,当作内置的特殊函数来看待
Object和object的区别,typeof和instance of的区别
object是关键字,表示基本数据类型;Object是一个对象(构造函数)(Function类型的),可以被new运算符使用,构造对象实例
typeof 和 instanceof 这两个功能就是完全不一样的运算符。typeof 是为了检查数据类型,instanceof是为了看一个变量是否是某个对象的实例。
解释一下为什么有人说js处处皆对象
js当中数据无非就是那么集中,函数,字符串,数值类型,布尔类型
- 函数,基本所有的函数的构造函数都是Function,至于Function的构造函数是Function,函数既然是构造函数而来,本质上也是对象实例(构造函数是Function)
- 字符串, js中字符串本来算是基本数据类型,但是js会把字符串默认转换乘
String的实例,所以基本你可以看见的字符串本质上也是对象实例(构造函数是String) - 数值类型,同字符串一样(构造函数为Number)
- 布尔类型,同上(构造函数为Boolean)
对象实例的复制
- 深复制,因为对象本质上是变量(指针)的组织,深复制一般指对象的所有层级的属性和方法都要单独生成(不能引用原来的),深复制有可能碰到循环引用的情况,就比较尴尬
- 浅复制,最上一层复制,其余引用原来的
- 深复制
JSON.parse(JSON.stringify(obj))要求obj必须是JSON安全的
检查属性是否存在
举例,obj.a // undefined, 如何知道对象obj是否定义过属性a(a的值为undefined),还是没有定义过a
-
a in obj检查属性是否在对象及其原型链中 -
hasOwnProperty检查对象独有的属性,不检查原型,因为hasOwnProperty是原型函数,如果存在对象没有链接原型(Object.create(null)),obj.hasOwnProperty('a')会报错,所以建议使用Object.prototype.hasOwnProperty.call(obj, 'a')