1.JS原始数据类型有哪些?对象数据类型有哪些?
- 基本数据类型(值类型):数字number ,字符串string,布尔boolean,null,undefined
类型 | |
---|---|
数字 | 其中有一个特殊的值NaN(not a number)代表的是不是一个有效的数字,但属于number类型 |
字符串 | JS中所有单引号或双引号包裹起来的都是字符串,里面色内容有零到多个字符组成 |
布尔 | true为真,false为假 |
ES6中引入了ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象,Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。Symbol值不能与其他类型的值进行运算,Symbol值作为对象属性名时,不能用点运算符(用[])。
2. 引用数据类型:对象object(包含普通对象,数组对象,正则对象,日期对象,数学函数),函数function
类型 | |
---|---|
普通对象 | 由大括号包裹起来,里面包含多组属性和属性值(包括多组键值对),例如{ } 为空对象 |
数组对象 | 中括号包裹起来,包含零到多项内容 |
正则对象 | 由元字符组成一个完整的正则,/ /不是空正则是单行注释 |
日期对象 | Date 对象用于处理日期和时间,Date 对象会自动把当前日期和时间保存为其初始值。 |
数学函数 | Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math()通过把 Math 作为对象使用就可以调用其所有属性和方法。 |
2.说出下面运行的结果,解释原因。
function test(person) {
person.age = 26
person = {
name: 'hzj',
age: 18
}
return person
}
const p1 = {
name: 'fyq',
age: 19
}
const p2 = test(p1)
console.log(p1) // -> ?
console.log(p2) // -> ?
p1:{name: “fyq”, age: 26}
p2:{name: “hzj”, age: 18}
原因:引用类型,在函数传参的时候传递的是对象在堆中的内存地址值,而不是引用,也就是函数test中的参数person只是和p1指向的堆地址相同,而由const声明的对象p1,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。所以p1的age值改为了26。
3.null是对象吗?为什么?
不是,null表示准备用来保存对象,还没有真正保存对象的值。从逻辑角度看,null值表示一个空对象指针,这也是用typeof检测null时会返回“object”的原因
4.‘1’.toString()为什么可以调用?
在针对字符串、数字和布尔值使用字面量时,只有在该值被视为对象的情况下才会创建实际的复杂对象。换句话说,在尝试使用与构造函数关联的方法或检索属性之前,一直在使用原始数据类型。当这种情况发生时,Javascript 会在幕后为字面量值创建一个包装器对象,以便将该值视为一个对象。调用方法以后,Javascript 即销毁包装器对象,该值返回字面量类型。引用类型与基本包装类型的主要区别主要是对象的生存期不同。
0.1+0.2为什么不等于0.3?
0.1和0.2在转换成二进制后会无限循环,由于标准位数的限制后面多余的位数会被截掉,此时就已经出现了精度的损失,相加后因浮点数小数位的限制而截断的二进制数字在转换为十进制就会变成0.30000000000000004。