#### 1. JavaScript规定了几种类型:
1. 共七种数据类型
2. 基本数据类型:string number boolean symbol null undefined
3. 复杂数据类型:object array function
#### 2. JavaScript对象的底层数据结构是什么
1.
#### 3. Symbol类型在实际开发中的应用,可手动实现一个简单的Symbol
1.
#### 4. JavaScript中的变量在内存中的具体存储形式
1. 基本数据类型存储在栈中
2. 复杂数据类型存储在堆中
#### 5. 基本类型对应的内置对象,以及他们之间的装箱拆箱操作
1.
#### 6. 理解值类型和引用类型
1. 值类型和引用类型操作方式不同
2. 存储方式不同:栈(存取快,内存小)、堆(存取慢、内存大)
#### 7. null和undefined的区别
1. null表示“没有对象”,即此处不应该有值
2. undefined表示此处应该有值,但是还没有定义
#### 8. 至少可以说出三种判断JavaScript数据类型的方式,以及他们的优缺点,如何准确的判断数组类型
1. Object.prototype.toString.call( val ) === '[object Object]'
2. constructor:Number.constructor === Number:true,构造函数的constructor属性指向有可能更改,所以不一定准确
3. typeof
#### 9. 可能发生隐式类型转换的场景以及转换原则,应如何避免或巧妙应用
1.
#### 10. 出现小数精度丢失的原因,JavaScript可以存储的最大数字、最大安全数字,JavaScript处理大数字的方法,避免精度丢失的方法
1. JS中可存储的最大数字:Number.MAX_VALUE:1.7976931348623157e+308
2. JS中能够表示最大安全整数范围是:Number.MIN_SAFE_INTEGER / Number.MAX_SAFE_INTEGER
#### 11. Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?
1. hasOwnProperty方法只判断对象自己是否拥有某个属性,不去原形上进行查找
#### 12. 强制类型转换
1. 转换为Boolean:六个值转换为 false ,其它全为 true:【 undefined, null, NaN, 0, +0, -0 】
2. 转换为String:主要发生在字符串的加法运算时,当一个值为字符串,另一个值为非字符串,则另一个转换为字符串
1. ‘2’ + 1// "21"
2. ‘2’ + true// "2true"
3. ‘2’ + undefined// "2undefined"
4. ‘2’ + false// "2false"
5. ‘2’ + null// "2null"
6. 当另一方为对象时,会有几种情况
7. ‘2’ + {}//"2[object Object]"
8. ‘2’ + {a: 1, b: 2}//"2[object Object]"
9. ‘2’ + []//"2"
10. ‘2’ + [2,'array']//"22,array"
11. ‘2’ + {}//"2[object Object]"
12. ‘2’ + function(){}//"2function(){}"
13. let obj = { toString(){ return 'a' } } ==> ‘2’ + obj//"2a"
3. 转换为Number:有加法运算符,无String类型的时候,都会优先转换为Number类型
1. true + 0//1
2. true + true//2
3. true + false//1
4. 转换为Number:除了加法运算符,其它运算符都会把运算自己转成数值:- * /
1. ‘5’ - ‘2’//3 || ‘5’ * ‘2’//10 || ‘5’ / ‘2’//2.5
2. true - 1//0 || false - 1//-1 || '1' -1//0
3. '5' * []//0 || false / '5'//0 || 'abc' - 1//NaN
4. null + 1//1 || undefined + 1 //NaN