第四章 变量、作用域和内存问题(1.基本类型和引用类型)

  ·   JS高设(第三版)   ·   JavaScript     浏览量:

4.1基本类型和引用类型的问题

ES变量可能有基本类型值引用类型值两种类型值,基本类型就是当初的五种基本数据类型(Unfined,Null,Number,String,Boolean),引用类型就是Object

动态的属性

基本类型值和引用类型值的定义方法都类似:创建变量=>赋值,但是操作规则却大相径庭。
引用类型可以添加属性和方法,也可以改变和删除。如:

var person = new Object();
var personStr = "";
personStr.name = "尼古拉斯·赵四";
person.name = "尼古拉斯·赵四";
console.log(person.name); //控制台打印出“尼古拉斯·赵四"
console.log(personStr.name); //控制台打印出“Undefined"

1

复制变量值

  • 基本类型值,会直接将值复制一份过去,新的变量和老变量的任何操作不会互相影响
  • 引用类型值,也会复制一份过去,但这个副本只是一个指针,指向存储在堆中的唯一的一个对象,而两个变量其实是引用的同一个对象

5

书上拍的,复制基本类型值示意图
3

引用类型值示意图
4

传递参数

ES中所有的参数都是按值传递的,也就是将外部的值复制到函数内部参数中,他们的传递规则就是上面说到的变量复制规则

基本类型值例子
7
上图中,
定义了一个数值100,用count存放,
定义了一个函数对传入的参数进行加10操作,然后返回结果,用新的变量result接收,
最后将两个变量分别打印出来,
一个还是原来的值,一个比原来大10,
说明,复制后的数字和之前的变量已经没有联系,只是值相等,任何操作都不会影响到另一个

引用类型值例子
6

上图中,
定义了一个person对象,又定义了一个新的对象,并将person复制给新的psonNew,
定义了一个setName函数,对传入的对象添加name属性并赋值,
将person传入后,打印出person.name和psonNew.name同样为尼古拉斯·赵四,说明两个变量是指向同一个对象,
而函数内部将obj重新赋值为一个新的对象,并赋值史蒂芬·刘能,之后打印出来并非赵四
但是对之前传进来的参数却并无影响(函数外部打印依然为赵四),
说明,函数内部重新赋值之后的obj,已经不是传进来的哪个obj了,它相当于一个新的局部对象,在函数结束之后就陪葬了,
进而说明,在参数是按复制传递的,否则,最后两个打印出来都应该是史蒂芬·刘能

检测类型

  • 基本数据类型:typeof
  • 引用数据类型:instanceof

8

typeof对于对象或者null都会返回Object,
判断引用类型是不是Object永远返回true,因为规定所有引用类型都是Object的实例
而instanceof对基本数据类型会返回false



收起 >>
第四章 变量、作用域和内存问题(1.基本类型和引用类型)