一、数据类型
任何编程语言都少不了数据类型,javascript的数据类型包含基本数据类型和引用数据类型
基本数据类型:string,number,bool,undefined,null,symbol
引用数据类型:object(function,Array,Date,RegExp...)
不同点:1、基本数据类型是存在栈内存中,按值传递,例:var a = 3,var b = a; b = 4; //a=3,b=4
2:引用数据类型的值存储在堆内存中,地址(指向堆中的值)存储在栈内存中,按引用传递,即:
把对象赋值给另外一个变量的时候,复制的是地址,指向同一块内存空间,当其中一个对象改变时,另一个对象也会变化。
注意:1、另外symbol是es6新增的数据类型,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突,真实值类似于字符串
通过new symbol('abd')来定义变量
2、typeof null 返回的值是 object,但是null不是对象,而是基本数据类型的一种
二、强制数据类型转换
JavaScript是弱数据类型,在以下两种情况下会进行强制数据类型转换
- 在使用==进行判断时,会将等式两边的数据进行数据类型转换。
console.log(1==2); //false
console.log('a'=='a'); //true
console.log(1=='a'); //false
console.log(true == true); //true
console.log(true == 1); //true
console.log(true == '1'); //true
console.log(true=='') //false
console.log(1=='1') //true
(1)等式两边类型相等时,会直接判断值是不相等
(2)等式两边类型不相等时且等式两边数据类型为Bool、String、Number,会将等式左右两边进行Numeber的强制化数据类型转换 如:[]==![] 为true
- 在if判断时,括号内的值进行类型转换,转化为布尔值
所以了解如下特殊转换,除了以下数据判断会返回false,其它的任何数据判断都是返回true
Boolean(undefined) //false Boolean(null) //false Boolean('') //false; Boolean(NaN) //false; Boolean(0)//false
三、类型检测
1、typeof
typeof只能检测出基本数据类型,引用数据类型除了能检测出function,其它检测出的都是Object,另外需注意的是typeof输出的是字符串,如:typeof typeof [2,3] //string
2、instanceof
能通过[2,3] instanceof Array 能判断出引用类型的具体数据类型,instanceof 是通过原型链判断的,A instanceof B, 在A的原型链中层层查找,是否有原型等于B.prototype,如果一直找到A的原型链的顶端(null;即Object.prototype.__proto__),仍然不等于B.prototype,那么返回false,否则返回true.
Instanceof 实现原理:
function instance_of(L,R){ var O = R.prototype; L = L.__proto__; while(true){ if(L === null){ return false; } if(L == O) return true; L = L.__proto__; } }
四、运算符
1、一元操作符
前置型递增(递减)和后置型递增(递减),区别就是:后置递增(递减)是在包含包含它们的语句被求值后才执行,如下:
var num1 = 1,num2 = 2;num3 = 1; var num4 = ++num1 + num2 ; console.log(num4,num1) // 4 2 var num5 = num2 + num3++; console.log(num5,num3) // 3 2
另外一点需要注意的就是,前置后置一般都应用于Number类型,那在其他类型是什么样的结果呢?
var a ='a' console.log(++a) // NaN a ='1' console.log(++a) // 2 a = false console.log(++a) // 1 a = 1.1 console.log(++a) // 2.1
可知,非数字类型的数据会先转换为数字类型然后进行递增(递减)。
2、逻辑与&&
逻辑与左右都为布尔值时,遵循如下真值表:
第一个操作符 | 第二个操作符 | 结果 |
true | true | true |
true | false | false |
false | true | false |
false | false | false |
逻辑与可以应用于任何类型的操作数,当有一个操作数不是布尔值时,逻辑与返回的就不一定是布尔值了,遵循的规则如下:
- 如果第一个操数是对象,则返回第二个操作数
- 如果第二个操作数是对象时,则只有第一个操作数的求值为true时,才会返回该对象
- 如果两个操作数都是对象,则返回第二个操作数
- 如果一个操作数为null,则返回null,
- 如果一个操作数是NaN,则返回NaN,
- 如果有一个操作数是undefined,则返回undefined
总结:A,如果2个操作数非Boolean类型,则返回第二个操作数
B1,如果第一个操作数为Boolean类型,true返回第二个操作数,为false返回false
B2,如果第二个操作数为Boolean类型,返回第二个操作数
3、逻辑或||
逻辑与左右都为布尔值时,遵循如下真值表:
第一个操作符 | 第二个操作符 | 结果 |
true | true | true |
true | false | true |
false | true | true |
false | false | false |
与逻辑与操作相似,如果一个操作数不是布尔值,逻辑或也不一定返回布尔值,它遵循如下规则:
(1)如果第一个操作数是对象,则返回第一个操作数
(2)如果第一个操作数的求值结果为false,则返回第二个操作数
(3)如果2个操作数都是对象,则返回第一个操作数
(4)如果一个操作数为null,则返回null,
(5)如果一个操作数是NaN,则返回NaN,
(6)如果有一个操作数是undefined,则返回undefined
与逻辑与操作符相似,逻辑或操作符也是短路操作符,也就是说如果第一个操作数的求值结果为true,就不会对第二个操作数求值