js基础面试篇

1,js中的new做了什么?

 
function Person () {
    this.name = name;
    this.age = age;
    this.sex = sex
 
    this.sayName = function () {
        return this.name;
    };
}
 
var person = new Person("tom", 21, "famle");
 
console.log(person.name);

使用关键字new创建新实例对象经过了以下几步:

  1. 创建一个新对象
  2. 将新对象的_proto_指向构造函数的prototype对象
  3. 将构造函数的作用域赋值给新对象 (也就是this指向新对象)
  4. 执行构造函数中的代码(为这个新对象添加属性)
  5. 返回新的对象
var Obj = {};
 
Obj._proto_ =  Person.prototype();
 
Person.call(Obj);

2,JS原型对象

1. 对比其他语言的理解 

原型对象,就是其它语言中的类中的静态属性和静态方法,总是是静态-static就对了.原理是: 内存中只有一份. 

2. 从代码的层次上介绍原型对象. 

function Person(name_, age_) { 
this.name = name_; 
this.age = age_; 
this.location = "地球"; 
} 
// 三个具体的对象 
var zhangsan = new Person("zhangsan", 21); 
var lilei = new Person("lilei", 21); 
var hanmeimei = new Person("hanmeimei", 21); 
// 他们的原型对象是 
Person.prototype.location = "地球"; 
Person.prototype.killPerson = function() { 
return "杀人"; 
}; 

3,原型链查找

当代码获取某个对象的属性时,首先会在对象实例本身内查找,如果查找不到,就会向上搜索其原型对象。因此在实例中改变原型对象中的属性值,并不会重写这个属性值,只是原型对象中的属性值被屏蔽了而已。

4,Javascript闭包

闭包就是能够读取其他函数内部变量的函数

作用:闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

5,js运行机制

所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。

