最近在重读红宝书。参考红宝书、MDN和一些网上的资料在整理基础知识,就随手总结下来。这是第一篇--js变量
数据类型
基本数据类型
Undefined
-
已声明未初始化的变量
- 变量的类型是undefined
- 变量的值默认为undefined
-
未声明的变量
- 变量的类型是undefined
- 变量没有值,使用时报错
- 未声明的变量只能执行typeof操作符,其他操作都会报错
-
e.g.
var a; var b = undefined; alert(a) //undefined alert(b) //undefined alert(c) //报错 alert(typeof a) //undefined alert(typeof b) //undefined alert(typeof c) //undefined
Null
- null是一个空对象指针
alert(typeof null) //object
- null的作用:当需要指定一个变量为对象而该对象暂时没有值时可以先定义为空指针,以便通过检查该对象是否为null来确定该对象是否有值
Boolean
- true/false区分大小写
- 其他类型转换为boolean类型:Boolean(变量名)
数据类型 | true | false |
---|---|---|
string | 非空 | 空 |
number | 非0 | 0和NaN |
Object | 非null | null |
undefined | - | 全部 |
undefined | - | 全部 |
Number
-
进制
- 十进制
- 八进制 +0 严格模式下无效
- 十六进制 +0x
-
浮点数
- 浮点数的表示
(1) 整数部分.小数部分
(2) e表示法 - 浮点数转整数:
(1) .后无内容
(2) 本身就是整数,如1.0 - 浮点数的误差
0.1+0.2不等于0.3
- 浮点数的表示
-
NaN
- 作用:当number类型相关数据运算发生错误时
- NaN与任何值不想等,包括NaN
- 函数
isNaN(变量)
:判断该变量是不是NaN
总结:undefined、null、NaN
name undefined null NaN typeof undefined object number 表示 任意声明未赋值的变量 对象为空 number发生错误 赋值 无需手动赋值 需要手动赋值 数据类型 数据类型 Number的一个值 -
其他类型转换成Number
- null:0
- undefined:NaN
- boolean:0/1
- string:
函数 Number() parseInt() parseFloat() 转换类型 任意 整型 浮点型 转换空字符串 0 NaN NaN 前面数字后面字符
如"123qwe"NaN 转换到最后一个数字
123转换到最后一个数字
123前面字符+后面任意 NaN NaN NaN 前面0+后面其他数字 0后的数字 0后的数字 0后的数字 带一个小数点 转换成浮点型 只转小数点前部分 转换成浮点型 十六进制
0x前缀转16进制 转16进制 不转,0 八进制
0前缀忽略0 不一定 忽略0 参数 一个 (两个变量,进制)/一个 一个 注:parseInt()可以传两个参数,第一个是要转换的值,第二个指定进制,最好传两个参数,手动指定进制
-
Number的范围
String
字符串的值不可变
并不是说变量中保存了字符串,该变量就不能变了而是字符串不能做改变
如果要增加某字符串的内容,不是直接在原来的字符串上修改,而是改成新字符串后销毁原来的字符串
Object类型
-
数据和功能的集合
-
可以动态添加/删除/修改对象里的属性
var o = new Object() // 定义一个object o.name = 'name1' // 添加属性 o.name = 'name2' // 修改属性值 delete o.name // 删除属性
-
(object的内容很多,整理在后面的笔记里)
数据类型检测
typeof操作符
- 语法
typeof 变量
- 返回值:undefined,boolean,string,number,object,function
- null:返回object
- function:有的浏览器返回function有的返回object;因为js中函数是对象,而不是数据类型
- 可检测所有类型
- object类型检测不准确,只能知道是object类型,不能知道是object的什么类型
instanceof操作符
- 语法
变量 instanceof 某个引用类型
- 作用:准确检测某个object类型的变量是什么类型的object
- 不能用于基本类型检测,检测基本类型都会返回false
- 检测的object类型:js的内置对象(Array,RegExp),自定义类型
```
var a = null
a instanceof Object // false
```
变量的存储
基本类型
存储在栈内存
引用类型
- 引用类型的值:堆内存
- 变量标识符(存堆内存的地址):栈内存
变量的复制
基本类型
将原来的变量拷贝一个副本到新的变量,两个变量改变值互不影响
对象类型
浅拷贝
复制变量标识符到新的变量,两个变量指向同一个堆内存;改变其中一个,另一个会受影响
实现
直接赋值var b = a
深拷贝
在堆中重新分配内存,新的变量和原来的互不影响
-
JSON.stringify()
-
JSON.parse()
-
遍历对象中的每一个值到新的对象中
-
(数组深拷贝)concat() concat()的作用:连接两个数组并返回新数组
arr1.concat(arr2)
var arr = [1,2,3] var arrNew = arr.concat()
-
(数组深拷贝)slice()
slice()的作用:截取数组的一部分并返回新数组
arr1.slice(start,end) //截取数组从slice到end的部分(包括start,不包括end)
深拷贝:``` var arr = [1,2,3] var arrNew = arr.slice(0) ```