一、数据类型相关
(1)在JS中只有“0/NaN/空字符串/null/undefined” 这五个值转换为布尔类型为false,其余转换为布尔类型都是true;
(2)! 作用:先将其它数据类型转换为布尔类型,然后取反;!! 作用:把当前值转换为布尔类型;
(3)null && undefined; 说明:null(空对象指针),一般都是人为手动的先赋值为null,后面的程序中会再次给它赋值;undefined(未定义),一般都是不是人为手动控制的,大部分都是浏览器自主为空(后面可以赋值也可以不赋值);Number(null) => 0;Number(undefined) => NaN;
(4) 一个对象中的属性名不仅仅是字符串格式的,还可以是数字格式。当存储的属性名不是字符串也不是数字时,浏览器会把这个值转换为字符串(toString),然后再进行存储。
var obj = {
name:'小明',
0:10, // 类似数组[10]
{}:100, // error =》 '{}':100, // true
true:100,// error =》 'true':100,// true
null: 10,// error =》 'null': 10,// true
undefined:20,// error =》 'undefined':20,// true
NaN:30// error
}
obj[{}] = 100 // true
obj[true] = 100 // true
obj[null] = 10 // true
obj[undefined] = 20 // true
obj[NaN] = 30 // true
console.log(obj['name']);
console.log(obj[0]);
(5)数组也是对象。如:
var arry = [1,2];
arry['age'] = 100;
console.log(arry);
(6)在JS中用来检测数据类型的方式:typeof、instanceof、constructor、Object.prototype.toString.call()。
typeof 【value】 =》 检测value的数据类型
返回值:使用typeof检测出来的结果是一个字符串,字符串中包含着对应的数据类型,例如:“number”/"string"/"boolen"/"undefined"/"object"/"function"
typeof null => "object"; // 因为null代表空对象指针(没有指向任何的内存空间)
typeof检测数值/正则/对象,最后返回的都是"object",也就是基于这种方式无法细分对象。
typeof NaN => "number"
(7)n++和 n = n+1一样吗?
var n = '10';
n = n+1;
console.log(n); //101
// 比较
var n = '10';
n++;
console.log(n); //11
实现自身累计最好使用++
(8)相等比较和绝对比较
'10' == 10
=》true 相等比较,如果等号左右两边的类型不一样,首先会转换为一样的数据类型,然后再进行比较
‘10’ === 10
=》false 绝对比较,如果两边的数据类型不一样,则直接不相等,它要求类型和值都完全一样才会相等(真实项目中为了保证代码的严谨性,都应该使用绝对比较)
二、JS的运行机制
(1)当浏览器(它的内核\引擎)渲染和解析JS的时候,会提供一个供JS代码运行的环境,我们把这个环境称为“全局作用域(global/window)== 栈内存”
(2)代码自上而下执行(之前还有一个变量提升阶段)
=》基本数据类型的值会存储在当前作用域下
var a = 12;
1)首先开辟一个空间存储12
2)在当前作用域中声明一个变量a(var a)
3)让声明的变量和存储的12进行关联(把存储的12赋值给a=》赋值操作叫做定义)
基本数据类型(也叫作值类型),是按照值来操作的:把原有的值复制一份,放到新的空间或者位置上,和原来的值没有关系;如:var a =12 ; var b = a; // a和b没有关系,b的值只是a的值的一份拷贝
=》引用数据类型的值不能直接存储到当前的作用域下(因为可能存储的内容过于复杂),我们需要先开辟一个新的空间,把内容存储到这个空间中
var obj1 = {n:100};
1)首先开辟一个新的内存空间,把对象中的键值对依次存储起来(为了保证后面可以找到这个空间,此空间有一个16进制的地址)
2)声明一个变量
3)让变量和空间地址关联在一起(定义)
引用类型不是按照值来操作,它操作的是空间的引用地址:把原来空间的地址赋值给新的变量,但是原来的空间没有被克隆,还是一个空间,这样就会出现多个变量关联的是相同的空间,相互之间就会存在影响了。
(3)相关练习
var obj = {
n : 10,
m : obj.n * 10
}
console.log(obj.m); // Uncaught TypeError: Cannot read property 'n' of undefined
1)形成一个全局作用域(栈内存)
2)代码自上而下执行
1. 首先开辟一个新的堆内存(AAAFFF111),把键值对存储到堆内存中
n:10
m:obj.n*10 => obj.n 此时堆内存信息还没有存储完成,空间的地址还没有给obj,此时的obj是undefined
var ary1 = [3,4];
var ary2 = ary1;
ary2[0] = 1;
ary2 = [4,5];
ary2[1] = 2;
ary1[1] = 0;
console.log(ary1,ary2); // [1,0] [4,2]
三、判断相关
(1)if('3px' + 3){
}
在JS中,+ - * / %都是数学运算符,除 + 以外,其余运算符在运算的时候,如果遇到非数字类型的值,首先会转换成数字类型(Number),然后再进行运算 。
(2)三元运算符
1)如果三元运算中的某部分不需要做任何处理,我们用null/undefined/void 0...,占位即可
var num = 12;
num > 10 ? num++ : null;
2)如果需要执行多项操作,我们把其用小括号包裹起来,每条操作语句用逗号分隔
var num = 10;
num >= 10?(num++,num+=10):null;
(3) switch case
switch case 应用于变量(或者表达式等)在不同值情况下的不同操作,每一种case结束后都要加break(结束整个判断)
switch case中每一种case情况的比较都是基于"==="绝对相等来完成的