4.1 如何理解js变量松散类型本质?
这决定了js只在特定的时间用于保存特定值得名字而已,变量的值及其数据类型可以在脚本的生命周期内改变!
4.2 引用类型与基本类型有什么区别?
基本类型(String、Boolean、Number、Null、Undefind):在内存中以具体值的形式直接存储在栈区。

执行的过程是内存开辟了一个变量b的存储空间,赋值期间,变量的一个的值给了变量b,因此修改变量一个的值不会影响到变量b。
引用类型(Object、Array、Function、RegExp、Date……):在内存中以地址的形式存储在堆区。

这是因为在声明的时候在内存的栈区中存放的是其地址。
基本类型是按值访问的,可以操作保存在变量中的实际值;引用类型的值是保存在内存中的对象,在操作对象时,实际上是在操作对象的引用,因为js不允许直接访问内存;引用类型可以为其添加属性,而基本数据类型则不可,尽管不报错;
在复制变量时,基本类型是独立的两个变量,而引用类型中两个变量实际上引用的都是同一个对象,相互影响。
4.3 如何理解js中所有函数的参数都是按值传递的?
在向参数传递基本数据类型的值时,被传递的值会被复制给一个局部变量,而在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化回反应在函数的外部;在参数为对象时,如果函数内部重写对象,此时的变量引用的只是局部对象,在函数执行完立即销毁,因此不会影响传进来的外部对象。
4.4 如何检测引用类型的具体类型?
使用instanceof

返回true,那么说明变量是给定引用类型的实例。
4.5 如何理解函数的执行环境?
当执行流进入一个函数时,函数的环境就会被推入一个环境栈中,而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。
4.6 作用域链的作用是?
保证对执行环境有权访问的所有变量和函数的有序访问。
4.7 作用域的头尾是?
前端始终是当前执行代码所在环境的变量对象,后端始终是全局执行环境的变量对象!
4.8 延长作用域链的方法有?
使用try-catch语句的catch块或者with语句
4.9 如何理解s的块级作用域?
在ES6|入let关键字之前,不存在块级作用域,所以i或者for等语句执行完后,其内部声明的变量依然会存在于外部变量之中。
4.10 为何初始化变量之前,最好先声明?
一是在严格模式下,初始化未经声明的变量会导致错误;二是变量会自动被添加到全局环境,容易导致意外。
4.11 如何理解js的垃圾收集机制?
使用标记清除或引用计数的收集策略,周期性的找出那些不再使用的变量,然后释放其占用的内存。
4.12 如何避免采用引用计数垃圾收集策略时出现的循环引用问题?
在不使用时,手工断开原生JS对象与DOM元素之间的连接,如将变量设置为nul。
4.13 为何分配给web浏览器的内存比桌面程序的少?
主要出于安全考虑,防止运行JS网页耗尽全部系统内存而导致系统崩溃。
4.14 优化内存的最好方式是?
为执行中的代码只保存必要的数据,一旦不用,最好设置为nul来释放其引用,让值脱离环境,以便垃圾收集器下次运行时将其回收。
4.15 基本类型和引用类型在内存中的位置有何不同?
前者保存在栈内存中,后者保存在堆内存中。
5.1js中创建对象实例的方法有?
一是使用new操作符后跟Object构造函数;二是使用对象字面量表示法。
5.2如何选择访问is对象方法?
除了必须使用变量来访问属性时采用方括号表示法,其他均建议使用点表示法。
5.3js中数组类型与其他语言最大的区别是?
每一项可以保存任何类型的数据,并且数组大小是可以通过设置length属性进行动态调整的。
5.4创建数组的方式有?
使用Array构造函数法和数组字面量表示法
例:
Array构造函数法

数组字面量表示法

