一、内存的栈和堆
- 内存:计算机的运行空间
- 栈:保存的是类似于变量名(地址)
- 空间小,稳定,不可被修改
- 先进后出
- 堆:保存的是值
- 空间大,可被修改
- 先进先出
- 栈和堆的关系:一对一,多对一,没有一对多
二、数据类型的分类
- 值传递(基本数据)
- 内存中,值就是地址,地址就是值
- 拷贝的是值
- 引用传递(负责数据)
- 内存中,地址就是地址,值就是值
- 拷贝的是地址
三、引用传递数据的拷贝方式
- 浅拷贝:拷贝的是地址,修改新数据,会影响老数据
- 深拷贝:拷贝的是值
- 先创建一个新的空对象
- 利用for-in遍历老对象,逐个拷贝老对象的属性到新对象
- 基本类型(值传递的数据), 复制的就是值
- 复杂类型(引用类型,引用传递的数据),复制的是地址,同一个地址,指向同一个值
四、数据类型
- 基本分类
- 字符(string):只要被引号包裹的数据:单引号’’,双引号"",反引号:``
- 数值(number):0123456789,NaN
- 布尔(boolean):true,false
- 对象(object):{键:值,键:值}
- 函数(function):function(){}
- undefined(undefined):undefined,定义了,但未赋值
- null(object):空,空指向,只有一个指针,但是没有指向任何数据,会被typeof检测出object
- 数组(object):[数据,数据],会被typeof检测出object
- symbol(symbol):类字符的数据 ***
- 根据在内存中的存储形式分:
- 基本类型:string,number,boolean,undefined,symbol,null
- 复杂类型:object,function,array
五、数据类型的转换
-
隐式类型转换 ——不主动转,运算过程中,自动转
- 转换时机:运算过程中转换,没有影响原数据
- 场景:某些运算符两边
- 规则:
- 字符转数值
- 严格转换:整体转,有一个不能转,就得到NaN
- “123”
- “123a”
- 非严格转换:从左向右检测,能转则转,不能转停止,第一位就不能转,直接NaN
- “123”
- “123a”
- “123a456”
- “a123”
- 严格转换:整体转,有一个不能转,就得到NaN
- 布尔转数值
- true为1
- false为0
- 其他转布尔
- 非空字符,为true
- “”,’’,``
- 非0为true
- 对象都是true,{},[]
- 函数都是true,function(){}
- undefined和null和NaN都是false
- 非空字符,为true
- 字符转数值
-
显示(强制)类型转换 —— 主动转
- parseInt()
//parseInt() - 非严格转换 整数 var str = "123"; var str1 = "123a"; var str2 = "123a456"; var str3 = "a123a456"; var str4 = "123.456"; var res = parseInt(str); var res1 = parseInt(str1); var res2 = parseInt(str2); var res3 = parseInt(str3); var res4 = parseInt(str4); console.log(res);//123 console.log(str);//123 console.log(res1);//123 console.log(str1);//123a console.log(res2);//123 console.log(str2);//123a456 console.log(res3);//NaN console.log(str3);//a123a456 console.log(res4);//123 console.log(str4);//123.456
- parseFloat()
//parseFloat() - 非严格转换 可以识别小数点 var str = "123"; var str1 = "123a"; var str2 = "123a456"; var str3 = "a123a456"; var str4 = "123.456"; var res = parseFloat(str); var res1 = parseFloat(str1); var res2 = parseFloat(str2); var res3 = parseFloat(str3); var res4 = parseFloat(str4); console.log(res); //123 console.log(str); //123 console.log(res1); //123 console.log(str1); //123a console.log(res2); //123 console.log(str2); //123a456 console.log(res3); //NaN console.log(str3); //a123a456 console.log(res4); //123.456 console.log(str4); //123.456
- Number()
// Number() - 严格转换,可以识别小数点 var str = "123"; var str1 = "123a"; var str2 = "123a456"; var str3 = "a123a456"; var str4 = "123.456"; var res = Number(str); var res1 = Number(str1); var res2 = Number(str2); var res3 = Number(str3); var res4 = Number(str4); console.log(res); //123 console.log(str); //123 console.log(res1); //NaN console.log(str1); //123a console.log(res2); //NaN console.log(str2); //123a456 console.log(res3); //NaN console.log(str3); //a123a456 console.log(res4); //123.456 console.log(str4); //123.456
- Math.round()
//Math.round() - 严格转换,可以是被小数点,但是会取整,四舍五入 var str = "123"; var str1 = "123a"; var str2 = "123a456"; var str3 = "123.567"; var str4 = "123.456"; var res = Math.round(str); var res1 = Math.round(str1); var res2 = Math.round(str2); var res3 = Math.round(str3); var res4 = Math.round(str4); console.log(res); //123 console.log(str); //123 console.log(res1); //NaN console.log(str1); //123a console.log(res2); //NaN console.log(str2); //123a456 console.log(res3); //124 console.log(str3); //123.567 console.log(res4); //123 console.log(str4); //123.456
- xxx.toString()
//xxx.toString()数值型数据转字符型数据 var num = 123.456; var res = num.toString(); console.log(res);//"123.456" console.log(num);//123.456
- xxx.toFixed()
// xxx.toFixed()数值型数据转字符型数据,可设置保留多少位的小数 var num = 123.456; var res = num.toFixed(2); console.log(res);//123.46 console.log(num);//123.456
- Boolean()
//Boolean()布尔类型的转换 console.log(Boolean(" ")); // true console.log(Boolean("false")); // true console.log(Boolean("")); // false console.log(Boolean("0")); // true console.log(Boolean(0)); // false console.log(Boolean(-1)); // true console.log(Boolean(1)); // true console.log(Boolean({})); // true console.log(Boolean([])); // true console.log(Boolean(function() {})); // true console.log(Boolean(undefined)); // false console.log(Boolean(null)); // false console.log(Boolean(NaN)); // false
六、JS中的一些关键字
- 关键字
break----delete----function----return----typeof----case----do
if----switch----var----catch----else----in----this---- finally
void---- continue----false----instanceof----throw----while----debugger
new----true----with----default----for----null----try