- 数组
- arr.join(“连接符”)
作用:用连接符把数组里面的元素连接成字符串;
注意:arr.join("")能无缝连接,即将数组转化为字符串。
- arr.concat("a","b",arr1)
作用:进行拼接
注意:Ⅰ不会修改原数组,返回新数组。
Ⅱconcat方法中的数组会被打散为单个元素再拼接。
举例:
var arr=['0'];
var arrConcat=arr.concat('1','2',[‘3’,’4’]);
console.log(arr);//输出结果为[‘0’]
console.log(arrConcat);//输出结果为["0", "1", "2", "3","4"]
- arr.slice(start[,end])
作用:从下标start开始截取到end-1
注意:Ⅰend是可选的,若end缺失,表示截取到数组的最后一个元素
Ⅱ支持负数,表示倒数第几个,start永远小于end
Ⅲ不会修改元素组,返回新数组
举例:
var arr=["1","2","3","4","5","6"];
var arrSlice1=arr.slice(0,3);
var arrSlice2=arr.slice(-3,-1);
console.log(arr);//输出结果为["1", "2", "3", "4", "5", "6"]
console.log(arrSlice1);//输出结果为["1", "2", "3"]
console.log(arrSlice2);//输出结果为["4", "5"]
- arr.splice(start,n[,value1,value2...])
作用:从start开始删除插入或替换数组的n个元素
注意: Ⅰstart是必须的,表示操作的开始,n也是必须的,表示操作 的 个数,start可以是负数
Ⅱ原数组会被修改
Ⅲ返回被删除的数组,若n=0,返回数组为[]
举例:
Ⅰ刪除
var arr=["1","2","3","4","5","6"];
var arrSplice1=arr.splice(2,2);
console.log(arr);//输出结果为["1", "2", "5", "6"]
console.log(arrSplice1);//输出结果为["3", "4"]
Ⅱ插入--n=0就可以了
var arr=["1","2","3","4","5","6"];
var arrSplice2=arr.splice(2,0,7,8);
console.log(arr);//输出结果为["1", "2", 7, 8, "3", "4", "5", "6"]
console.log(arrSplice2);//输出结果为[]
Ⅲ替換--刪除后面加上替换的数据
var arr=["1","2","3","4","5","6"];
var arrSplice3=arr.splice(2,3,7,8,9);
console.log(arr);//输出结果为["1", "2", 7, 8, 9, "6"]
console.log(arrSplice3);//输出结果为["3", "4", "5"]
- arr.reverse()
作用:翻转数组
注意:直接修改原数组
举例:
var arr=["1","2","3","4","5"];
Var arrReverse=arr.reverse();
console.log(arr);//输出结果为[ "5", "4", "3", "2", "1"]
console.log(arrReverse);//输出结果为[ "5", "4", "3", "2", "1"]
- arr.sort()
作用:数组排序
注意: Ⅰ直接修改原数组
Ⅱ默认根据数组元素的第一位ASCII码值升序(从小到大)排列
Ⅲ可以使用比较器函数来控制升降序,只限数组中是数字或者数字字符串
升序:arr.sort(function(a,b){return a-b;});
降序:arr.sort(function(a,b){return b-a;});
Ⅳ随机打乱数组,数组可以是任意的类型
arr.sort(function(){return Math.random()>.5 ? 1 : -1;});
举例:无
- arr.indexOf(value[,from])或arr.lastIndexOf(value[,from])
作用:查找value元素在数组中的位置
注意:Ⅰ如果存在就返回数组元素的下标,如果不存在就返回-1
ⅡlastIndexOf是当有多个的时候返回最后一个,indexOf如果有 多个的时候返回的是第一个
举例:
var beasts = ['ant', 'bison', 'camel', 'duck', 'bison'];
console.log(beasts.indexOf('bison'));// 输出为1
console.log(beasts.indexOf('bison', 2));// 输出为4
console.log(beasts.indexOf('giraffe'));// 输出为-1
console.log(beasts.lastIndexOf('bison'));//输出为4
- arr.some(function(value,index,arr){ //do Something})
作用:判断是否有符合的元素,只要遇到符合条件的就退出循环
注意:Ⅰ返回的是boolean值
Ⅱvalue是指每个数组元素值,index是指下标
Ⅲ如果函数中没有return,返回的一定是false
举例:
var arr=["1","2","3","4","5","6"];
var arrSome1=arr.some(function(value,index,arr){
if(value%2){return value}
});
console.log(arrSome1);//输出true
var arrSome2=arr.some(function(value,index,arr){
if(value%2){
console.log(index)//输出0,2,4
}
});
console.log(arrSome2);//输出false
var arrSome3=arr.some(function(value,index,arr){
return value>5});
console.log(arrSome3);//输出true
- arr.every(function(value,index,arr){//do Something})
作用:判断数组元素是否否符合条件
注意:Ⅰ返回的是boolean值
Ⅱ如果函数中没有return,返回的一定是false
举例:
var arr=["1","2","3","4","5","6"];
var arrEvery=arr.every(function(value,index,arr){
return value%2});
console.log(arrEvery);//输出false
- arr.filter(function(value,index,arr){//do Something})
作用:过滤数组,返回符合条件的元素组成的新数组。
注意:Ⅰ不会改变原数组
举例:
var arr=["1","2","3","4","5","6"];
var arrFilter=arr.filter(function(value,index,arr){
return value%2});
console.log(arrFilter);//输出["1", "3", "5"]
console.log(arr);//输出["1", "2", "3", "4", "5", "6"]
- arr.forEach(function(value,index,arr){})
作用:循环数组,没有返回值
注意:无
举例:无
- arr.map(function(value,index,arr){})
作用:循环数组,没有返回值
注意:无
举例:无
- arr.reduce(function(pre,value,index,arr){return pre + value;})
作用:汇总所有数组元素的和
注意:Ⅰpre是指前面所有元素的和
Ⅱ一定要有return
Ⅲ如果是return pre,则只会返回1
举例:
var arr=[1,2,3,4,5,6];
var arrReduce=arr.reduce(function(pre,value,index,arr){
return pre+value});
console.log(arrReduce);//输出21
- String(arr)或arr.toString()
作用:将数组中的元素用逗号连接成字符串,类似于arr.join(",")。
注意:无
举例:无
- arr.unshift(value)
作用:在数组的最开头插入元素。
注意:Ⅰ修改原数组
Ⅱ返回新数组的length
举例:
var arr=[1,2,3,4,5,6];
var arrUnshift=arr.unshift(0);
console.log(arr);//输出[0, 1, 2, 3, 4, 5, 6]
console.log(arrUnshift);//输出7
- arr.shift()
作用:弹出数组最开头的元素
注意:Ⅰ修改原数组
Ⅱ返回被弹出的元素
举例:
var arr=[1,2,3,4,5,6];
var arrShift=arr.shift();
console.log(arr);//输出[2, 3, 4, 5, 6]
console.log(arrShift);//输出1
- arr.push(value1[,value2,arr1])
作用:在数组末尾追加元素
注意:Ⅰ修改原数组。
Ⅱ返回新数组的length
Ⅲ追加进去的数组不会被打散
举例:
var arr=[1,2,3,4,5,6];
var arrPush=arr.push(0,[1,2]);
console.log(arr);//输出[1, 2, 3, 4, 5, 6, 0, [1,2]]
console.log(arrPush);//输出8
- arr.pop()
作用:弹出数组最末尾的元素
注意:Ⅰ修改原数组
Ⅱ返回被弹出的元素
举例:
var arr=[1,2,3,4,5,6];
var arrPop=arr.pop();
console.log(arr);//输出[1, 2, 3, 4, 5]
console.log(arrPop);//输出6
- 数组
- arr.join(“连接符”)
作用:用连接符把数组里面的元素连接成字符串;
注意:arr.join("")能无缝连接,即将数组转化为字符串。
- arr.concat("a","b",arr1)
作用:进行拼接
注意:Ⅰ不会修改原数组,返回新数组。
Ⅱconcat方法中的数组会被打散为单个元素再拼接。
举例:
var arr=['0'];
var arrConcat=arr.concat('1','2',[‘3’,’4’]);
console.log(arr);//输出结果为[‘0’]
console.log(arrConcat);//输出结果为["0", "1", "2", "3","4"]
- arr.slice(start[,end])
作用:从下标start开始截取到end-1
注意:Ⅰend是可选的,若end缺失,表示截取到数组的最后一个元素
Ⅱ支持负数,表示倒数第几个,start永远小于end
Ⅲ不会修改元素组,返回新数组
举例:
var arr=["1","2","3","4","5","6"];
var arrSlice1=arr.slice(0,3);
var arrSlice2=arr.slice(-3,-1);
console.log(arr);//输出结果为["1", "2", "3", "4", "5", "6"]
console.log(arrSlice1);//输出结果为["1", "2", "3"]
console.log(arrSlice2);//输出结果为["4", "5"]
- arr.splice(start,n[,value1,value2...])
作用:从start开始删除插入或替换数组的n个元素
注意: Ⅰstart是必须的,表示操作的开始,n也是必须的,表示操作 的 个数,start可以是负数
Ⅱ原数组会被修改
Ⅲ返回被删除的数组,若n=0,返回数组为[]
举例:
Ⅰ刪除
var arr=["1","2","3","4","5","6"];
var arrSplice1=arr.splice(2,2);
console.log(arr);//输出结果为["1", "2", "5", "6"]
console.log(arrSplice1);//输出结果为["3", "4"]
Ⅱ插入--n=0就可以了
var arr=["1","2","3","4","5","6"];
var arrSplice2=arr.splice(2,0,7,8);
console.log(arr);//输出结果为["1", "2", 7, 8, "3", "4", "5", "6"]
console.log(arrSplice2);//输出结果为[]
Ⅲ替換--刪除后面加上替换的数据
var arr=["1","2","3","4","5","6"];
var arrSplice3=arr.splice(2,3,7,8,9);
console.log(arr);//输出结果为["1", "2", 7, 8, 9, "6"]
console.log(arrSplice3);//输出结果为["3", "4", "5"]
- arr.reverse()
作用:翻转数组
注意:直接修改原数组
举例:
var arr=["1","2","3","4","5"];
Var arrReverse=arr.reverse();
console.log(arr);//输出结果为[ "5", "4", "3", "2", "1"]
console.log(arrReverse);//输出结果为[ "5", "4", "3", "2", "1"]
- arr.sort()
作用:数组排序
注意: Ⅰ直接修改原数组
Ⅱ默认根据数组元素的第一位ASCII码值升序(从小到大)排列
Ⅲ可以使用比较器函数来控制升降序,只限数组中是数字或者数字字符串
升序:arr.sort(function(a,b){return a-b;});
降序:arr.sort(function(a,b){return b-a;});
Ⅳ随机打乱数组,数组可以是任意的类型
arr.sort(function(){return Math.random()>.5 ? 1 : -1;});
举例:无
- arr.indexOf(value[,from])或arr.lastIndexOf(value[,from])
作用:查找value元素在数组中的位置
注意:Ⅰ如果存在就返回数组元素的下标,如果不存在就返回-1
ⅡlastIndexOf是当有多个的时候返回最后一个,indexOf如果有 多个的时候返回的是第一个
举例:
var beasts = ['ant', 'bison', 'camel', 'duck', 'bison'];
console.log(beasts.indexOf('bison'));// 输出为1
console.log(beasts.indexOf('bison', 2));// 输出为4
console.log(beasts.indexOf('giraffe'));// 输出为-1
console.log(beasts.lastIndexOf('bison'));//输出为4
- arr.some(function(value,index,arr){ //do Something})
作用:判断是否有符合的元素,只要遇到符合条件的就退出循环
注意:Ⅰ返回的是boolean值
Ⅱvalue是指每个数组元素值,index是指下标
Ⅲ如果函数中没有return,返回的一定是false
举例:
var arr=["1","2","3","4","5","6"];
var arrSome1=arr.some(function(value,index,arr){
if(value%2){return value}
});
console.log(arrSome1);//输出true
var arrSome2=arr.some(function(value,index,arr){
if(value%2){
console.log(index)//输出0,2,4
}
});
console.log(arrSome2);//输出false
var arrSome3=arr.some(function(value,index,arr){
return value>5});
console.log(arrSome3);//输出true
- arr.every(function(value,index,arr){//do Something})
作用:判断数组元素是否否符合条件
注意:Ⅰ返回的是boolean值
Ⅱ如果函数中没有return,返回的一定是false
举例:
var arr=["1","2","3","4","5","6"];
var arrEvery=arr.every(function(value,index,arr){
return value%2});
console.log(arrEvery);//输出false
- arr.filter(function(value,index,arr){//do Something})
作用:过滤数组,返回符合条件的元素组成的新数组。
注意:Ⅰ不会改变原数组
举例:
var arr=["1","2","3","4","5","6"];
var arrFilter=arr.filter(function(value,index,arr){
return value%2});
console.log(arrFilter);//输出["1", "3", "5"]
console.log(arr);//输出["1", "2", "3", "4", "5", "6"]
- arr.forEach(function(value,index,arr){})
作用:循环数组,没有返回值
注意:无
举例:无
- arr.map(function(value,index,arr){})
作用:循环数组,没有返回值
注意:无
举例:无
- arr.reduce(function(pre,value,index,arr){return pre + value;})
作用:汇总所有数组元素的和
注意:Ⅰpre是指前面所有元素的和
Ⅱ一定要有return
Ⅲ如果是return pre,则只会返回1
举例:
var arr=[1,2,3,4,5,6];
var arrReduce=arr.reduce(function(pre,value,index,arr){
return pre+value});
console.log(arrReduce);//输出21
- String(arr)或arr.toString()
作用:将数组中的元素用逗号连接成字符串,类似于arr.join(",")。
注意:无
举例:无
- arr.unshift(value)
作用:在数组的最开头插入元素。
注意:Ⅰ修改原数组
Ⅱ返回新数组的length
举例:
var arr=[1,2,3,4,5,6];
var arrUnshift=arr.unshift(0);
console.log(arr);//输出[0, 1, 2, 3, 4, 5, 6]
console.log(arrUnshift);//输出7
- arr.shift()
作用:弹出数组最开头的元素
注意:Ⅰ修改原数组
Ⅱ返回被弹出的元素
举例:
var arr=[1,2,3,4,5,6];
var arrShift=arr.shift();
console.log(arr);//输出[2, 3, 4, 5, 6]
console.log(arrShift);//输出1
- arr.push(value1[,value2,arr1])
作用:在数组末尾追加元素
注意:Ⅰ修改原数组。
Ⅱ返回新数组的length
Ⅲ追加进去的数组不会被打散
举例:
var arr=[1,2,3,4,5,6];
var arrPush=arr.push(0,[1,2]);
console.log(arr);//输出[1, 2, 3, 4, 5, 6, 0, [1,2]]
console.log(arrPush);//输出8
- arr.pop()
作用:弹出数组最末尾的元素
注意:Ⅰ修改原数组
Ⅱ返回被弹出的元素
举例:
var arr=[1,2,3,4,5,6];
var arrPop=arr.pop();
console.log(arr);//输出[1, 2, 3, 4, 5]
console.log(arrPop);//输出6
2.对象
- 创建对象的两种方式
Ⅰ:var o = new Object()
Ⅱ:var o = {}; // 推荐,但其实两者没有什么区别
- Object构造器的成员
Object.protoType
注意:该属性是所有对象的原型(包括 Object对象本身),语言中
的其他对象正是通过对该属性上添加东西来实现它们之间的继
承关系的。所以要小心使用。
举例:
var str= new String('ObjectTest');
var strObj={'str':'ObjectTest'};
Object.prototype.custom = 1;
console.log(str);//输出结果如图
console.log(strObj);//输出结果如图
- Object.prototype 的成员
最基础的:
Ⅰ:Object.prototype.constructor
作用:指向用来构造该函数对象的构造器
举例:①Object.prototype.constructor === Object; // true
②var o = new Object();
o.constructor === Object; // true
Ⅱ:Object.prototype.toString(radix)
作用:该方法返回的是一个用于描述目标对象的字符串。
注意:当目标是一个Number对象时,可以传递一个用于进制数的参数radix,该参数radix,该参数的默认值为10(即可以进行数制的转换)。
举例:①var o = {prop:1};
o.toString(); // '[object Object]'
②var n = new Number(255);
n.toString(); // '255'
n.toString(16); // 'ff'
console.log(typeof(n.toString(16)));//string
console.log((parseInt(n.toString(16))));//NaN
console.log(parseInt(n.toString(2)));//11111111
Ⅲ:Object.prototype.toLocaleString()
与toString的功能一样,但是一些对象会做本地化的处理。
另外可以使用navigator.language来了解当前所使用的语言。
Ⅳ:Object.prototype.valueOf()
作用:该方法返回的是用基本类型所表示的this值
注意:如果可以用基本类型表示的话。比如Number对象返回的是它的基 本数值,而Date对象返回的是一个时间戳(timestamp)。如果 无法用基本数据类型表示,该方法会返回this本身。
举例:①var o = {};
console.log(typeof o.valueOf());//object
Console.log(o.valueOf());//{}
console.log(o.valueOf() === o);//true
②var n = new Number(101);
console.log(typeof n);//object
console.log(typeof n.valueOf);//function
console.log(typeof (n.valueOf()));//number
③var d = new Date();
typeof d.valueOf(); // 'number'
d.valueOf(); // 1542009185998
Ⅴ:Object.prototype.hasOwnProperty(prop)
作用:该方法仅在目标属性为对象自身属性时返回true,而当该属性是 从原型链中继承而来或根本不存在时,返回false。
举例:var o = {prop:1};
o.hasOwnProperty('prop'); // true
o.hasOwnProperty('toString'); // false
o.hasOwnProperty('formString'); // false
Ⅵ:Object.prototype.isPrototypeOf(obj)
作用:如果目标对象是当前对象的原型,该方法就会返回true.
注意:并不局限与它的直系关系。
举例:var s = new String('');
Object.prototype.isPrototypeOf(s); // true
String.prototype.isPrototypeOf(s); // true
Array.prototype.isPrototypeOf(s); // false
Ⅶ:Object.prototype.propertyIsEnumerable(prop)
作用:如果目标属性能在for in循环中被显示出来,该方法就返回true
举例:var a = [1,2,3];
a.propertyIsEnumerable('length'); // false
a.propertyIsEnumerable(0); // true
ES5:
Ⅰ:属性描述符
作用:value——当试图获取属性时所返回的值。
writable——该属性是否可写。
enumerable——该属性在for in循环中是否会被枚举
configurable——该属性是否可被删除。
set()——该属性的更新操作所调用的函数。
get()——获取属性值时所调用的函数。
注意:数据描述符(其中属性为:enumerable,configurable,value, writable)与存取描述符(其中属性为enumerable,configurable, set(),get())之间是有互斥关系的。在定义了set()和get()之 后,描述符会认为存取操作已被 定义了,其中再定义value和 writable会引起错误。
举例:①ES3风格
var person = {};
person.legs = 2;
②数据描述符
var person = {};
Object.defineProperty(person, 'legs', {
value: 2,
writable: true,
configurable: true,
enumerable: true
});
console.log(person.legs);//2
③存储描述符--防止别人篡改属性就必须使用存储描述符
var person = {};
Object.defineProperty(person, 'legs', {
set:function(v) {
return this.value = v;
},
get: function(v) {
return this.value;
},
configurable: true,
enumerable: true
});
person.legs = 2;
Ⅱ:Object.defineProperty(obj, prop, descriptor)
Object.defineProperties(obj, props)
作用:定义一个或多个对象
举例:①定义一个见上一条
②var glass = Object.defineProperties({'test':'test'}, {
'color': {
value: 'transparent',
writable: true
},
'fullness': {
value: 'half',
writable: false
}
});
console.log(glass.fullness);//half
console.log(glass.test);//test
Ⅲ:Object.getPrototypeOf(obj)
作用:输出某个对象的原型
注意:Object的原型为null
举例:
Object.getPrototypeOf([]) === Array.prototype; // true
Object.getPrototypeOf(Array.prototype)===Object.prototype; // true
Object.getPrototypeOf(Object.prototype) === null; // true
Ⅳ:Object.create(obj, descr)
作用:该方法主要用于创建一个新对象,并为其设置原型。
举例:
var parent = {hi: 'Hello'};
var o = Object.create(parent, {
prop: {
value: 1
}
});
o.hi; // 'Hello'
// 获得它的原型
Object.getPrototypeOf(parent) === Object.prototype; // true 说明parent的原型是Object.prototype
Object.getPrototypeOf(o); // {hi: "Hello"} // 说明o的原型是{hi: "Hello"}
o.hasOwnProperty('hi'); // false 说明hi是原型上的
o.hasOwnProperty('prop'); // true 说明prop是原型上的自身上的属性。
Ⅴ:Object.getOwnPropertyDesciptor(obj, property)
作用:该方法可以让我们详细查看一个属性的定义。
注意:甚至可以通过它一窥那些内置的,之前不可见的隐藏属性。
举例:
Object.getOwnPropertyDescriptor(Object.prototype, 'toString');
// {writable: true, enumerable: false, configurable: true, value: ƒ toString()}
Ⅵ:Object.getOwnPropertyNames(obj)
作用:该方法返回一个数组,其中包含了当前对象所有属性的名称(字 符串)。
注意:不论它们是否可枚举。当然,也可以用Object.keys()来单独返 回可枚举的属性。
举例:
Object.getOwnPropertyNames(Object);
// ["length", "name", "arguments", "caller", "prototype", "assign", "getOwnPropertyDescriptor", "getOwnPropertyDescriptors", "getOwnPropertyNames", "getOwnPropertySymbols", "is", "preventExtensions", "seal", "create", "defineProperties", "defineProperty", "freeze", "getPrototypeOf", "setPrototypeOf", "isExtensible", "isFrozen", "isSealed", "keys", "entries", "values"]
Ⅶ:Object.preventExtensions(obj)
作用:用于禁止向某一对象添加更多属性。
举例:
var deadline = {};
Object.preventExtensions(deadline);
Object.isExtensible(deadline); // false
Ⅷ:Object.isExtensible(obj)
作用:则用于检查某对象是否还可以被添加属性。
举例:
var deadline = {};
Object.isExtensible(deadline); // true
deadline.date = 'yesterday'; // 'yesterday'
Ⅸ:Object.seal(obj) Object.isSeal(obj)
作用:seal()方法可以让一个对象密封,并返回被密封后的对象。
seal()方法的作用与preventExtensions()基本相同,但除此之外,它还会将现有属性
举例:
var person = {legs:2};
// person === Object.seal(person); // true
Object.isSealed(person); // true
Object.getOwnPropertyDescriptor(person, 'legs');
// {value: 2, writable: true, enumerable: true, configurable: false}
delete person.legs; // false (不可删除,不可配置)
Object.defineProperty(person, 'legs',{value:2});
person.legs; // 2
person.legs = 1;
person.legs; // 1 (可写)
Object.defineProperty(person, "legs", { get: function() { return "legs"; } });
// 抛出TypeError异常
Ⅹ:Object.freeze(obj) Object.isFrozen(obj)
作用:freeze()方法用于执行一切不受seal()方法限制的属性值变更。Object.freeze() 方法可以冻结一个对象
注意:冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。也就是说,这个对象永远是不可变的。该方法返回被冻结的对象。
举例:
var deadline = Object.freeze({date: 'yesterday'});
deadline.date = 'tomorrow';
deadline.excuse = 'lame';
deadline.date; // 'yesterday'
deadline.excuse; // undefined
Object.isSealed(deadline); // true;
Object.isFrozen(deadline); // true
Object.getOwnPropertyDescriptor(deadline, 'date');
// {value: "yesterday", writable: false, enumerable: true, configurable: false} (不可配置,不可写)
Object.keys(deadline); // ['date'] (可枚举)
Ⅺ:Object.keys(obj)
作用:该方法是一种特殊的for-in循环。它只返回当前对象的属性(不像for-in)
注意:而且这些属性也必须是可枚举的(这点和Object.getOwnPropertyNames()不同,不论是否可以枚举)。返回值是一个字符串数组。
举例:
Object.prototype.customProto = 101;
Object.getOwnPropertyNames(Object.prototype);
// [..., "constructor", "toLocaleString", "isPrototypeOf", "customProto"]
Object.keys(Object.prototype); // ['customProto']
var o = {own: 202};
o.customProto; // 101
Object.keys(o); // ['own']
ES6:
Ⅰ:Object.is(value1, value2)
作用:该方法用来比较两个值是否严格相等。它与严格比较运算符(===)的行为基本一致。
注意:一是+0不等于-0,二是NaN等于自身。
举例:
Object.is('xuanyuan', 'xuanyuan'); // true
Object.is({},{}); // false
Object.is(+0, -0); // false
+0 === -0; // true
Object.is(NaN, NaN); // true
NaN === NaN; // false
Ⅱ:Object.assign(target, ...sources)
作用:该方法用来源对象(source)的所有可枚举的属性复制到目标对象(target)
注意:它至少需要两个对象作为参数,第一个参数是目标对象target,后面的参数都是源对象(source)。只有一个参数不是对象,就会抛出TypeError错误
Object.assign只复制自身属性,不可枚举的属性(enumerable为false)和继承的属性不会被复制。
举例:
var target = {a: 1};
var source1 = {b: 2};
var source2 = {c: 3};
obj = Object.assign(target, source1, source2);
target; // {a:1,b:2,c:3}
obj; // {a:1,b:2,c:3}
target === obj; // true
// 如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
var source3 = {a:2,b:3,c:4};
Object.assign(target, source3);
target; // {a:2,b:3,c:4}
Ⅲ:Object.getOwnPropertySymbols(obj)
作用:该方法会返回一个数组,该数组包含了指定对象自身的(非继承的)所有 symbol 属性键。
举例:Object.getOwnPropertySymbols({a: 'b', [Symbol('c')]: 'd'});// [Symbol(c)]
Ⅳ:Object.setPrototypeOf(obj, prototype)
作用:该方法设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 null。
注意:__proto__属性用来读取或设置当前对象的prototype对象。目前,所有浏览器(包括IE11)都部署了这个属性。
举例:
// ES6写法
var obj = {
method: function(){
// code ...
}
};
// obj.__proto__ = someOtherObj;
// ES5写法
var obj = Object.create(someOtherObj);
obj.method = function(){
// code ...
};
ES8:
Ⅰ:Object.getOwnPropertyDescriptors(obj)
作用:它可以用来获取一个对象的所有自身属性的描述符。
注意:
举例:
Object.getOwnPropertyDescriptor(Object.prototype, 'toString');
// {writable: true, enumerable: false, configurable: true, value: ƒ toString()}
Object.getOwnPropertyDescriptors(Object.prototype); // 太长
Ⅱ:Object.values(obj)
作用:返回一个给定对象自己的所有可枚举属性值的数组,值的顺序与使用for...in循环的顺序相同 ( 区别在于for-in循环枚举原型链中的属性 )。
举例:
var obj = {a:1,b:2,c:3};
Object.keys(obj); // ['a','b','c']
Object.values(obj); // [1,2,3]
Ⅲ:Object.entries(obj)
作用:Object.entries() 方法返回一个给定对象自己的可枚举属性[key,value]对的数组,数组中键值对的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致(区别在于一个for-in循环也枚举原型链中的属性)。
举例:
var obj = {a:1,b:2,c:3};
Object.keys(obj); // ['a','b','c']
Object.values(obj); // [1,2,3]
Object.entries(obj); // [['a',1],['b',2],['c',3]]