
注意:
1.返回值为字符串类型.
2.和原始类型比,还差了个null,这个比较特殊,使用typeof(null),返回的是"object",我们将null理解成是object的占位符.
复杂值
复杂值可以由很多不同类型的javascript对象组成。复杂对象其在内存中的大小是未知的,因为复杂对象可以包含任何值,而不是一个特定的已知值
存储方式
栈存储
因为原始值占据空间固定,是简单的数据段,为了便于提升变量查询速度,将其存储在栈(stack)中
堆存储
由于复杂值的大小会改变,所以不能将其存放在栈中,否则会降低变量查询速度,因此其存储在堆(heap)中,存储在变量处的值是一个指针,指向存储对象的内存处

访问方式
按值访问
原始值是作为不可细化的值进行存储和操作的,引用它们会转移其值
var myString = "foo";var myStringCopy = myString;var myString = null;console.log(myString,myStringCopy);//null,"foo"引用访问
var myObject = {};var copyOfMyObject = myObject;//没有复制值,而是复制了引用myObject.foo = "bar";//操作myObject中的值//现在如果输出myObject和copyOfMyObject,则都会输出foo属性,因为它们引用的是同一个对象console.log(myObject,copyOfMyObject);//Object{foo="bar"} 比较方式var price1 = 10;var price2 = 10;var price3 = new Number("10");var price4 = price3;console.log(price1 == price2);//trueconsole.log(price1 == price3);//falseprice4 = 10;console.log(price4 == price3);//trueconsole.log(price4 === price3);//false var objectFoo = {same:"same"};var objectBar = {same:"same"};console.log(objectFoo == objectBar);//falsevar objectA = {foo: "bar"};var objectB = objectA;console.log(objectA == objectB);//true 动态属性var str = "test";str.property = true;console.log(str.property);//undefined var objA = {property: "value"};var pointer1 = objA;var pointer2 = pointer1;objA.property = null;console.log(objA.property,pointer1.property,pointer2.property);//null null null 包装类型