JavaScript变量、作用域、内存——动态属性_复制变量值_传递参数_检测类型

一、基本类型和引用类型的值

  1. 动态的属性
    创建对象:(常用的两种方式)
    1》构造函数形式创建: new Object

    2》字面量形式创建:{}

构造函数形式的动态属性:
和数组类似:

因此,添加属性如下:

小结:
对象添加属性的语法:对象.属性名称=值
对象添加方法的语法:对象.方法名称=函数(function(){})

  1. 复制变量值(两种情况)

【补充】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的结果是不一样的。

  1. 传递参数
    函数(参数) : 参数===》只能传递值

因为对象会互相影响,如果传入的fn(obj),那么形参o就是obj,对象. userName赋值给“张三”,那么证明如果传入的是引用类型(而不是值),则用的是一个地址,那么就会打印出“李四”

但是,打印出来的却是“张三1111111”(为了区分,拼接一个11111)

原因在于: o = new Object() 这是一个新的对象赋给了o,而新的对象又打印出来“李四”,这里的o和传入fn(o)的o不等同,因此不能打印出“李四”

  1. 检测类型(instanceof)
    无法区分数组和字符串的类型(都是object)

因此:可以采用 instanceof

语法:
instanceof ===》返回布尔值
如果匹配返回true
如果不匹配返回false
正确写法:

也可作一个判断:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值