变量类型
- 值类型:变量在内存中分配了地址,值直接存放在内存中,值类型变量变化不会影响赋值的其他变量。
- 引用类型:变量是指针,指向了对象,对象数据结构可能比较复杂,节省了空间,引用类型变量变化会影响到赋值的其他变量。
- js是根据存储方式来区分变量类型
// 值类型:
var a = 10;
var b = a;
a = 20;
log(b); // 10,值类型变量变化不会影响赋值的其他变量
// 引用类型:a可以理解为指针,指向了对象{age:20},b同为指针,指向了相同的空间地址,一个指针变量改变了对象的值,必定会对其他指向该空间地址的变量产生影响
var a = {age: 10};
var b = a;
a.age = 20;
log(b.age); // 20,引用类型变量变化会影响到赋值的其他变量。
- 其他:引用类型可以扩展属性,值类型就不可以:
// 值类型变量不可以扩展属性
var a = 3;
a.name = 'z';
log(a.name); // undefined
// 引用类型就可以扩展属性
var a = {age: 2};
a.name = "z";
log(a); // {age: 2, name: "z"}
// 数组作为引用类型,也可以扩展属性,函数也是可以扩展属性
var a = [1,2,3];
a.name = 'z';
log(a); // [1,2,3, name: 'z'],神奇吧,但是一般不会用到
typeof运算符
- typeof 可以区分值类型变量和引用类型变量
- 其中值类型变量可以区分出undefined/string/number/boolean
- 引用类型变量只可区分出object/function
- typeof undefined // undefined
- typeof ‘a’ // string
- typeof 1 // number
- typeof true // boolean
- typeof {} // object
- typeof [] // object
- typeof console.log //function
变量计算 - 强制类型转换
什么时候会发生类型转换?
- 字符串拼接
var a = 1+ 1 // 2
var b = 1 + '1' // 11
- == 运算符
尽量使用===,因为js会尽量比较不同类型的变量,就会导致类型发生转换:
100 == '100' // true 发生类型转换,100转换为了'100'
0 == '' // true 会把0和''变为false
null == undefined // true 会把null和undefined变为false
- if语句
var a = true;
if(a){
// 会执行
}
var b = 100;
if(b){
// 会执行,会把100变为true来对待
}
var c = '';
if(c){
// 不会执行,''会变为false对待
}
var d = 0 / NaN / '' / null / undefined / false
if(d){
// 都不会执行,都会当做false处理
}
- 逻辑运算
log(1 && 0) // 打印0,因为会把1当做true对待,所以打印后边的0
log('' || 'abc') // 打印'abc',因为''会变为false,||就为短路运算符,所以会打印abc
log(!window.abc) // true,因为abc没有定义,所以window.abc为false,然后加上!打印true
什么时候用==什么时候用===?
===不会进行强制类型转换
- 判断对象中某个属性存在不存在,用==
if(obj.a == null){
// 相当于obj.a === null || obj.a === undefined的简写
// 是jQuery源码中推荐的写法
}
// 或者判断函数的参数时候可以用==,前提是a一定要定义好
function(a, b){
if(a == null){
判断函数的参数时候可以用==
}
}
- 出了上述情况之外,都可以用===,即判断string、number、boolean、undefined时候用===
JS中有哪些内置函数
- Object
- Array
- Boolean
- Number
- String
- Function
- Date
- RegExp
- Error
- Math
如何理解Json
- JSON也是一种数据格式
- JSON其实也算是JS对象而已,提供了API,JSON.Stringify和JSON.parse