这里写目录标题
2.String字符串
所有用单引号、双引号、 反引号(ES6字符串模板)包起来的都是字符串
2.1把其他类型的值转化为字符串
1.[val].toStirng() 2.字符串拼接
1.[val].toStirng()
console.log(a.toString());// '12'
console.log((NaN).toString());// 'NaN'
console.log((null).toString());//报错
console.log((undefined).toString());//报错
console.log([].toString()); //''
console.log(({name:18}).toString());//[object Object]
普通对象.toString()的结果是[object Object]
2.字符串拼接
四则运算,除+之外都是数学计算(加法遇见字符串以后所有的运算都是字符串拼接),只有+可能存在字符串拼接。
console.log('10' + 10);//1010
console.log('10' - 10);//0
console.log('10px' - 10);//NaN
let b = 10 + null + true + [12] + undefined + 'hello' + null + [] + 10 + false;
/*
10+0(null)+1(true)=11
11+[12] 此时出现字符串,以后都是字符串拼接
1112+undefined+hello+null+10+false
*/
console.log(b);// '1112undefinedhellonull10false'\
let x =10+undefined+"1111";
console.log(x);//NaN1111
3.Boolean
只有两个值 true/false
3.1把其他值转化为boolean
只有0、NaN、’’(空字符串)、null、undefined这5个值会转化为False,其余都是true。
1.boolean([val]) 2.!/!! 3.条件判断
console.log(Boolean('0'));//true
等价于Boolean(1)
console.log(!!1) //true
if(1){
.......
}
if('3px'-3){
//'3px'-3 --> NaN--> false
.......
}
4.null // 5.undefined
- null (手动设置为null才是null)
- undefined (一般是默认机制,声明未赋值)
在数值加法中,null代表0,undefined代表NaN
一般最好用null作为初始值的空值,因为零不是空值,他在栈内存中有自己的存储空间。
let a = null;//null
let num ;//undefined
----------------------------------================================================================================================================================================================================================================================================================================================================================================================================
1.object对象数据类型-普通对象
任何一个对象都是由零到多个键值对组成的。而且属性名不能重复。
1. 获取属性值
1.对象.(点)属性
2.对象[属性]
属性名是数字或者字符串格式的,
如果属性名是数字不能使用 对象.(点)属性的方式来获取。
let per={
name:'zhangsan',
age:20,
sex:'男',
//属性名可以为数字
0:100
};
获取属性值
对象.(点)属性
对象[属性]
console.log(per.name); //zhangsan
console.log(per['name']); //zhangsan
console.log(per[name]); //undefined
输出0属性
console.log(per[0]); //100
console.log(per.0); //报错,SyntaxError
当前属性名不存在,默认的属性值是undefined。
console.log(per.home); //undefined
2. 设置属性值(增删改)
新增属性
per.high = 100;
console.log(per.high); //100
console.log(per['high']); //100
修改属性值
per.name=lisi;
删除(真:删除属性,假:属性值为null)
真:delete per.high;/delete per['high']
假:per.name=null;
2.数组-特殊的对象数据类型
数组是特殊的对象
1. 我们中括号中设置的是属性值,他的属性名是默认生成的数字,从零开始递增arr[0],而且数字代表每一项的位置,我们把其称为索引
索引:从0开始,连续递增。代表每一项位置的数字属性名。
2.天生默认的属性名length,存储数组的长度。
let arr=[12,'haha',true,77];
console.log(arr);
console.log(arr.length); //4
console.log(arr['length']); //4
获取数组的最后一项
console.log(arr[arr.length-1]);
向数组末尾新增内容
arr[arr.length]=100;
面试题:堆栈内存(stack&&heap)
赋值三步(基本数据类型&&引用数据类型)
1.创建变量
2.创建值
3.变量指向值(关联)
let a = 12;
let b = a;
b = 13;
console.log(a);//12
let n = { name: '你好' };
let m = n;
m.name='呵呵';
console.log(n.name); //呵呵
栈(stack,基本数据类型)
let a = 12;
let b = a;
b = 13;
console.log(a);//12
浏览器想要执行JS代码:
1.从电脑内存中分配出一块内存(栈内存=>Stack ),用来执行代码
栈内存:从内存条中分配的内存,来让代码一行行执行
2分配一个主线程用来自上而下执行JS代码(浏览器会开辟一个主线程的)
创建一个变量分为三步
let a = 12;
1.创建变量a,放到当前栈内存变量存储区域中
2.创建一个值12,把它存储到当前栈内存值区域中
(简单的基本类型值是这样存储的,复杂的引用类型值不是这样做的,)
3.=为赋值,其实赋值是让变量和值相互关联的过程
let b=a;
1.创建变量a,放到当前栈内存变量存储区域中
2.
3.=为赋值,其实让b也指向12
b=13;
1.
2.创建一个值13,把它存储到当前栈内存值区域中
3.=为赋值,其实让b也指向13
堆(heap,引用数据类型)
let n = { name: '你好' };
let m = n;
m.name='呵呵';
console.log(n.name); //呵呵
let n = { name: ‘你好’ };
复杂值(引用类型值)的存储,又分成了三个步骤:
1.在内存中分配出一块新内存,用来存储引用类型值(堆内存=>heap ) =>内存有一个16进制地址
2.把对象中的键值对(属性名:属性值)依次存储到堆内存中
3.把堆内存地址和变量关联起来(把堆内存的地址存到值存储空间)
let m = n;
1.创建变量m,放到当前变量存储空间中
2.
3.=为赋值,让m也指向变量存储空间
m.name=‘呵呵’;
1.
2.将m指向的地址空间的值改为‘呵呵’
3.=为赋值,让m也指向变量存储空间
基本类型&&引用类型
基本类型:直接存在栈内存的值存储空间中,按值操作(直接操作的是值),所以也叫作值类型
引用类型;存在堆内存的存储空间中,操作的是堆内存的地址(按引用地;址操作的)
练习题
let n = [10, 20]; //n=[10, 20]
let m = n; //m指向n的地址 m=[10, 20]
let x = m; // x指向m的地址 x=[10, 20]
m[0] = 100; // m=[100,20]=x=n
x = [30, 40]; //开辟一个新的堆内存x,指向这个内存区域,此时X与n,m没有关系
x[0] = 200; //
m = x; // m指向x的地址,此时m和n无关,
m[1] = 300;
n[2] = 400; //对象中没有属性名,则新增一个
console.log(n, m, x);// [100, 20, 400] [200, 300] [200, 300]