js 面试题(1)

一。script 标签:

  async:资源立即下载,异步加载外部资源,确保各资源之间不存在相互依赖的问题,load之前进行加载(h5存在)

  defer:表示脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本文件有效(h4存在)

二。typeof / instanceof 的区别

typeof:用于检测给定变量的数据类型。返回字符串类型的值 undefined、string、number、boolean、object、function。

instanceof:(variable instanceof constructor)判断变量是否是给定引用类型(根据原型链进行判断)的实例,如果是返回true,否则返回false。注:所有引用类型的值都是 Object 的实例

三。其他类型转数字。函数:Number、parseInt、parseFloat

Number:其他类型转换过程中存在非数字则返回NaN(例如:'1a',返回NaN)。反之返回对应数值。null、false、‘’返回0,undefined 返回NaN。

parseInt、parseFloat:是从第一个字符(位置 0)开始解析每个字符。而且 也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。举例来说, "22.34.5"将会被转换为 22.34

四。+号的规则:

(1)如果都是数字则按数字计算。。

(2)如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来

(3)如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接 起来。

(4)如果有一个操作数是对象、数值或布尔值,则调用它们的 toString()方法取得相应的字符串值, 然后再应用前面关于字符串的规则。对于 undefined 和 null,则分别调用 String()函数并取得字符 串"undefined"和"null"。

五。‘==’和‘===’的区别

(1)‘==’ 是指经过类型转换之后进行比较是否相等。null == undefined 返回true。

(2)‘===’ 指不经过类型转换就相等。

(3)对于Object比较的是指针的指向地址是否是同一个地址。

六。垃圾收集:标记清除、引用计数

标记清除:当变量进入环境(例如,在函 数中声明一个变量)时,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其 标记为“离开环境”。垃圾收集器在运行的时候就会清除那些标记为“离开环境”的变量,以达到释放内存。

引用计数:引用计数的含义是跟踪记录每 个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是 1。 如果同一个值又被赋给另一个变量,则该值的引用次数加 1。相反,如果包含对这个值引用的变量又取 得了另外一个值,则这个值的引用次数减 1。当这个值的引用次数变成 0 时,则说明没有办法再访问这 个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾收集器下次再运行时,它就会释放那 些引用次数为零的值所占用的内存。

六。引用类型及常用函数。点击链接

七。new 操作符经历的步骤:

(1) 创建一个新对象;

(2)将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象);

(3) 执行构造函数中的代码(为这个新对象添加属性);

(4)返回新对象。

八。原型、原型对象、原型链。

(1)原型:prototype。

(2)原型对象(prototype属性):每个函数都有一个 prototype(原型)属性,这个属性是一个指针,指向一个对象,指向的对象就是原型对象。

(3)构造函数、原型和实例的关系:构造函数都有一个原型对象、原型对象有指向构造函数的指针、实例拥有指向原型对象的指针。

(4)原型链:指原型对象包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数 的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立,如此层层递进,就构成了实例与原型的链条(原型链)

九。创建对象的有哪几种形式:工厂模式、构造函数模式、原型模式、构造和原型组合模式、动态原型模式、寄生构造函数模式、稳妥构造函数模式

(1)工厂模式:显示创建新对象,然后赋值之后返回改对象。

(2)构造函数模式:必须使用new 操作符。

(3)原型模式(prototype):创建空构造函数,然后通过prototype属性添加属性和方法。缺陷无法通过构造函数传参。

(4)构造和原型组合模式:利用构造函数创建实例属性、利用原型模式创建公用方法。结果,每个实例都会有自己的一份实例属性的副本, 但同时又共享着对方法的引用。使用最广泛

(5)动态原型模式:在组合模式下。通过在构造函数中使用 if 判断动态生成不同的实例属性和方法。注意:不能重写原型

(6)寄生构造函数模式 :除了使用 new 操作符并把使用的包装函数叫做构造函数之外,这个模式跟工厂模式其实 是一模一样的。不能使用instanceof来进行判断(不推荐使用)。

(7)稳妥构造函数模式:与寄生构造函数模式相似,好处是安全性:内部的属性除了内部方法可以访问外,其他方式无法访问。不需要new操作符、新创建的实例不引用this。

十。继承:js本身是没有继承接口的、主要是通过原型链进行继承的。

(1)原型链继承:通过原型链的方式进行继承。缺陷:原先的实例属性如果修改会导致所有的实例都修改;在创建子类型的实例时,不能向超类型的构造函数中传递参数。

(2)借用构造函数:解释1:通过使用 apply()和 call()方法在(将来)新创建的对象上执行构造函数。解释2:通过在子类中使用apply()或call()方法绑定超类。解决了原型链的缺点。缺点:无法避免构造函数模式存在的问题

(3)组合继承:结合原型链继承和借用构造函数两者长处。通过借用构造函数的方式继承实例的属性和方法。通过原型链方式继承原型的属性和方法。

(4)原型式继承:通过Object.create 共享一个对象。必须要有一个对象作为基础。

(5)寄生式继承:与寄生构造函数和工厂模式类似。不需要new操作符、返回新对象。缺点:函数无法复用

(6)寄生组合式继承:结合上面的优点,最完美的继承。缺点:简单的功能是,代码量过大。例:

        

function inheritPrototype(subType, superType){
 var prototype = Object.create(superType.prototype); //创建对象
 prototype.constructor = subType; //增强对象
 subType.prototype = prototype; //指定对象
} 

function SuperType(name){
 this.name = name;
 this.colors = ["red", "blue", "green"];
}

SuperType.prototype.sayName = function(){
 alert(this.name);
};

function SubType(name, age){
 SuperType.call(this, name);

 this.age = age;
}

inheritPrototype(SubType, SuperType);

SubType.prototype.sayAge = function(){
 alert(this.age);
}; 

 

续集:面试(2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值