5.5给数组构造函数传递一个值时处理规则是?
如果传递的值时数值,则按照该数值创建给定项数的数组;如果是其他类型的,则会创建只有那一个值得数组。
5.6检测数组需要注意什么?
当存在两个以上不同全局执行环境时,instanceo会难以区分不同的数组构造函数,所以在支持Array.isArray()方法的浏览器中使用该方法。
5.7js的数组是怎么实现栈和队列的数据结构的?
使用push和pop方法模拟栈,使用shift和push,或unshift和pop模拟双向队列
5.8数组的方法有?
isArray,toL ocaleString,toString,valueOf,push,pop,shift,unshift,reverse,sort,concat,splice,indexOf,lastlndexOf,every,filter,forEach,map,some,reduce,reduceRight,
5.9js中定义函数的方法有?
一是使用函数声明语法;二是使用函数表达式;三是使用Function构造函数(不推荐,解析了两次代码而影响性能)。
5.10js中函数为何没有指针?
因为每个函数实际都是Function类型对象的实例,函数名只是一个指向函数对象的指针,不会与某个函数绑定,如果申明了两个同名函数,后面的函数会覆盖前面的函数。
5.11函数声明和函数表达式的区别?
js引擎会把函数声明提升到顶部,而表达式得到解析器执行到其所在的代码行才会被解释执行。
5.12函数名本身是变量有何好处?
使得函数可以作为值来使用,传递参数或者作为函数内部的返回值等。
5.13如何理解函数内的arguments对象的callee属性?
指向拥有该arguments对象的函数本身,一般在函数递归时用来消除函数执行与函数名的耦合。
5.14函数内部的属性和方法有?
argument和this对象,length和prototype变量,apply,call和bind toLocaleString,toString,valueOf
5.15为何用apply和call?他们的区别?
确保对象不与方法耦合的前提下,去扩充函数执行的作用域;接收参数的方式不同。
区别:apply传递的参数必须得是数组的形式传递,而call则直接连续参数传递。
5.16Boolean,Number和String 特殊引用类型的作用是?特殊在哪?
便于操作基本类型的值;特殊在对象的生存期,使用new操作符创建的引用类型实例,会在执行流离开当前作用域前一直保存在内存中,而特殊类型只存在代码执行的瞬间,并且不能再运行时为其添加属性和方法。
5.17使用new调用基本包装类型的构造函数,与调用同名转型函数的区别?
前者返回的类型为对象,而后者还是基本类型。
5.18String类型提供了那些方法和属性辅助js对字符串的解析和操作?
length,继承于对象的toLocaleString,toString,valueOf charAt,charCodeAt concat,slice,substr,subtring,indexOf,lastlndexOf,trim,toLowerCase,toLocaleLowerCase,toUpperCase,toLocaleUpperCase,match,search,replace,localeCompare,fromCharCode
5.19Globa对象的方法和属性有?
isNaN,isFinite,parselnt,parseFloat,encodeURI,encodeURIComponent,decodeURI,decodeURIComponent,eval;undefied,NaN,Infinity,Object,Array,Fuction,Boolean,String,Number
5.20为何Math对象提供的计算功能比在JS中直接编写的要快得多啊?
因为其属性和方法都是静态的,js引擎做了优化,少了解析代码的环节。
6.1js中的属性有?
数据属性和访问器属性
6.2 如何修改数据属性的默认值?如何获取?
使用Object.defineProperty()方法修改;使用Object.getOwnPropertyDescriptor()方法获取;
6.3 对象如何定义多个属性?
使用Object.defineProperties()方法
例:
var book={};
object. defineProperties(book,{
_year:{
writable: true,
value:2004
},
edition:{
writable: true, value:1
},
year:{
get: function(){
return this._year;
set: function(newValue){
if(newValue>2004){
this._year=newValue;
this. edition+=newValue-2004;
}
}
}
});
book. year=2005;
console. Log(book. edition); //2
6.4 使用Object构造函数或对象字面量创建对象的共同缺点是?
一个接口创建很多对象,产生大量重复代码;
6.5 工厂模式解决了什么问题,还存在什么问题?
解决了创建相似对象的问题,没有解决对象识别的问题(怎样知道一个对象的类型)

6.6 构造函数解决了什么问题,还存在什么问题?与普通函数有何区别?
构造函数可通过其constructor属性来标识它的实例为特定的对象类型,即解决了创建相似对象问题,又解决了对象识别问题,但是每个方法都在实例重新创建了一遍,会导致不同的作用域链和标识符解析,且不同实例的同名函数不相等;形式上是首字母大小写不同,本质上是调用方式不同,如果构造函数作为普通函数调用,属性和方法都会被添加到全局对象;
6.7 函数中prototype属性的作用是?
包含可以由特定类型的所有实例共享的属性和方法,其本身也是一个对象,其constructor属性指向包含该原型的构造函数。
6.8 对象实例与原型中值的规则?
实例可以访问原型中的值,却不能修改,且若实例添加了一个与原型同名的属性,将会屏藏原型中的属性,阻止实例访问,只有通过delete操作符才能恢复去指向原型的连接。
6.9 如何确定属性是实例属性还是原型属性?
同时使用hasOwnProperty()方法和in操作符;
6.10 使用对象字面量重写原型对象有何问题?
其constructor属性指向Object了,需要特意将其显示的设置回特定的值,但会修改其枚举属性,所以最好使用Object.defineProperty()去单独设置;切断了构造函数与最初原型之间的联系,会导致错误。
6.11 为何不推荐在原型对象中去定义新方法和属性?
可能导致命名冲突,还有就是可能意外重写原生方法。
6.12 原型对象还存在的问题?
所有的属性都被所有的实例共享。也就是说,用同一个构造函数创建的对象去访问原型中的属性的时候,大家都是访问的同一个对象,如果一个对象对原型的属性进行了修改,则会反映到所有的对象上面。但是在实际使用中,每个对象的属性一般是不同的。例如:张三的姓名是张三,李四的姓名是李四。
6.13 怎么实现组合继承?
使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。

6.14 寄生式继承为何会降低效率?
因为不能做到函数复用

思想:创建一个仅用于封装继承过程的函数,在该函数内部以某种方式来增强对象,最后返回对象。实现过程是createAnother0函数接收一个参数,也就是将要作为新对象基础的对象。然后,把这个对象(original)传递给objectO函数,将返回的结果赋值给 clone。再为clone 对象添加一个新方法sayHi0,最后返回clone对象。
6.15 组合继承存在的最大问题是?
总是调用两次超类函数(第一次是在创建子类原型的时候,第二次是在子类构造函数内部)

6.16 如何实现寄生组合式继承?
通过构造函数来继承属性,通过原型链和混成形式来继承方法。
基本模式:

例:

网友评论