介绍js的基本数据类型。哪些是引用类型?
JavaScript有几种类型的值?,你能画一下他们的内存图吗?
栈:原始数据类型(Undefined,Null,Boolean,Number、String) 堆:引用数据类型(对象、数组和函数)
两种类型的区别是:存储位置不同;
原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;
引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体
null,undefined 的区别?
怎么判断是不是数组
怎么把一个类数组对象转化为数组
JavaScript的数据对象有 属性配置的值。
attribute和property的区别是什么?
说说你对作用域链的理解
eval是做什么的?
说说你对闭包的理解?
闭包的应用
function(){}()为什么会出错?function g(){ }()呢?如何修改为IIFE呢?
IIFE的作用?
匿名函数的典型用例
模仿块级作用域
(function(){ \/\/这里是块级作用域 })();
["1", "2", "3"].map(parseInt) 答案是多少?
Object 是 JavaScript 中所有对象的父对象
数据封装类对象:Object、Array、Boolean、Number 和 String 其他对象:Function、Arguments、Math、Date、RegExp、Error
什么是window对象? 什么是document对象?
谈谈This对象的理解。
构造函数的运行机制
在使用new操作符来调用一个构造函数的时候,发生了什么呢?其实很简单,就发生了四件事:
var obj ={};
obj.__proto__ = CO.prototype;
CO.call(obj);
return obj;
第一行,创建一个空对象obj。
第二行,将这个空对象的__proto__成员指向了构造函数对象的prototype成员对象。
第三行,将构造函数的作用域赋给新对象(因此this 就指向了这个新对象)
第四行,返回新对象obj。
call()和apply()和bind()的区别
js实现继承方式及其优缺点
function Sub(){ Super.call(this); }
Child.prototype = new Parent();
那为什么子类的原型为什么要指向父类的实例,为什么不直接等于向父类的原型?
JS 怎么实现一个类。怎么实例化这个类
如何判断一个对象是否属于某个类?
使用instanceof
看该对象的constructor属性
toString()方法 Object.prototype.toString.apply(o);
javascript对象的几种创建方式
1、对象字面量的方式
2、用工厂方式来创建 new Object();再添加属性
3、构造函数(可以无参、有参、加原型,以及有参原型混合)
Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。这意味着,我们可以把那些不变的属性和方法,直接定义在prototype对象上。这时所有实例指向prototype对象(同一个内存地址),因此就提高了运行效率。(我:主要是为了共用一个对象一段内存而提出)
当我们需要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性, 如果没有的话,就会查找他的__proto__指针指向的Prototype对象是否有这个属性,如此递推下去,一直检索到 Object 内建对象。 特点: JavaScript对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变。 函数的原型对象constructor默认指向函数本身,原型对象除了有原型属性外,为了实现继承,还有一个原型链指针proto,该指针指向上一层的原型对象,而上一层的原型对象的结构依然类似,这样利用proto一直指向Object的原型对象上,而Object的原型对象用Object.proto = null表示原型链的最顶端,如此便形成了javascript的原型链继承,同时也解释了为什么所有的javascript对象都具有Object的基本方法真正形成原型链的是每个对象的__proto__属性,而不是函数的prototype属性,这是很重要的。
Array的sort方法工作原理是什么样的?
那如果想要sort排序数字怎么办?
String有哪些方法呀?
那replace方法怎么用的呀?
Javascript中,有一个函数,执行对象查找时,永远不会去查找原型,这个函数是?
如何检查自定义全局变量?
创建一个新的 iframe, 然后将其 contentWindow
中的属性值 与当前 window 中的属性值对比, 不在其中的就是自定义对象
document.write()方法可以用在两个方面:页面载入过程中用实时脚本创建页面内容,以及用延时脚本创建本窗口或新窗口的内容。
document.write只能重绘整个页面。innerHTML可以重绘页面的一部分
举个例子来说吧。
<div><span>内容</span></div>
使用这几个来获取上面div的内容的话,区别如下:
innerHTML:"<span>内容</span>"
,带有html标签
innerText:"内容",不带html标签
outerHTML:"<div><span>内容</span></div>
"
outerText:获取元素跟innterText是一样的。
document.ready和onload的区别
onmousemove和onmouseover的区别:
addEventListener最后一个参数是做什么用的?
什么是冒泡,什么是捕获
所有的事件都可以冒泡么
stopPropagation, preventDefault 和 return false 的区别?
事件是?IE与火狐的事件机制有什么区别? 如何阻止事件冒泡
事件代理与委托
是什么:把事件处理器添加到一个祖先元素上,这样就避免了把事件处理器添加到多个子级元素上。在祖先节点上统一处理,减轻对event listener的管理负担
实现的基础:事件冒泡,当一个元素上的事件被触发的时候,同样的事件将会在那个元素的所有祖先元素中被触发。任何一个事件的目标元素都是最开始的那个元素,并且它在我们的元素对象中以属性的形式出现。使用事件代理,我们可以把事件处理器添加到一个元素上,等待一个事件从它的子级元素里冒泡上来,并且可以得知这个事件是从哪个元素开始的。
应用:table;lazing loading(需要动态添加子节点);一组元素都绑定类似的event listener的时候,就可以考虑使用Event Delegation。
优点:那些需要创建的以及驻留在内存中的事件处理器少了。这是很重要的一点,我们得到了性能上的提升,同时降低了崩溃的风险。在DOM更新后无须重新绑定事件处理器了。如果你的页面是动态生成的,比如说通过Ajax,你不需要再在元素被载入或者卸载的时候来添加或者删除事件处理器了。
function editCell(e)
{
e = e || window.event;
var target = e.target || e.srcElement;
if(target.tagName.toLowerCase() =='td')
{
// DO SOMETHING WITH THE CELL
}
}
鼠标滑过一个元素出现一个弹出层
鼠标滑的快不让他出现怎么办
现在我想要这个元素在页面下方是弹出层在上方显示,元素在上方时弹出层在下方显示?
如果我现在想把他做成一个工具给别人用要怎么做?
那想做一个好的工具参数肯定很多,你怎么能方便别人使用呢?毕竟参数这么多别人会记不住的
如何平铺一张背景图?
如果让图片按比例放大缩小呢?
写一个通用的事件侦听器函数。
// event(事件)工具集,来源:github.com/markyun
markyun.Event = {
// 页面加载完成后
readyEvent : function(fn) {
if (fn==null) {
fn=document;
}
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = fn;
} else {
window.onload = function() {
oldonload();
fn();
};
}
},
// 视能力分别使用dom0||dom2||IE方式 来绑定事件
// 参数: 操作的元素,事件名称 ,事件处理程序
addEvent : function(element, type, handler) {
if (element.addEventListener) {
//事件类型、需要执行的函数、是否捕捉
element.addEventListener(type, handler, false);
} else if (element.attachEvent) {
element.attachEvent('on' + type, function() {
handler.call(element);
});
} else {
element['on' + type] = handler;
}
},
// 移除事件
removeEvent : function(element, type, handler) {
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
} else if (element.datachEvent) {
element.detachEvent('on' + type, handler);
} else {
element['on' + type] = null;
}
},
// 阻止事件 (主要是事件冒泡,因为IE不支持事件捕获)
stopPropagation : function(ev) {
if (ev.stopPropagation) {
ev.stopPropagation();
} else {
ev.cancelBubble = true;
}
},
// 取消事件的默认行为
preventDefault : function(event) {
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
},
// 获取事件目标
getTarget : function(event) {
return event.target || event.srcElement;
},
// 获取event对象的引用,取到事件的所有信息,确保随时能使用event;
getEvent : function(e) {
var ev = e || window.event;
if (!ev) {
var c = this.getEvent.caller;
while (c) {
ev = c.arguments[0];
if (ev && Event == ev.constructor) {
break;
}
c = c.caller;
}
}
return ev;
}
};
Jquery与jQuery UI 有啥区别?
jquery 中如何将数组转化为json字符串,然后再转化回来?
jQuery中没有提供这个功能,所以你需要先编写两个jQuery的扩展:
$.fn.stringifyArray = function(array) {
return JSON.stringify(array)
}
$.fn.parseArray = function(array) {
return JSON.parse(array)
}
然后调用:
$("").stringifyArray(array)
针对 jQuery 的优化方法?
var str=$("a").attr("href");
for (var i = size, length = arr.length; i < length; i++) {}
你觉得jQuery或zepto源码有哪些写的好的地方
jquery源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,然后通过传入window对象参数,可以使window对象作为局部变量使用,好处是当jquery中访问window对象的时候,就不用将作用域链退回到顶层作用域了,从而可以更快的访问window对象。同样,传入undefined参数,可以缩短查找undefined时的作用域链。
(function( window, undefined ) {
//用一个函数域包起来,就是所谓的沙箱
//在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局
//把当前沙箱需要的外部变量通过函数参数引入进来
//只要保证参数对内提供的接口的一致性,你还可以随意替换传进来的这个参数
window.jQuery = window.$ = jQuery;
})( window );
jquery将一些原型属性和方法封装在了jquery.prototype中,为了缩短名称,又赋值给了jquery.fn,这是很形象的写法。
有一些数组或对象的方法经常能使用到,应将它们保存为局部变量以提高访问速度。
将全局对象window作为参数传入,则可以使之在匿名函数内部作为局部变量访问,提供访问速度。
jquery实现的链式调用可以节约代码,所返回的都是同一个对象,可以提高代码效率。
jquery 如何绑定事件?
JQuery一个对象可以同时绑定多个事件,这是如何实现的?
jQuery取到的元素和原生Js取到的元素有什么区别
jQuery的联级有什么好处
如何判断当前脚本运行在浏览器还是node环境中?(阿里)
Node.js的适用场景?
对Node的优点和缺点提出了自己的看法?
"use strict";是什么意思 ? 使用它的好处和坏处分别是什么?
什么是组件?
所谓组件,即封装起来的具有独立功能的UI部件。component , widget , module , plugin ...etc
那些操作会造成内存泄漏?
异步加载和延迟加载
说几条写JavaScript的基本规范?
JSON 的了解?
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小 {"age":"12", "name":"back"}
JSON在string上下文中,它是字符串。
也有JSON对象,它有两个方法,一个是JSON.parse,将字符串解析为对象,一个是JSON.stringfy将对象序列化为JSON字符串。
Javascript垃圾回收方法
以下是数组去重的三种方法:
Array.prototype.unique1 = function () {
var n = []; //一个新的临时数组
for (var i = 0; i < this.length; i++) //遍历当前数组
{
//如果当前数组的第i已经保存进了临时数组,那么跳过,
//否则把当前项push到临时数组里面
if (n.indexOf(this[i]) == -1) n.push(this[i]);
}
return n;
}
Array.prototype.unique2 = function()
{
var n = {},r=[]; //n为hash表,r为临时数组
for(var i = 0; i < this.length; i++) //遍历当前数组
{
if (!n[this[i]]) //如果hash表中没有当前项
{
n[this[i]] = true; //存入hash表
r.push(this[i]); //把当前数组的当前项push到临时数组里面
}
}
return r;
}
Array.prototype.unique3 = function()
{
var n = [this[0]]; //结果数组
for(var i = 1; i < this.length; i++) //从第二项开始遍历
{
//如果当前数组的第i项在当前数组中第一次出现的位置不是i,
//那么表示第i项是重复的,忽略掉。否则存入结果数组
if (this.indexOf(this[i]) == i) n.push(this[i]);
}
return n;
}
Object.prototype.clone = function(){
var o = this instanceof Array ? [] : {};
for(var e in this){
o[e] =this[e] instanceof Object ? this[e].clone() : this[e];
}
return o;
}
假设:一个英文字符占用一个字节,一个中文字符占用两个字节
function GetBytes(str){
var len = str.length;
var bytes = len;
for(var i=0; i<len; i++){
if (str.charCodeAt(i) > 255) bytes++;
}
return bytes;
}
alert(GetBytes("你好,as"));