原始值与引用值
六种原始值:undefined、null、string、boolean、number、symbol
symbol:表示独一无二的值,用于定义对象的唯一属性名。
保存原始值的变量按值访问的,因为我们操作的就是储存在变量种的实际值。
引用值是保存在内存里的对象,JS不允许访问内存位置,实际上操作的事该对象的引用;
保存引用值的变量是按引用访问的。
区别
1.动态属性
对于引用值而言可以随意添加、删除修改其属性和方法;
原始值无属性;
原始类型的初始化可以使用原始字面量形式,若使用new关键字定义,则JS会创建一个object实例,
但其行为类似原始值。
例:
let a = 'aa';
let b = new String('bb');
a.age = 11;
b.age = 12;
console.log(a.age) // undefined;
console.log(b.age) // 12
2.传递参数
ECMAScript中所有函数的参数都是按值传递的,对于原始值来说将值复制到一个局部变量这无可厚非,
相对于引用值而言就言兑难理解;
let a = new object();
function setA(obj){
obj.name = 'name11'
}
setA(a);
console.log(a.name)// name11
看样子是按引用传递的,但看下例;
let a = new object();
function setA(obj){
obj.name = 'aaa';
obj = new object();
obj.name = 'bbb';
}
setA(a);
console.log(a.name);//aaa
原理:
obj在函数内部被重写,他变成了一个指向本地对象的指针,而那个本地对象会在函数执行结束后销毁;
4.确定类型
typeOf操作符最适合用于判断一个变量是否是原始数据类型,更准确的说他是判断一个变量是否是字符串、数值、布尔值、undefined的最好方式;
let a = null;
console.log(a) //object
但是若是对象或空都会返回object;
ECMAScript引入instanceOf操作符
用法:
console.log(person instanceOf Array) // true or false
console.log(person instanceOf object) // true or false
console.log(person instanceOf RgeExp) // true or false
依据定义,所有引用值都是object的实例,所以用instanceOf检测引用值或object构成的函数都会返回true;