Skip to the content.

JavaScript


JavaScript的组成

JS的基本数据类型和引用数据类型

检测浏览器版本版本有哪些方式?

介绍JS有哪些内置对象?

说几条写JavaScript的基本规范?

如何编写高性能的JavaScript?

描述浏览器的渲染过程,DOM树和渲染树的区别?

重绘和回流(重排)的区别和关系?

如何最小化重绘(repaint)和回流(reflow)?

script 的位置是否会影响首屏显示时间?

解释JavaScript中的作用域与变量声明提升?

介绍JavaScript的原型,原型链?有什么特点?

JavaScript有几种类型的值?,你能画一下他们的内存图吗

JavaScript如何实现一个类,怎么实例化这个类?

  function Mobile(name, price){
     this.name = name;
     this.price = price;
   }
   Mobile.prototype.sell = function(){
      alert(this.name + ",售价 $" + this.price);
   }
   var iPhone7 = new Mobile("iPhone7", 1000);
   iPhone7.sell();
 var Person = {
     firstname: "Mark",
     lastname: "Yun",
     age: 25,
     introduce: function(){
         alert('I am ' + Person.firstname + ' ' + Person.lastname);
     }
 };

 var person = Object.create(Person);
 person.introduce();

 // Object.create 要求 IE9+,低版本浏览器可以自行部署:
 if (!Object.create) {
    Object.create = function (o) {
    function F() {}
    F.prototype = o;
    return new F();
  };
 }
 var Cat = {
   age: 3, // 共享数据 -- 定义在类对象内,createNew() 外
   createNew: function () {
     var cat = {};
     // var cat = Animal.createNew(); // 继承 Animal 类
     cat.name = "小咪";
     var sound = "喵喵喵"; // 私有属性--定义在 createNew() 内,输出对象外
     cat.makeSound = function () {
       alert(sound);  // 暴露私有属性
     };
     cat.changeAge = function(num){
       Cat.age = num; // 修改共享数据
     };
     return cat; // 输出对象
   }
 };

 var cat = Cat.createNew();
 cat.makeSound();
     class Point {
       constructor(x, y) {
         this.x = x;
         this.y = y;
       }
       toString() {
         return '(' + this.x + ', ' + this.y + ')';
       }
     }

  var point = new Point(2, 3);

Javascript如何实现继承?

```javascript   function Cat(name,color){  Animal.apply(this, arguments);  this.name = name;  this.color = color; }

- 实例继承:将子对象的 prototype 指向父对象的一个实例     
 
```javascript
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;

```javascript    function extend(Child, Parent) {    var p = Parent.prototype;    var c = Child.prototype;    for (var i in p) {     c[i] = p[i];    }    c.uber = p;   }

- 原型继承:将子对象的 prototype 指向父对象的 prototype      

```javascript
    function extend(Child, Parent) {
        var F = function(){};
       F.prototype = Parent.prototype;
       Child.prototype = new F();
       Child.prototype.constructor = Child;
       Child.uber = Parent.prototype;
    }
    class ColorPoint extends Point {
       constructor(x, y, color) {
          super(x, y); // 调用父类的constructor(x, y)
          this.color = color;
       }
       toString() {
          return this.color + ' ' + super.toString(); // 调用父类的toString()
       }
    }

Javascript作用链域?

谈谈this对象的理解

eval是做什么的?

eval的功能是把对应的字符串解析成JS代码并运行

什么是 Window 对象? 什么是 Document 对象?

介绍 DOM 的发展

介绍DOM0,DOM2,DOM3事件处理方式区别

事件的三个阶段

介绍事件“捕获”和“冒泡”执行顺序和事件的执行次数?

在一个DOM上同时绑定两个点击事件:一个用捕获,一个用冒泡。事件会执行几次,先执行冒泡还是捕获?

事件的代理/委托

ulEl.addEventListener('click', function(e){
    var target = event.target || event.srcElement;
    if(!!target && target.nodeName.toUpperCase() === "LI"){
        console.log(target.innerHTML);
    }
}, false);

IE与火狐的事件机制有什么区别? 如何阻止冒泡?

IE的事件处理和W3C的事件处理有哪些区别?

W3C事件的 target 与 currentTarget 的区别?

如何派发事件(dispatchEvent)?(如何进行事件广播?)

var fireEvent = function(element, event){
    if (document.createEventObject){
        var mockEvent = document.createEventObject();
        return element.fireEvent('on' + event, mockEvent)
    }else{
        var mockEvent = document.createEvent('HTMLEvents');
        mockEvent.initEvent(event, true, true);
        return !element.dispatchEvent(mockEvent);
    }
}

什么是函数节流?介绍一下应用场景和原理?

function throttle(method, context) {
     clearTimeout(methor.tId);
     method.tId = setTimeout(function(){
         method.call(context);
     } 100); // 两次调用至少间隔 100ms
}
// 调用
window.onresize = function(){
    throttle(myFunc, window);
}

