十三、number数据类型的详细解读
3、parseInt()
也是把其他数据类型的值转换为number,和Number方法在处理字符串的时候有所区别
Number('12px') // NaN
parseInt('12px') // 12
parseInt('12px13') // 12。提取规则:从左到右依次查找有效数字字符,直到遇见非有效数字字符为止(不管后面是否还有,都不找了),把找到的转换为数字
parseInt('px12') // NaN
parseInt('12.5px') // 12。 parseInt识别不了小数点。 只有parseFloat才能识别小数点。
4、parseFloat()
在parseInt的基础上可以识别小数点
parseInt('12.5px') // 12
parseFloat('12.5px') // 12.5
parseFloat('width:12.5px') // NaN
课后思考:parseInt常用的只需要传递一个值做参数即可,但是它支持多个参数,回去后扩展其他参数的意思。
比如:parseInt(‘12.5’, 10)
十四、null 和 undefined的区别
null的意思是:空,没有
undefined的意思是:未定义,没有
“”:空字符串,没有
0:也可以理解为没有
1、空字符串和null的区别
空字符串相对于null来说开辟了内存,消耗了那么一丢丢的性能。
2、null和undefined的区别
null一般都是暂时没有,预期中以后会有的。(可能以后也没有达到预期),在JS中null一般都是手动先赋值为null,后期我们给其赋具体值。
undefined:完全没在预料之内的。
十五、对象数据类型的基础知识
1、对象数据类型object
var obj = {name: ‘hello’, age: 8};
每一个对象都是由零到多组属性名(key键):属性值(value值)
组成的,或者说由多组键值对组成的,每一组键值对中间用逗号分隔。
属性: 就是描述这个对象特点特征的
对象的属性名是字符串或者数字格式的,存储的属性值可以是任何的数据类型。
对象名.属性名:忽略了属性名的单双引号
对象名[属性名]: 不能忽略单双引号
var obj = {name: 'hello', age: 8 , friend: ['xxx', 'xxx']};
// 获取某个属性名对应的属性值
obj.name // "hello"
obj['name'] // "hello"
如果属性名是数字如何操作
var obj = {0: 100};
obj.0 这种语法不支持
obj[0] 或者 obj['0'] ,这两种都可以支持
obj.sex 是undefined, 如果操作的属性名在对象中不存在,
获取的结果是undefined
设置或者修改,一个对象的属性名是不能重复的(唯一性),如果之前存在就是修改属性值的操作,反之不存在就是新设置属性的操作。
obj.sex = '男';
obj['age'] = 9;
删除
假删除:让其属性值赋值为null,但是属性还在对象中
obj.sex = null;
真删除:把整个属性都在对象中暴力移除
delete obj.sex;
思考题:obj[age] 和 obj[‘age’] 有什么样的区别?
var obj = {name: 'hello', age:8 };
var age = 'world';
obj[age]
obj['age']
16、基本数据类型和引用数据类型的区别
JS是运行在浏览器中的(内核引擎),浏览器会为JS提供赖以生存的环境(提供给JS代码执行的环境),叫做全局作用域。 也是window。
node 和 Java的全局环境都是 global。
var a = 12;
var b = a; // 把a变量存储的值赋值给b
b = 13; // 给b这个变量,重新赋值13
console.log(a); // 12
var n = {name: 'hello'};
var m = n; // 把n存储的值赋值给m
m.name = 'world';
console.log(n.name); // world
基本数据类型是按值操作的
:基本数据类型在赋值的时候,是直接的把值赋值给变量即可。
引用数据类型是按照空间地址(引用地址)来操作的
:
var n = {name: ‘hello’};
1、先创建一个变量n
2、浏览器首先会开辟一个新的存储空间(内存空间),目的是把对象中需要存储的内容(键值对)分别的存储在这个空间中。为了方便后期找到这个空间,浏览器给空间设定了一个地址(16进制的)。
3、把空间的地址赋值给了变量。
所以才叫做引用数据类型,就是因为引用了空间的地址
关于引用数据类型的图:
17、函数的初步讲解
1、函数数据类型
函数数据类型也是引用数据类型的一种,也是按照引用地址来操作的。
函数:具备一定功能的方法
JS中怎么创建函数:
创建函数:相当于生产了一台洗衣机
function 函数名() {
// 函数体:实现某一个功能的具体JS代码
}
执行函数:相当于使用洗衣机洗衣服(如果函数只创建了但是没有去执行,函数没有任何的意义)
函数名();
举个例子:
function fn() {
console.log(1+1);
}
不加小括号,输出的是这个函数本身
fn; => 输出函数本身
输出结果:
f fn() { // 谷歌浏览器前面的小f, 就代表function
console.log(1+1);
}
加了小括号,就是执行。(把函数体中实现功能的代码执行)
fn(); // 2
2、函数数据类型是怎么操作的
不管是用function还是用var声明的变量名,如果在全局作用域下,变量名一样,就冲突了。
函数只创建,不执行,没有意义。
关于函数数据类型的图:
形参:叫形式参数(它是个变量),函数的入口
当我们创建一个函数想要实现某个功能的时候,发现有一些材料并不清楚,
只有当函数运行的时候,别人传递给我,我才知道,此时我们就需要设定入口。
让用户执行的时候,通过入口把值给我们。
function fn(num1, num2) { // num1和num2,都是形参变量
console.log(num1 + num2);
}
实参: 函数执行传递给函数的具体值就是实参
fn(1, 1); // 2
18、if、else if、else判断语句
1、if、else if、else
if (条件1) {
// 条件1成立执行的操作
} else if (条件2) {
// 上面条件不成立,条件2成立,执行的操作
}
...
else {
// 以上条件都不成立执行的操作
}
如果好几个条件都成立了,只把第一个成立的条件执行,后面成立的条件忽略不管。
条件的写法:
A == B, 结果是 true 或 false
A != B
A >= B
A < B
如果条件里面只有一个固定值,它是先把A转换为布尔类型,然后判断真假,
以此来决定条件是否成立
if (A) {}
只有两个小条件都是真,整体条件才为真
if (A > B && A < 10) {}
只要其中一个小条件成立,整体条件就是真
if (A > B || A == 0) {}
BAT面试题:
parseFloat 和 parseInt一样,从字符串的左边开始,
从左边的第一个字符开始找,把有效数字符找出来,直到遇到非有效数字符,
第一个w不是有效数字符,开门遇到山,就不往后面找了。
所以,结果是NaN
var num = parsetFloat('width:12.5px'); // NaN
if (num == 12.5) { // false。 NaN肯定不等于12.5
alert(12.5);
} else if (num == NaN) { // false。 NaN是不等于NaN的, NaN != NaN。 NaN和谁都不相等。
alert(NaN);
} else if (typeof num == 'number') { // true。typeof NaN 的结果是 "number"
alert(0); // 用alert输出的是 '0', 用alert输出的是都是字符串
} else {
alert('啥也不是!');
}
结果是: 字符串0
计算符(运算符)的优先级高于比较符
先把左边1+1计算完成,再和右边进行对比
1+1==2 // 输出: true
19、三元运算符
条件 ? 条件成立执行 :条件不成立执行;
if(条件) {} else {}:三元运算符就是这种简单if、else的另外一种写法
var num = 10;
if (num > 5 && num <= 10) {
num++;
} else {
num--;
}
num++:在自身基础上加1
num--:在自身基础上减1
改写成为三元运算符
num > 5 && num <= 10 ? num++ : num--;
如果只有条件成立时执行:
有一种情况是不需要进行处理的时候,
我们使用null、undefined、void 0(就是undefined)来占位
num > 5 && num <= 10 ? num++ : null;
某一种情况执行多条操作,使用小括号包起来,中间用逗号分隔
num > 5 && num <= 10 ? (num++, console.log(num)) : null;
在三元运算符的操作中不能出现break、continue、return这些关键词,
如果if、else中出现了这些关键词,无法用三元运算符来代替if、else
var num = 10;
if (num > 5 && num <= 10) {
num++;
break; 或者 continue; 或者 return;
}
三元运算符嵌套三元运算符
var num = 10;
num > 0 ? (num < 10 ? num++:num--) : (num >- 10 ? num+=2:num-=2);
改写成if、else
if (num > 0) {
if(num<10){
num++;
}else{
num--;
}
}else {
...
}
20、switch case判断
switch case应用于if、else中一个变量在不同值情况下的不同操作
var num = 10;
switch(num) { // switch后面小括号中存放的是一个值(一般我们都写变量,意思是把变量存储的值拿过来用,有时候也可能是一个计算)
case 1:
console.log('1');
break;
case 10: // case后面放入的都是值,目的是验证switch后面的值和哪一种case后面的值相等,相等的进行对应的处理
console.log('2');
break; // 每一种case结束后都要加break, 结束当前的判断
default: // switch后面的值和每一种case情况对应的值都不相等,执行最后的defualt,类似于else
console.log('end');
}
num%2:让num存储的值除以2取余数(0或者1)
var num = 5;
switch (num % 2) { // 先把取余操作进行运算,拿运算结果和case比较
case 0:
num++;
break;
case 2-1: // case后面也应该是值,此处先把2-1计算,把计算的结果和switch值比较
num--;
// 最后一项可以不加break, 不加也能跳出判断
}
如果不加break,不管后面的条件是否成立,都会继续向下执行,直到遇到break为止。
小应用:把符合某几项值都去做同一件事情,使用不加break实现
switch (num % 3) {
case 0:
case 1: // 余数是0或1都执行减减的操作
num--;
break;
default:
num=0;
}
‘6’ == 6 , 是true
‘6’ === 6, 是false
而switch case中的比较,使用的是: ===
var num = '6';
switch (num) {
case 6: // false。因为switch case中的比较用的是===
num--;
break;
default:
num=0;
}
结果: 0
=:赋值,等号左边是变量,右边是值
==:比较,如果左右两边值的类型不一样,浏览器会默认转换为一样的然后再进行比较
例如: ‘6’ == 6,浏览器将 ‘6’ 转换为6,然后再进行比较
===:绝对相等,不仅要求值一样,并且类型也要完全一样。
所以, ‘6’ === 6,结果是false