一、基本类型和引用类型的值
-
动态的属性
创建对象:(常用的两种方式)
1》构造函数形式创建: new Object2》字面量形式创建:{}
构造函数形式的动态属性:
和数组类似:
因此,添加属性如下:
小结:
对象添加属性的语法:对象.属性名称=值
对象添加方法的语法:对象.方法名称=函数(function(){})
- 复制变量值(两种情况)
【补充】javascript存储
分为两个内容:
1》栈内存(存放基本类型)
2》堆内存(存放引用类型)
1》引用类型:如果是赋值的状态,引用类型是共用一个对象则互相影响
首先,创建一个对象
关于上面的内容是怎么存储的呢?
说明:首先因为它是引用类型,肯定存放在堆内存,
进一步:添加一个变量
那么会弹出两个“张三”的弹窗
原因在于:obj和ooo都指向new Object,那么它们用的共同的一个对象,因此都可以打印出来。
再进一步:将userName的属性值(“张三”)改为:“李四”
因此,这里同样会弹出两个相同(“李四”)的弹窗
2》基本类型:如果是赋值状态,相当于是复制了一个副本(克隆版) 2个变量都是单独的则互相不影响。
首先,赋值变量
这里的str是属于基本类型的,肯定属于栈类型
说明:首先str的值为123,然后将str赋值给了s(var s = str),相当于复制了一个str副本,再将复制后的版本给了s,因此str和s没有关联,并不是用的同一个对象。因此如果改变了s的值,那么再打印s和str的结果是不一样的。
- 传递参数
函数(参数) : 参数===》只能传递值
因为对象会互相影响,如果传入的fn(obj),那么形参o就是obj,对象. userName赋值给“张三”,那么证明如果传入的是引用类型(而不是值),则用的是一个地址,那么就会打印出“李四”
但是,打印出来的却是“张三1111111”(为了区分,拼接一个11111)
原因在于: o = new Object() 这是一个新的对象赋给了o,而新的对象又打印出来“李四”,这里的o和传入fn(o)的o不等同,因此不能打印出“李四”
- 检测类型(instanceof)
无法区分数组和字符串的类型(都是object)
因此:可以采用 instanceof
语法:
instanceof ===》返回布尔值
如果匹配返回true
如果不匹配返回false
正确写法:
也可作一个判断: