JavaScript高程第四章—第六章总结

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 如何实现寄生组合式继承?

通过构造函数来继承属性,通过原型链和混成形式来继承方法。

基本模式:


例:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341