(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。

(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。

(4)主线程不断重复上面的第三步。

https://segmentfault.com/a/1190000015294769

6,js排序

冒泡,选择,快排

7,["1", "2", "3"].map(parseInt)输出结果是多少?(多次出现)

输出结果:[1, NAN, NAN]

原因:

parseInt('1', 0); // 1 (parseInt的处理方式,这个地方item没有以"0x"或者"0X"开始,8和10这个基数由实现环境来定,ES5规定使用10来作为基数,因此这个0相当于传递了10)

parseInt('2', 1); // NaN (因为parseInt的定义,超出了radix的界限)如果该参数小于 2 或者大于 36返回NaN

parseInt('3', 2); // NaN (虽然没有超出界限,但是二进制里面没有3,因此返回NaN)

8,use strict是什么?有什么意义?

1,use strict 是一种在JavaScript代码运行时自动实行更严格解析和错误处理的方法

好处:

1,防止忽略或静默失败的代码错误。会产生错误或抛出异常,因此尽早提醒你代码中的问题,使调试更加容易。

2,防止意外的全局变量。非严格模式下,不带关键字声明的变量,会自动创建该名称的全局变量.在严格模式下,这样做的话会抛出错误。

3,消除 this 强制。如果没有严格模式,引用null或未定义的值到 this 值会自动强制到全局变量。这可能会导致许多令人头痛的问题和让人恨不得拔自己头发的bug。在严格模式下,引用 null或未定义的 this 值会抛出错误。

4,不允许重复的属性名称或参数值。当检测到对象(例如,var object = {foo: "bar", foo: "baz"};)中重复命名的属性,或检测到函数中(例如,function foo(val1, val2, val1){})重复命名的参数时,严格模式会抛出错误,因此捕捉几乎可以肯定是代码中的bug可以避免浪费大量的跟踪时间。

5,使eval() 更安全。在严格模式和非严格模式下,eval() 的行为方式有所不同。最显而易见的是,在严格模式下,变量和声明在 eval() 语句内部的函数不会在包含范围内创建(它们会在非严格模式下的包含范围中被创建,这也是一个常见的问题源)。

6,在 delete使用无效时抛出错误。delete操作符(用于从对象中删除属性)不能用在对象不可配置的属性上。当试图删除一个不可配置的属性时,非严格代码将默默地失败,而严格模式将在这样的情况下抛出异常。

9,json是什么?

1,json一种轻量级的数据交互格式

2,JSON.parse()【从一个字符串中解析出json对象】

3,JSON.stringify()【从一个对象中解析出字符串】

10,js实现延迟加载的几种方法?

1,使用setTimeout延迟方法的加载时间

2,js外部引入的文件放到页面底部

3,defer 属性

4,async 属性

5,动态创建DOM方式

11,创建一个ajax?

<script type="text/javascript">
    window.onload = function(){
        //第一步:创建xhr对象
        //xhr是一个对象;里面可以放很多东西,数据;
        var xhr = null;
        if(window.XMLHttpRequest){//标准浏览器
            xhr = new XMLHttpRequest();//创建一个对象
        }else{//早期的IE浏览器
            xhr = new ActiveXObject('Microsoft.XMLHTTP');//参数是规定的;
        }
        console.log("状态q"+xhr.readyState);//0
        //第二步:准备发送请求-配置发送请求的一些行为
        //open即打开链接,第一个参数是以什么方式;第二个是往哪儿发送请求,第三个可以不写,默认true,表示异步,false表示同步;;
        xhr.open('get','03form.php',true);
        console.log("状态w"+xhr.readyState);//1

        //第三步:执行发送的动作
        //send也可以写在前面,推荐写在后面;写null是兼容问题;
        xhr.send(null);
        console.log("状态e"+xhr.readyState);//1

        //第四步:指定一些回调函数,也属于事件函数;不触发不执行,触发条件是xhr.readyState;z这个值有0-4,共5个状态,是由浏览器控制的;
        xhr.onreadystatechange = function(){
            if(xhr.readyState == 4){//4指服务器返回的数据可以使用;
                if(xhr.status == 200){ //判断已经成功的获取了数据;200表示hTTP请求成功;404表示找不到页面;503表示服务器端有语法错误;
                    var data = xhr.responseText;//json,文本,主角;
                    // var data1 = xhr.responseXML;
                }
            }
            // console.log("状态t"+xhr.readyState);//2表示已经发送完成;

            // console.log(1234);
        }

        // console.log(456);
        console.log("状态r"+xhr.readyState);//1


    }
    </script>

12,apply()与call()的作用和区别?

/*apply()方法*/
function.apply(thisObj[, argArray])

/*call()方法*/
function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);

作用:可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象

区别:

apply:最多只能有两个参数——新this对象和一个数组argArray。如果给该方法传递多个参数,则把参数都写进这个数组里面,当然,即使只有一个参数,也要写进数组里。如果argArray不是一个有效的数组或arguments对象,那么将导致一个TypeError。如果没有提供argArray和thisObj任何一个参数,那么Global对象将被用作thisObj,并且无法被传递任何参数。

call:它可以接受多个参数,第一个参数与apply一样,后面则是一串参数列表。这个方法主要用在js对象各方法相互调用的时候,使当前this实例指针保持一致,或者在特殊情况下需要改变this指针。如果没有提供thisObj参数,那么 Global 对象被用作thisObj。 

13,阻止冒泡的几种方法?

if (evt.stopPropagation) {
//W3C
evt.stopPropagation();
}
else {
//IE
evt.cancelBubble = true;
}

14,Array.of()和Array.from()区别?

1,Array.of方法用于将一组值,转换为数组

2,Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)

15,

let a = Array.of(7)

let b = Array.from({length: 7})

let c = Array(7)

console.log(a)

console.log(b)

console.log(c)

输出结果:?

16,生成0-99的数组方式(不使用for循环一类的)?

Array.from({length:100},(val,i)=>i);

17,判断字符类型方法?

typeof   2      输出   number

typeof   null   输出   object

typeof   {}    输出   object

typeof    []    输出   object

typeof   (function(){})   输出  function

typeof    undefined         输出  undefined

typeof   '222'                 输出    string

typeof  true                   输出     boolean

精准判断:Object.prototype.toString.call

    var   gettype=Object.prototype.toString

        gettype.call('aaaa')       输出      [object String]

        gettype.call(2222)         输出      [object Number]

        gettype.call(true)         输出      [object Boolean]

        gettype.call(undefined)   输出      [object Undefined]

        gettype.call(null)        输出   [object Null]

       gettype.call({})           输出   [object Object]

       gettype.call([])          输出   [object Array]
       gettype.call(function(){})     输出   [object Function]

18,数组的方法?

19,js数据类型?

基本数据类型:

String

Number

Boolean

Undefined

Null

Symbol(暂时不管)

引用数据类型:

JavaScript中的引用数据类型有:

Array

Object

20,校验手机号js?

function isPoneAvailable(str) {
            var myreg=/^[1][3,4,5,7,8,9][0-9]{9}$/;
            if (!myreg.test(str)) {
                return false;
                alert("请填写正确的手机号码")
            } else {
                return true;
                alert("手机号码填写正确")
            }
        }

 

posted @ 2019-02-18 17:24  有什么奇怪  阅读(283)  评论(0编辑  收藏  举报