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便指向谁。