JS的变量类型
在javascript规范中,定义了七种数据类型,分为值类型
和引用类型
两大类.
- 值类型
数值(Number)、字符串(String)、布尔值(Boolean)、undefined、null、 Symbol(es6新增) - 引用类型
对象(Object)、数组(Array)、函数(Function)
值类型和引用类型的区别
值类型
-
保存在栈中,占用空间固定,使用后被销毁
当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了,因此,所有在方法中定义的变量都是放在栈内存中的
注意: 栈中存储的是一些基础变量和对象的引用变量,基础变量的值是存储在栈中,而引用变量存储在栈中的是指向堆中的数组/对象的地址 -
基本类型的值不可变
let name = 'Aley' name.toLowerCase() // aley console.log(name) // Aley
-
保存与复制的是值本身
-
使用typeof检测数据类型
typeof识别所有值类型以及函数, 判断是否是引用类型let a typeof a // undefined typeof '123' // string typeof 123 // number typeof true // boolean typeof Symbol() // symbol typeof null // object typeof function() {} // function typeof console.log // function // 用typeof识别引用类型返回的都是 object, 除了函数 typeof [] // object typeof {} // object
引用类型
引用类型可以说就是对象,对象是属性和方法的集合。也就是说引用类型可以拥有属性和方法,属性又可以包含基本类型和引用类型
-
保存在堆中,占用空间不固定,使用后不一定被销毁,只有一个对象没有任何引用时,系统的垃圾回收机制才会回收销毁
-
保存与复制的是指向对象的一个指针,该指针保存在栈中
-
使用instanceof检测数据类型
如果变量是给定引用类型(根据它的原型链来识别)的实例,那么instanceof 操作符就会返回 truelet obj = {} obj instanceof Array // false obj instanceof Object // true // 发现数组用instanceof不好区分 [] instanceof Array // true [] instanceof Object // true // 检测数组 Array.isArray([]) 或者 if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; } }
-
使用new()方法构造出的对象是引用型
类型转换
-
字符串拼接
字符串转数值: ‘100’ * 1
数值转字符串: 100 + ‘’let a = 100 + 10 // 110 注: ''不要写成' ',否则 字符串长度会加1 let b = 100 + '' // '100' let c = '100' * 1 // 100 typeof c // number
-
==(不考虑变量类型) 和 ===(考虑变量类型)
除了== null之外,其他一律用 ===100 == '100' //true 100 === '100' //false 0 == '' //true null == undefined //true const obj = {x: 100} if (obj.a == null) {} 相当于 if (obj.a === null && obj.a === undefined) {}
-
if语句
let a = true if(a){} let b = 100 if(b){} // 把数字转换为true let c = '' if(c){} // 把空字符串转换为false
-
逻辑运算
除 0, ’ ', false, NaN, null, undefined是falsely变量,其余都是truely变量console.log(10&&0); // 0 把10转换成true console.log('' || 'abc'); // 'abc' 把空字符串转换为false console.log(!window.abc); //true window.abc是undefined 把非undefined转换成true //判断一个变量会被当做true还是false let a = 100 console.log(!!a); // true