-Javascript的简单类型包括
1.数字 number
js不分整型与浮点型
两个浮点数相加,精度不够
2.字符串 string
字符串与其他相加还是字符串
3.布尔值 boolean
4.null
5.undefined
以上都是简单数据类型
其他都是对象 Function Array
研究: 前五个貌似是对象,因为它们拥有方法,但是他们是不可变的?
简单数据类型,不是对象?
-对象字面量
.用于创建对象
.一对花括号中的名/值对
.合法的且不是保留字的属性名(是包括空字符串在内的所有字符串)可不用引号
.可出现在任何允许表达式出现的地方,可嵌套
-检索
.方法:. 和[ ]
.检索不存在的元素返回undefinded,检索undefinded会异常但是可用&&符号避免(为什么?)
.可用||添加默认值(默认值即是调用对象元素时,元素为undefined或为空字符串时的值)
-更新
赋值运算更新,若元素不存在,则添加
-引用,和c的语法一样
-原型
.和c++的继承类似,Object.beget方法可创建以某对象为原型的对象
.原型连接只在检索元素有效,原型的元素对所有的元素有效
-反射(反射机制指的是程序在运行时能够获取自身的信息。例如一个对象能够在运行时知道自己有哪些方法和属性。)
.hasOwnProperty方法不会检查原型链
.用typeof方法排除函数
-delete删除对象的元素,不会触及原型链
-将所有的对象整理在一个名称空间下,减少全局污染
新增:
解决问题:基本类型与对象的区别
1.基本对象类型不可变?
解决:要理解这个,首先需要引入堆和栈的概念
堆和栈
程序运行的时候,需要内存空间存放数据。一般来说,系统会划分出两种不同的内存空间:一种叫做堆(heap),另一种叫做栈(stack)
堆(heap)是没有结构的,数据可以任意存放,它是用于存放复杂数据类型(引用类型)的,例如数组对象、object对象等。
栈(stack)是有结构的,每个区块按照一定次序存放(后进先出),栈中主要存放的是基本类型的变量的值以及指向堆中的数组或者对象的地址,存在栈中的数据大小与生存期必须是确定的。除此之外,还可以明确知道每个区块的大小,因此,stack的寻址速度要快于heap
另外,栈有一个很重要的特殊性,就是存在栈中的数据可以共享
那么为什么基本数据类型是不可变的呢,当我们创建一个基本数据类型变量的时候,栈中就会存储这个变量的值,当你去改变他的时候,即你给他赋一个新的值的时候,他的值好像确实变了,但是实际上,只是这个变量指向的地址变了
举个例子,var a=1,b=1;此时栈中就会存下1,a和b都是指向1这个地址,当你去a=2后,保存1的这个地址并没有改变,只是又开辟了一个新的地址保存2,让a指向了2,b的值并不会变,这就是基本数据类型不可变的原理
而对象则相反,对象的数据储存在堆中,改变其中的值即使改变地址中的数据,因为堆中的数据不是共享的
2.基本数据类型可以调用方法?
我们在声明基本类型变量的时候,确实只有一个基本数据类型
但是当我们调用接口的时候,js会帮我们自动生成一个temp对象,然后用temp调用接口,操作完毕后,temp就会被删掉
这是js的一种简化操作