Object
在使用字面量创建对象时数值属性会自动转换成字符串,比如:
let person={
name:'xiaom',
5:true
}
其中数字5会自动转换成字符串
并且在使用对象字面量表示法定义对象时,不会调用Object构造函数。
调用构造函数和不调用构造函数好像是有区别的,先记一下,查资料后补上
Array
js中的数组每个元素可以是不同类型的值。
let color=new Array(3);//创建长度为3的数组
let names=new Array('Greg');//创建['Greg']
在使用数组字面量创建数组不会调用Array构造函数。
es6新增的Array.from()可以将任何类数组对象(有length属性)转换为数组,例如
console.log(Array.from('Matt'));//['M','a','t','t']
Array.from()对现有数组执行浅复制,例如:
const a1=[1,2,3,4];
const a2=Array.from('a1');
console.log(a1===a2);//false
这里又涉及到两个数组如何判断相等;一般而言,js中两个数组地址相同才相等,也就是说:
let a=[1,2,3,4];
let b=[1,2,3,4];
a===b;//false
let c=a;
a===c;//true
但是我们判断的时候只是想比较数组中的内容是否一样,这时候我们可以将数组转换为字符串比较,如
let a=[1,2,3,4];
let b=[1,2,3,4];
a.toString()===b.toString();//true
但这个方法并不适用于拥有对象元素的数组,即[{age:10},1]类似的形式,对象数组的比较方式如下(也适用普通数组):
let a=[{name:'wang'}];
let b=[{name:'li'}];
JSON.stringify(a)===JSON.stringify(b);//true
这里又联想到JSON.stringify的实现原理了,找一下源码(备注),typeof与instanceof的区别
Array.from()还可以接收第二个参数,第二个参数是个函数,可以对数组中的每个元素进行处理,如:
let a=[1,2,3,4]
Array.from(a,x=>x**2);//[1,4,9,16]
Array.of()可以把一组参数转换为数组(Array.from()是把类数组结构转换为数组,两者不一样),如:
Array.of(1,2,3,4);//[1,2,3,4]
Array.of(undefined);//[undefined]
数组的length属性可读可改,比如:
let a=['a'];
console.log(a.length);//1
a.length=2;
console.log(a);//['a',undefined]
可以利用length属性向数组末尾添加元素,如:
let a=['a','b'];
a[a.length]='c';
console.log(a);//['a','b','c']
注:数组最多可包含 4 294 967 295个元素