区分什么是“客户区坐标”、“页面坐标”、“屏幕坐标”?

如何获得一个DOM元素的绝对位置?

分析 [‘1’, ‘2’, ‘3’].map(parseInt) 答案是多少?

parseInt('1', 0);  // 1
parseInt('2', 1);  // NaN
parseInt('3', 2);  // NaN

new 操作符具体干了什么?

用原生JavaScript的实现过什么功能吗?

解释一下这段代码的意思吗?

  [].forEach.call($$("*"), function(el){
      el.style.outline = "1px solid #" + (~~(Math.random()*(1<<24))).toString(16);
  })

** JavaScript实现异步编程的方法?**

web开发中会话跟踪的方法有哪些

介绍js的基本数据类型

介绍js有哪些内置对象?

说几条写JavaScript的基本规范?

JavaScript原型,原型链 ? 有什么特点?

JavaScript有几种类型的值?,你能画一下他们的内存图吗?

Javascript如何实现继承?

 function Parent(){
        this.name = 'wang';
    }

    function Child(){
        this.age = 28;
    }
    Child.prototype = new Parent();//继承了Parent,通过原型

    var demo = new Child();
    alert(demo.age);
    alert(demo.name);//得到被继承的属性
  }

javascript创建对象的几种方式?

javascript创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用JSON;但写法有很多种,也能混合使用

person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
 function Person(){}
    var person=new Person();//定义一个function,如果使用new"实例化",该function可以看作是一个Class
        person.name="Mark";
        person.age="25";
        person.work=function(){
        alert(person.name+" hello...");
    }
person.work();
function Pet(name,age,hobby){
       this.name=name;//this作用域:当前对象
       this.age=age;
       this.hobby=hobby;
       this.eat=function(){
          alert("我叫"+this.name+",我喜欢"+this.hobby+",是个程序员");
       }
    }
    var maidou =new Pet("麦兜",25,"coding");//实例化、创建对象
    maidou.eat();//调用eat方法
var wcDog =new Object();
     wcDog.name="旺财";
     wcDog.age=3;
     wcDog.work=function(){
       alert("我是"+wcDog.name+",汪汪汪......");
     }
     wcDog.work();
function Dog(){

     }
     Dog.prototype.name="旺财";
     Dog.prototype.eat=function(){
     alert(this.name+"是个吃货");
     }
     var wangcai =new Dog();
     wangcai.eat();

 function Car(name,price){
      this.name=name;
      this.price=price; 
    }
     Car.prototype.sell=function(){
       alert("我是"+this.name+",我现在卖"+this.price+"万元");
      }
    var camry =new Car("凯美瑞",27);
    camry.sell(); 

Javascript作用链域?

谈谈This对象的理解

eval是做什么的?

null,undefined 的区别?

写一个通用的事件侦听器函数

 // 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;
        }
    };

[“1”, “2”, “3”].map(parseInt) 答案是多少?

事件是?IE与火狐的事件机制有什么区别? 如何阻止冒泡?

什么是闭包(closure),为什么要用它?

javascript 代码中的”use strict”;是什么意思 ? 使用它区别是什么?

如何判断一个对象是否属于某个类?

// 使用instanceof (待完善)
   if(a instanceof Person){
       alert('yes');
   }

new操作符具体干了什么呢?

var obj  = {};
obj.__proto__ = Base.prototype;
Base.call(obj);

js延迟加载的方式有哪些?

Ajax 是什么? 如何创建一个Ajax?

ajax的全称:Asynchronous Javascript And XML

同步和异步的区别?

异步加载JS的方式有哪些?

documen.write和 innerHTML的区别

DOM操作——怎样添加、移除、移动、复制、创建和查找节点?

那些操作会造成内存泄漏?

渐进增强和优雅降级

Javascript垃圾回收方法

引用计数(reference counting)

在低版本IE中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个 变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减1,当这个值的引用次数变为0的时 候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间

js继承方式及其优缺点

defer和async

用过哪些设计模式?


- 构造函数模式
  - 使用构造函数的方法 ,即解决了重复实例化的问题 ,又解决了对象识别的问题,该模式与工厂模式的不同之处在于
  
- 构造函数方法没有显示的创建对象 (new Object());

- 直接将属性和方法赋值给 this 对象;

- 没有 renturn 语句

**说说你对闭包的理解**

- 使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在js中,函数即闭包,只有函数才会产生作用域的概念

- 闭包有三个特性:
  - 1.函数嵌套函数

  - 2.函数内部可以引用外部的参数和变量

  - 3.参数和变量不会被垃圾回收机制回收
  


**请解释一下 JavaScript 的同源策略**

- 概念:同源策略是客户端脚本(尤其是Javascript)的重要的安全度量标准。它最早出自Netscape Navigator2.0,其目的是防止某个文档或脚本从多个不同源装载。这里的同源策略指的是:协议,域名,端口相同,同源策略是一种安全协议
- 指一段脚本只能读取来自同一来源的窗口和文档的属性

