-数值范围:
由于内存的限制,ECMAScript不能保存世界上所有的数值。
ECMAScript能表示的最小数值保存在Number.MIN_VALUE中
能表示的最大的数值保存在Number.MAX_VALUE中。
如果某次计算的结果超过了JavaScript数值范围,将会返回Infinity(正无穷)或者-Infinity(负无穷)
var a = 9/0; // Infinity Number.MIN_VALUE 5e-324 Number.MAX_VALUE 1.7976931348623157e+308
-数值范围检测:
使用 isFinite()函数可以判断参数是否在最大值和最小值之间,如果在,返回true
var a = isFinite(9/0); // false
-布尔 Boolean
布尔(逻辑)只能有两个值:true 或 false。
var x=true; var y=false;
-Null
该类型的取值只有一个,即null。null可以表示一个空对象的指针。
var a = null;
如果一个变量准备将来保存对象,可以将该变量初始化null而不是其他,这样可以通过检查null值就可以知道
相应的变量是否已经保存了一个对象的引用。
if(car !== null ){ //car对象执行某些操作}
-Undefined
Undefined 这个值表示变量不含有值。未定义的。
var a; console.log(a,typeof a);//undefined 'undefined' var a = undefined; console.log(a,typeof a);//undefined 'undefined'
-undefined 与null关系
undefined继承null,所以undefined == null结果为true,但是null表示空对象,undefined表示未定义;
null与undefined用途不同,null可以用来表示一个空对象,但是没有必要把一个变量的值显式设置为undefined。
//null vs undefined console.log(undefined == null); //true //undefined派生自null console.log(undefined === null);//false if(null == undefined){console.log('相等的')} if(null === undefined){console.log('完全相等')} // ==, 等同 的意思, 两边值类型不同的时候,要先进行类型转换为同一类型后,再比较值是否相等。 // ===,恒等 的意思, 不做类型转换,类型不同的结果一定不等。 // "=="表示只要值相等即可为真,而"==="则要求不仅值相等,而且也要求类型相同。 // 建议:尽量使用严格运算符 ===。因为"=="不严谨,可能会带来一些违反直觉的后果。
5.2 引用数据类型
在js中除了以上基本数据类型,其他所有类型都可以归结为引用数据类型。
-对象Object
对象是模拟现实生活的对象,对象由键值对组成,通过使用大括号将所有键值对括起来。
var dog = { name: 'momo', age: 4 }
可以通过点语法获取对象的属性
dog.name; //momo dog.age; //age
-数组Array
数组是一个特殊的对象,包含了多个值,值与值之间使用逗号分隔开,所有的值通过中括号括起来。
var classArr = ['web2104','web2105','web2106'] var studentArr = ['zhangsan','lisi','wangwu']
可以通过数组下标获取对应的数据
classArr[0]; // web2104
-函数Function
函数是代码执行单元,用于实现某些特殊的功能。
function sum(a, b) { return a + b; } //执行函数 sum(1,2); // 3
5.3 -基本数据类型和引用数据类型在内存中如何存储
-基本数据类型
基本数据类型变量都维护在栈区,基本数据类型的值保存在栈区。
例如:
var a = 123; b = a; a = 456;
1.var a = 123; b = a;基本数据类型是在栈内存中存储的,如下图,b = a的时候,b直接把a的值存进去
2.a = 456; 会把a的值改为456,但是对b没有任何影响,所以最后会输出a = 456;b = 123;
结论:基本数据类型的值存在栈,值与值之间独立存在,修改一个值不会影响其他变量
-引用数据类型
引用数据类型的引用地址保存在栈区,值保存在堆区。
例如:
var obj = { name: 'zhangsan' } var obj1 = obj; //将对象obj赋值给对象obj1 console.log(obj.name); //zhangsan console.log(obj1.name); //zhangsan // 修改obj的name // 当obj属性name变为"lisi"时,obj1属性name也变为"lisi" obj.name = 'lisi'; console.log(obj.name); //lisi console.log(obj1.name); //lisi
-结论:当栈存放引用类型时,值为对象的地址,obj与obj1指向同一个地址,所以当obj的name值变为“lisi”时,obj1也会发生变化
5.4 深拷贝与浅拷贝
主要针对于引用数据类型参数说的,浅拷贝表示仅拷贝引用地址,深拷贝表示对于对象的克隆。
-实现浅拷贝的方法
递归的方式实现浅拷贝
Object.assign()实现浅拷贝
展开运算符…实现浅拷贝
Array.prototype.slice()实现浅拷贝
Array.prototype.contact()实现浅拷贝
-实现深拷贝的方法
通过json对象实现深拷贝(JSON.stringify,JSON.parse)
lodash函数库实现深拷贝
递归的方式实现深拷贝
等等
具体实现深浅拷贝的方法我之前有总结过
JS 浅拷贝和深拷贝
6. 类型判断
在实际开发中,我们经常要判断一个变量的数据类型。
typeof
使用typeof判断数据类型
返回该变量名所指向数据的类型
语法: typeof 变量名
返回值如下:
“undefined” 未定义
“boolean” 布尔类型
“string” 字符串
“number” 数值
“object” 对象或者null或者数组
“function” 函数
通过typeof可以判断一个变量的类型
var a = 3; typeof a; // number if((typeof a) == "string"){} if(a == "null"){} if(a == null){}
isNaN
判断是否是 不是一个数字
var a = 10/'a'; isNaN(a); //true
isFinite
判断是否是一个有效值
var a = 10/0 ; isFinite(a) // false