js原生面试题

一、es6中的箭头函数和普通函数有什么区别?

1、普通函数中的 this总是指向调用它的那个对象,

箭头函数没有自己的this,他的this永远指向其定义环境,任何方法都改变不了其指向,如call()、bind()、apply()。(正是因为它没有this,所以也就不能用作构造函数,也没有原型对象)

箭头函数不能当作构造函数,也就是说,不能使用new命令,否则会报错。

箭头函数没有原型属性。

箭头函数不可以使用yield命令,因此箭头函数不能用作Generator函数。

箭头函数不能使用arguments对象,该对象在函数体内不存在。如果要用,可以用rest参数代替。

变量提升:由于js的内存机制,function的级别最高,而用箭头函数定义函数的时候,需要var(let、const)关键字,而var所定义的变量不能得到变量提升。故箭头函数一定要定义于调用之前。

拓展:this的指向问题?

    1、普通函数中,this指向其函数的直接调用者;

    2、箭头函数中,this指向其定义环境,任何方法都改变不了其指向,如call( )、bind()等;

    3、构造函数中,如果不使用new,则this指向window,

        如果使用new创建了一个实例,则this指向该实例。

  4、window内置函数中,如setInterval,setTimeout等,其内部的this指向Window。

    5、匿名函数的this指向Window。

    6、apply()、call()、bind()可以改变this的指向


二、谈谈你对原型链的认识?

https://blog.csdn.net/xiaotao_css/article/details/72782416:通俗易懂的介绍(仅供18岁以上成年阅读)

看下面的东西之前,建议先看上面链接的这篇文章

    对象: 1 、 函数对象: 由 function 创造出来的函数,比如 function a(){ } ; 系统内置的函数对象: Function , Object , Array , String , Number


                2、 普通对象: 除开函数对象之外的对象,都是普通对象

               每个普通对象的__proto__属性,都指向Object().prototype ,

                var obj = { }  就等于  var obj = new Object ( ) ;  即普通对象是  构造函数( Object ) 的一个实例

                所以  obj. __proto__    ===  Object.prototype  ( 但是老高说的,Object的原型还是object对象, )

                          obj. constructor  ===  Object 

    凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。

    注:所有对象都有 __proto__ 属性只有函数对象才有 prototype 属性 !!!!!!!!!!!

    原型对象: prototype 属性也叫原型对象,主要是为了实现继承;


     指针 __proto__ :  js中,万物皆对象!所有的对象 obj 都具有 proto 属性(null 和 undefined除外 ),而且指向创造obj 对象的函数对象(生成实例的构造函数)的prototype属性 。 如以下例子:


Person 构造函数的原型对象 是 Mother ()。相当于原型是妈妈,Person现在是儿子。

在 p1 和 p2 实例中,__proto__属性,指向的是 创造他们的构造函数Person 对象的 prototype 属性,所对应的对象。

也就是 Mother().

一个构造函数对象的原型,就相当于 他妈,这个构造函数对象的实例,就相当于  他妈不同的孩子。

而 每个 实例中的 __proto__属性,就指向 他们共同的 妈 !也就是 构造函数对象的 prototype属性。

当我们输入 p1.name 的时候,原型链的搜索机制是先在实例中搜索相应的值,找不到就通过它的__proto__指针,在原型中找,还找不到就再往上一级原型中搜索……一直到了原型链的终点( 就是js自带的Object,它的原型比较特殊,为null ),就是到null还没找到的话,就返回一个 undefined。

    构造器constructor : 每一个对象中的constructor 属性返回创建此对象的函数对象的引用;例如:

     functon  Dog ( name, color ) { 

        this. name = name;

        this. color = color;

    }

    var dog1 = new Dog( "小白" , "白色" );

    dog1.constructor == Dog 构造函数本身

在默认情况下,所有的原型对象都会自动获得一个 constructor(构造函数)属性,这个属性(是一个指针)指向 prototype 属性所在的函数(Person)

上面这句话有点拗口,我们「翻译」一下:A 有一个默认的 constructor 属性,这个属性是一个指针,指向 Person。即:

Person.prototype.constructor == Person

实例的构造函数属性(constructor)指向构造函数 :person1.constructor == Person

person1 为什么有 constructor 属性?那是因为 person1 是 Person 的实例。

那 Person.prototype 为什么有 constructor 属性??同理, Person.prototype (你把它想象成 A) 也是Person 的实例。

也就是在 Person 创建的时候,创建了一个它的实例对象并赋值给它的 prototype,基本过程如下:

var A = new Person();

Person.prototype = A;

结论:原型对象(Person.prototype)是 构造函数(Person)的一个实例。

以下代码的图示 

            function Foo ( ) { } ;

var f1 = new Foo;

以下是 深入解答原型是怎么回事 的一篇文章 

1、https://www.jianshu.com/p/dee9f8b14771

2、https://www.jianshu.com/p/652991a67186

3、https://www.jianshu.com/p/a4e1e7b6f4f8    

原型链的概念

如果问原型链是什么,直接把下面的这张图画出来就行了。

https://www.cnblogs.com/shuiyi/p/5305435.html

腾讯大学原生JS 视频 :https://ke.qq.com/course/231577

回答出以下问题,就知道 __proto__和prototype 的什么了

function Person(){   } ;

var person1 = new Person( );

person1.__proto__ 是什么?

Person.__proto__ 是什么?

Person.prototype.__proto__ 是什么?

Object.__proto__ 是什么?

Object.prototype__proto__ 是什么?

答案:

第一题:

因为 person1.__proto__ === person1 的构造函数.prototype

因为 person1的构造函数 === Person

所以person1.__proto__ === Person.prototype

第二题:

因为 Person.__proto__ === Person的构造函数.prototype

因为 Person的构造函数 === Function

所以Person.__proto__ === Function.prototype

第三题:

Person.prototype 是一个普通对象,我们无需关注它有哪些属性,只要记住它是一个普通对象。

因为一个普通对象的构造函数 === Object

所以Person.prototype.__proto__ === Object.prototype

第四题,参照第二题,因为 Person 和 Object 一样都是构造函数

               不要把 Object 想的太复杂,它其实也不过是 Function 构造出来的一个 方法 (一个普通的构造函数)

                所以 Object.__proto__ === Function.prototype

第五题:

Object.prototype 对象也有proto属性,但它比较特殊,为 null 。因为 null 处于原型链的顶端,这个只能记住。

Object.prototype.__proto__ === null

记住:prototype是一个普通对象,所有普通对象的__protp__都指向 Object.prototype

三、js跨域问题怎么解决?

   1、 JSONP跨域请求

    要理解跨域,先要了解一下”同源策略“。所谓同源是指,协议、域名、端口都相同。所谓”同源策略“,简单的说,就是基于安全考虑,当前域不能访问其他域的东西。

http 和 https :协议不同

www.a.com 和www.b.com :域名不同

www.a.com : 8080 和www.a.com : 1000   :   端口不同

在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的。

例如我们在自己的网站通过 ajax 去 获取豆瓣上的图书接口:

https://api.douban.com/v2/book/search?q=javascript&count=1

我们通过以上 ajax 去访问,发现运行时会报错:

只要出现这个错误,就说明服务器接口不支持跨域

//No 'Access-Control-Allow-Origin' header is present on the requested resource

这是因为不同源,所以无法访问其他服务器的数据

但是 的 src ( 获取图片 ) ,   的 href (获取css),

你可能感兴趣的:(js原生面试题)