**为什么要有同源限制?**

- 我们举例说明:比如一个黑客程序,他利用Iframe把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
- 缺点
  - 现在网站的JS都会进行压缩,一些文件用了严格模式,而另一些没有。这时这些本来是严格模式的文件,被 merge后,这个串就到了文件的中间,不仅没有指示严格模式,反而在压缩后浪费了字节
  
**实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制**

Object.prototype.clone = function(){

        var o = this.constructor === Array ? [] : {};

        for(var e in this){

                o[e] = typeof this[e] === "object" ? this[e].clone() : this[e];

        }

        return o;
}

**说说严格模式的限制**

  - 严格模式主要有以下限制:

  - 变量必须声明后再使用

  - 函数的参数不能有同名属性,否则报错

  - 不能使用with语句

  - 不能对只读属性赋值,否则报错

  - 不能使用前缀0表示八进制数,否则报错

  - 不能删除不可删除的属性,否则报错

  - 不能删除变量delete prop,会报错,只能删除属性delete global[prop]

  - eval不会在它的外层作用域引入变量

  - eval和arguments不能被重新赋值

  - arguments不会自动反映函数参数的变化

  - 不能使用arguments.callee

  - 不能使用arguments.caller

  - 禁止this指向全局对象

  - 不能使用fn.caller和fn.arguments获取函数调用的堆栈

  - 增加了保留字(比如protected、static和interface)
  
**如何删除一个cookie**

- 将时间设为当前时间往前一点

var date = new Date();

date.setDate(date.getDate() - 1);//真正的删除

setDate()方法用于设置一个月的某一天

- expires的设置

document.cookie = ‘user=’+ encodeURIComponent(‘name’) + ‘;expires = ‘ + new Date(0)



**编写一个方法 求一个字符串的字节长度**

- 假设:一个英文字符占用一个字节,一个中文字符占用两个字节    

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”));


**请解释什么是事件代理**

- 事件代理(Event Delegation),又称之为事件委托。是 JavaScript 中常用绑定事件的常用技巧。顾名思义,“事件代理”即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好处是可以提高性能

**attribute和property的区别是什么?**

- attribute是dom元素在文档中作为html标签拥有的属性;
- property就是dom元素在js中作为对象拥有的属性。

- 对于html的标准属性来说,attribute和property是同步的,是会自动更新的
- 但是对于自定义的属性来说,他们是不同步的

**页面编码和被请求的资源编码如果不一致如何处理?**

 * 后端响应头设置 charset 
 * 前端页面`<meta>`设置 charset
 

**把`<script>`放在`</body>`之前和之后有什么区别?浏览器会如何解析它们?**

 * 按照HTML标准,在`</body>`结束后出现`<script>`或任何元素的开始标签,都是解析错误
 * 虽然不符合HTML标准,但浏览器会自动容错,使实际效果与写在`</body>`之前没有区别
 * 浏览器的容错机制会忽略<script>之前的`</body>`,视作`<script>`仍在 body 体内。省略`</body>`和`</html>`闭合标签符合HTML标准,服务器可以利用这一标准尽可能少输出内容
 
**延迟加载JS的方式有哪些?**

* 设置`<script>`属性 defer="defer" (脚本将在页面完成解析时执行)
* 动态创建 script DOM:document.createElement('script');
* XmlHttpRequest 脚本注入
* 延迟加载工具 LazyLoad

**异步加载JS的方式有哪些?**

* 设置`<script>`属性 async="async" (一旦脚本可用,则会异步执行)
* 动态创建 script DOM:document.createElement('script');
* XmlHttpRequest 脚本注入
* 异步加载库 LABjs
* 模块加载器 Sea.js

**JavaScript 中,调用函数有哪几种方式?**

* 方法调用模式          Foo.foo(arg1, arg2);
* 函数调用模式          foo(arg1, arg2);
* 构造器调用模式        (new Foo())(arg1, arg2);
* call/applay调用模式   Foo.foo.call(that, arg1, arg2);
* bind调用模式          Foo.foo.bind(that)(arg1, arg2)();


**简单实现 Function.bind 函数?**

```javascript
  if (!Function.prototype.bind) {
    Function.prototype.bind = function(that) {
      var func = this, args = arguments;
      return function() {
        return func.apply(that, Array.prototype.slice.call(args, 1));
      }
    }
  }
  // 只支持 bind 阶段的默认参数:
  func.bind(that, arg1, arg2)();

  // 不支持以下调用阶段传入的参数:
  func.bind(that)(arg1, arg2);

** 列举一下JavaScript数组和对象有哪些原生方法?**

Array.splice() 与 Array.splice() 的区别?

JavaScript 对象生命周期的理解?

哪些操作会造成内存泄漏?