原始值,表示单一的数据,如10,“abc”,true等。
-
ES设计了6种原始值:Undefined、Null、Boolean、Number、String、Symbol。
-
保存原始值的变量是按值访问,操作存储在变量内存中的实际值。
-
原始值是不可以改变的。
-
原始值不能有属性。
// 原始值 { let one1 = 'Tom'; console.log(one1,one1.age); //Tom undefined 它的属性值是不会被打印出来的 }
-
原始值可以包装类型
1、为了方便操作原始值,ES6提供了3种特殊的引用类型:Boolean、Number、String。
2、每当用到原始值的方法和属性时,后台会创建一个临时的包装类型对象,从而得以使用原始值的各种方法。// 原始值包装类型 { let s1 = "hello world"; let s2 = s1.substr(0,5); console.log(s1,s2); //hello world hello }
后台执行的步骤:
a) 创建一个包含原始值的String类型临时实例;
b) 调用该临时实例的特定方法;
c) 销毁该临时实例;typeof检查原始值可得出其具体类型,但检查对象都是object。
{ let value = '200'; console.log(typeof value); // string let number = Number(value); // Number()强制转换函数 console.log(typeof number); // number } { let value = '200'; let number = new Number(value); // new Number()构造函数 console.log(typeof number); // object } { let n1 = 100; let n2 = new Number(n1); console.log(typeof n2); // object 所有对象的类型都是object console.log(typeof n2.valueOf()); // number valueof()把包装对象的原始值取出来了。 console.log(n1 + n2); // 200 console.log(n1 + n2.valueOf()); // 200 }
引用值,表示有多个值(原始值或其他引用值)构成的对象。
-
ES不允许直接访问对象的内存空间。
-
实际操作对象时,访问的是保存对象的内存地址,即该对象的引用。
-
引用值(对象)可以随时添加、修改和删除其属性和方法。
// 引用值 { let person = new Object(); person.name = 'John'; person.showMe = function(){ console.log("Hi,I'm " + this.name); } person.showMe(); //Hi,I'm John }
原始值与引用值传递区别
-
本质上无区别,都是将一个变量中保存的信息赋值给另一个变量。
-
但对象变量中保存的是地址,所以它传递的是地址,改变其中一个变量的值,另一个变量会相继改变,因为它们都指向同一个地址。
{ let a = 100; let b = a; b++; console.log(a,b); //100 101 } { let ob = {value:100}; let oa = ob; oa.value = 200; console.log(ob.value,oa.value); //200 200 }
typeof( ) 与 instanceof( )
-
typeof检查原始值可得出其类型,但检查引用值就不能具体判断出其类型,因为都为object。
// typeof { let s = "Nick"; console.log(typeof s); //string let b = true; console.log(typeof b); //boolean let i = 22; console.log(typeof i); //number let u; console.log(typeof u); //undefined let n = null; console.log(typeof n); //object let obj = new Object(); console.log(typeof obj); //object let arr = new Array(); console.log(typeof arr); //object let a = [1, 2, 3]; console.log(typeof a); //object }
-
typeof对于引用值意义不大,通常采用instanceof操作符来判断引用值的类型。
// instanceof { let obj = new Object(); console.log(obj instanceof Object); //true let arr = new Array(); console.log(arr instanceof Array); //true let a = [1, 2, 3]; console.log(a instanceof Array); //true }