1对象

1.1定义对象的三种方式?

答:1 、字面量定义。2、new Object定义。3、Object.create 4、构造函数定义。

1.2 调用对象方式?

答:属性:对象名.属性名。对象名['属性名']。方法:对象名.方法名。

1.3  如何遍历对象?

答:

1、for in。循环对象会访问原型链上所有对象属性.

2、Object.keys。  Object.keys(obj1) 返回数组,包括对象所有的可以枚举属性。

Object.keys(obj).forEach(function(key){

     console.log(key,obj[key]);

});

3、使用Object.getOwnPropertyNames(obj)遍历。

返回一个数组,包含对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性).

var obj = {'0':'a','1':'b','2':'c'};
Object.getOwnPropertyNames(obj).forEach(function(key){

    console.log(key,obj[key]);

});

4、Object.getOwnPropertySymbols(obj),返回一个数组,包含对象自身的所有Symbol属性.

1.4 对象的属性和方法?

1、.Object.keys(obj)

功能:获取目标对象上所有可枚举属性组成的数组。

Object只是目标对象上的。但是for in是所有原型链上枚举属性。

1、Object.assign(target,...sources)

2、Object.defineProperty(obj, prop, descriptor)

var obj = {};
Object.defineProperty(obj,'name',{
    writable: true,
    configurable: true,
    enumerable: false,
    value: '张三'
});
var obj = {};

obj.a = 1;
// 等同于:
Object.defineProperty(obj, "a", {
  value: 1,
  writable: true,
  configurable: true,
  enumerable: true
});


// 另外,
Object.defineProperty(obj, "a", { value : 1 });
// 等同于:
Object.defineProperty(obj, "a", {
  value: 1,
  writable: false,
  configurable: false,
  enumerable: false
});


3、Object.getPrototypeOf(obj)
功能:获取指定对象的原型,即目标对象的prototype属性的值。

4、Object.setPrototypeOf(obj, proto)

功能:设置目标对象的原型为另一个对象或null,返回该目标对象。

Object.prototype 对象方法

1.obj.toString(),obj.toLocaleString()
2.obj.valueOf()

功能:返回指定对象的原始值。

  • Array 返回数组对象本身。
  • Boolean 布尔值。
  • Date 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。
  • Function 函数本身。
  • Number 数字值。
  • Object 对象本身。这是默认情况。
  • String 字符串值。
  • Math 和 Error 对象没有 valueOf 方法。

3.4.obj.hasOwnProperty(prop)
功能:返回一个布尔值 ,表示某个对象是否含有指定的属性,而且此属性非原型链继承的。 即使属性的值是 null 或 undefined,只要属性存在,hasOwnProperty 依旧会返回 true。
hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性。如果有,返回true,否则返回false。


3.5 obj.isPrototypeOf(o)

功能:返回一个布尔值,表示指定的对象是否在本对象的原型链中。
https://www.cnblogs.com/elfpower/p/12705219.html

  • 浏览器首先检查,person1 对象是否具有可用的 valueOf() 方法。
  • 如果没有,则浏览器检查 person1 对象的原型对象(即 Person构造函数的prototype属性所指向的对象)是否具有可用的 valueof() 方法。
  • 如果也没有,则浏览器检查 Person() 构造函数的prototype属性所指向的对象的原型对象(即 Object构造函数的prototype属性所指向的对象)是否具有可用的 valueOf() 方法。这里有这个方法,于是该方法被调用。

1.5 js判断对象的属性是原型的还是实例的?

obj.hasOwnProperty(pro) && (pro in obj )
1 1 1 

0 0

0 1 


1.6 复制对象。

 

面试系列构造函数

new

原型

原型链

instanceof

继承

 

面试系列2作用域、执行上下文

当访问一个变量时,解释器会先在当前作用域查找标识符,如果没有找到就去父作用域找,作用域链顶端是全局对象window,如果window都没有这个变量则报错。

当在对象上访问某属性时,首选i会查找当前对象,如果没有就顺着原型链往上找,原型链顶端是null,如果全程都没找到则返一个undefined,而不是报错。


作用域
闭包

 

面试系列3 function

面试系列3 this

函数在调用时,会传入一个隐含参数。

全局环境:this ==全局对象

函数环境:this取决于被调用的方式。
如果要想把 this 的值从一个环境传到另一个,就要用 call 或者apply 方法

 

1、this默认绑定。函数调用时无任何调用前缀的情景。

在非严格模式中:函数声明在哪,在哪调用,由于函数调用时前面并未指定任何对象,这种情况下this指向全局对象window。

在严格模式环境中,默认绑定的this指向undefined。

 

2、this隐式绑定。如果函数调用时,前面存在调用它的对象,那么this就会隐式绑定到这个对象上。
如果函数调用前存在多个对象,this指向距离调用自己最近的对象

 

隐式丢失:最常见的就是作为参数传递以及变量赋值

引起丢失的问题是变量赋值

注意,隐式绑定丢失并不是都会指向全局对象,比如下面的例子:

 

3.this显示绑定
显式绑定是指我们通过call、apply以及bind方法改变this的行为,相比隐式绑定,我们能清楚的感知 this 指向变化过程。来看个例子:

在js中,当我们调用一个函数时,我们习惯称之为函数调用,函数处于一个被动的状态;而call与apply让函数从被动变主动,函数能主动选择自己的上下文,所以这种写法我们又称之为函数应用。

 

call 、apply,bind区别?

1.call、apply与bind都用于改变this绑定。
但call、apply在改变this指向的同时还会执行函数。

而bind在改变this后是返回一个全新的boundFcuntion绑定函数,这也是为什么上方例子中bind后还加了一对括号 ()的原因。
2.bind属于硬绑定,返回的 boundFunction 的 this 指向无法再次通过bind、apply或 call 修改;

call与apply的绑定只适用当前调用,调用完就没了,下次要用还得再次绑。

唯一不同的是call方法传递函数调用形参是以散列形式,而apply方法的形参是一个数组。在传参的情况下,call的性能要高于apply,因为apply在执行时还要多一步解析数组。


4、new绑定:构造调用创建了一个新对象echo,而在函数体内,this将指向新对象echo上

5、this绑定优先级:

显式绑定 > 隐式绑定 > 默认绑定。
new绑定 > 隐式绑定 > 默认绑定。

6、

ES6的箭头函数是另类的存在,为什么要单独说呢,这是因为箭头函数中的this不适用上面介绍的四种绑定规则。

准确来说,箭头函数中没有this,箭头函数的this指向取决于外层作用域中的this,外层作用域或函数的this指向谁,箭头函数中的this便指向谁。

 

posted on 2022-04-05 21:10  程序员草莓  阅读(54)  评论(0编辑  收藏  举报