1. JavaScript有哪些数据类型?
JavaScript有6种简单数据类型(也称为原始类型): Undefined Null Boolean
Number String和Symbol 其中Symbol是ES6中新加的类型。另外还有一种复杂数据类型Object对象也可以称为引用类型(羡慕JavsScript有对象)
2. 如果给原始值添加属性会怎样?
引用值拥有动态属性,可以随时添加、修改和删除其属性和方法,而原始值不能有属性,尽管尝试给原始值添加属性不会报错,但填了和没添一样
let name = "Fer';
name.age = 27;
console.log(name.age); // undefined
3. 原始值和引用值的复制方式有何不同?
当原始值的赋值到另一个变量时,原始值会被复制到新变量的位置,新变量的改变不会影响原始变量
同样,当把引用值从一个变量赋给另一个变量时,也是将存储在变量中的值复制到新变量所在的位置,区别在于,这里复制的值实际上是一个指针,指向存储在堆内存中的对象,复制操作完成后,两个变量实际上只想同一个内存空间里的对象。因此。无论通过两个变量中的哪一个修改对象都可以通过另一个变量体现出来。
let obj1 = new Object();
obj1.name = "Fer";
let obj2 = obj1;
console.log(obj2.name); // "Fer"
4. 如何理解JavaScript中函数参数按值传参
按值传递参数时,值会被复制到一个局部变量,即一个命名参数,按引用传递参数时,值在内存中的位置会被保存在命名参数中,和引用值类似的逻辑,引用值存的也是对象在内存中的位置。 在JS中,在给函数传参时,参数不管是原始值还是引用值,都是将值复制到命名参数,按照题3中的复制方式,只不过传的是原始值复制的是该值,传的是引用值则和被复制的值一样都是对象的内存位置。总而言之,都是复制的值本身而不是值在内存中的位置。
function func(arg) {
// 拷贝val中存的值,val如果是原始值则拷贝原始值,
// 如果是引用值就拷贝改引用值,即一起指向同一个内存空间
arg.name = "Fer";
arg = new Object();
arg.name = "Ber";
}
let val = new Object();
func(val);
console.log(val.name); // Fer
可见,arg是由val复制过来的,和val一样都是存储的同一块存储空间地址,因此通过arg修改了存储空间的属性值再通过val访问该属性得到的是修改后的值,而给arg重新分配一个新的内存地址空间,而val不会跟着一起指向新的内存地址空间,可见val是复制了一份副本给arg,两个值的更改不会相互影响。
5. 如何判断数据类型
typeof操作符
对一个值使用typeof操作符会返回以下字符串之一:
undefined值未定义
boolean值为布尔值
string值为字符串
number值为数值
object值为对象或者是null
function值为函数
symbol值为符号
如何进一步判断一个对象是否是数组
Array.isArray()
如何判断是否为null
typeof null将返回object因此,判断一个对象是使用obj === null 来判断即可
6. 如何将字符串转为数字,尽可能多的方法
Number()
parseInt()
parseFloat()
其中Number是转型函数,可用于任何数据类型,后两个函数主要用于将字符串转换为数值
Number转换规则如下:
```
Number(true) // 1
Number(false) // 0
Number(null) // 0
Number(undefined) // NaN
Number('123abc') // NaN
Number('000111.011') // 111.011
Number('0xabc1') // 十六进制 43969
Number('') // 0
```
parseInt 转换规则如下
```
parseInt('123') // 123
parseInt('0x123') // 291
parseInt('') // NaN
parseInt('123abc') // 123
parseInt('abc123') // NaN
```
parseInt从第一个非空字符开始转换,如果第一个字符不是数值字符、加号或减号,parseInt()立即返回NaN,如果第一个字符串是数值字符、加号或减号,则继续依次检测每个字符,直到字符串末尾或碰到非数值字符。
parseInt支持第二个参数传入指定进制,
parseInt('AF', 16) // 175
parseInt('AF') // NaN
parseFloat转换规则如下
parseFloat('123abc') //123
parseFloat('0xa') // 0
parseFloat('23.45.6) // 23.45
parseFloat('0123.5') // 123.5
parseFloat('3.14e7') // 31400000
7. 有哪些值强制转为布尔类型时为false
| 数据类型 | 转为true的值 | 转为false的值 |
|---|---|---|
| Boolean | true | false |
| String | 非空字符串 | 空字符串'' |
| Number | 非0数值 | 0或NaN |
| Object | 任意对象 | null |
| Undefined | 不存在 | Undefined |
8. ==与===的区别是什么
==允许类型转换后进行比较,=== 会严格比较类型和值是否相等,比如
'123' == 123 // true
'123' === 123 // false
9. 以下代码输出什么?并解释原因
var a = [1, 2];
var b = [3, 4];
console.log(a + b);
输出'1,23,4'
ECMAScript中的操作符可以用于各种值,包括字符串、数值、布尔值甚至还有对象,操作符作用于对象时会调用对象的valueOf()和/或toString()方法来取得可以计算的值,如果调用valueOf()方法后的值根据Number()转型函数转换规则为NaN,则再使用toString()方法。
a.valueOf()返回值为[1,2],Number([1,2])为NaN,继续调用a.toString()返回值1,2 b.toString()得到3,4 因此a + b相当于a.toString() + b.toString() = '1,23,4'