变量类型和计算
题目(答案见每题下方空白处)
1.JS中使用typeof可以得到哪些类型
number、string、boolean、undefined、object、function
2.何时使用===,何时使用==
一般除了obj.a == null里建议用==(否则需要写obj.a === null || obj.a === undefined,节约代码量,jQuery原码这么写的),其他建议用===
3.JS中的内置函数有哪些
这里指的是ECMAScript中的函数,包括Object、Array、Function、Boolean、Number、String、Date、RegExp、Error
4.JS变量按照存储方式分为哪些类型,描述其特点
基本类型和引用类型
基本类型中的每个值都放在内存中(栈内存),复制时复制的为值
引用类型中的每个值放在堆内存中,变量中保存的只是这个值的一个地址,复制的时候复制的为地址
5.如何理解JSON
JSON也是JS中的一个内置对象,只不过其书写上的格式比较严格,有两个API:stringify(对象->字符串)和parse(字符串->对象)
但另一方面来说,JSON也是一个数据格式
知识点
变量类型
基本类型和引用类型
基本类型有string、number、boolean、undefined和null,保存在栈内存中
用变量来给另一个变量赋值时,变量得到的是值,因此两个变量值发生变化时,另一个变量的值不变
而引用类型有array、object、function,保存在堆内存中
用变量给另一个变量赋值时,实际上得到的是这个引用类型的一个地址,因此当其中一个变量值发生变化时,另一个变量的值也变化
可以理解成基本类型的值(数据量)小,直接放在内存中比较好,而引用类型数据量大,放在内存中不利于内存的使用,节约内存空间
typeof运算符
对象、数组、正则表达式、null返回object,函数返回function,数字返回number,字符串返回string,布尔值返回boolean,undefined返回undefined
所以对于基本类型,typeof区分比较好,但是对于引用类型,用instanceof比较好(是否为某个的实例)
万能方法
instanceof实际上判断的是数据对象是否为某个数据类型构造函数的实例,如果用'123' instanceof String,返回的也是false
这里可以用Object原型上的toString方法来判断,也就是Object.prototype.toString.call(),输出的是一个数组,内容为Object 数据类型,所有的数据类型在判断的时候都没有问题
扩展——symbol类型
ES6中新增了Symbol类型,用typeof返回symbol
这里的symbol类型每次都生成一个不一样的独立的值,也就是用===符号判断两个Symbol类型是永远不可能相等的
可以在构造Symbol实例的时候向其中传入一个字符串,查看该值的时候会以symbol(字符串)的形式返回,有利于我们区分不同的Symbol类型
可以用在对象中,以防止对象的键值对被修改,但实际开发中还几乎没有用symbol类型的
变量计算
强制类型转换
发生在以下几种情况中
- 字符串拼接(字符串+数字)
- ==运算符
- if语句
- 逻辑运算
其中会被强制转换成false的有:0、NaN、"、undefined、null、false本身
JSON
JSON也是JS中的一个内置对象(注意和内置函数区别,Math也是一个内置对象,内置函数是可以用new关键词构造实例的),只不过其书写上的格式比较严格
JSON有两个API:stringify(对象->字符串)和parse(字符串->对象)
但另一方面来说,JSON也是一个数据格式