- 引用类型可以有动态的属性,基本类型没有
var person = new Object();
person.name = "Toby";
console.log("person name is ", person.name);
var name = "Toby";
name.age = 27;
console.log("person age is ", name.age);
输出结果:
从输出上我们就能发现,我们为引用类型的变量 person 添加了 name 属性,如果对象不被销毁或者这个属性不被删除,则这个属性将一直存在。但是,我们不能给基本类型的值添加属性,尽管这不会导致任何错误。
- 我们复制引用类型时,实际上是复制了一个指针
var num1 = 5;
var num2 = num1;
console.log("num1: ", num1);
console.log("num2: ", num2);
num1 = 6;
console.log("num1: ", num1);
console.log("num2: ", num2);
num2 = 7;
console.log("num1: ", num1);
console.log("num2: ", num2);
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Toby";
console.log("obj1: ", obj1.name);
console.log("obj2: ", obj2.name);
obj1.name = "Tim";
console.log("obj1: ", obj1.name);
console.log("obj2: ", obj2.name);
obj2.name = "Neo";
console.log("obj1: ", obj1.name);
console.log("obj2: ", obj2.name);
上面的实例的输出结果:
基本类型复制之后是完全独立的,它们可以继续参与任何操作而不会相互影响。
引用类型复制操作结束之后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一个变量。
- ECMAScript 中所有的函数的参数都是按值传递的。
function addTen(num) {
return num + 10;
}
function setName(obj) {
obj.name = "Toby";
obj = new Object(); // 新的赋值不会影响外部的引用变量
obj.name = "Neo"; // 说明内部的 obj 只是一个局部的副本
}
Component.onCompleted: {
var num1 = 5;
var num2 = addTen(num1);
console.log("num1: ", num1);
console.log("num2: ", num2);
var obj1 = new Object();
setName(obj1);
console.log("obj1: ", obj1.name);
}
通过上面的实例,我们完全可以把 ECMAScript 函数的参数想象成局部变量。这一点问题都没有。
- 在检测引用类型的值时,typeof 操作符的作用不大,需要使用 instanceof 操作符
var s = "Neo";
var b = true;
var i = 22;
var u;
var n = null;
var o = new Object();
console.log(typeof s);
console.log(typeof b);
console.log(typeof i);
console.log(typeof u);
console.log(typeof n);
console.log(typeof o);
console.log(o instanceof Object);
console.log(n instanceof Object);
console.log(o instanceof Array);
输出结果: