考察push方法的运行
<script
>
Array
.prototype
.push=function push(value
){
this[this.length
]=value
;
this.length
++;
};
let arr
=[10,20];
arr
.push(30);
let obj
={
2:3,
3:4,
length
:2,
push
:Array
.prototype
.push
}
obj
.push(1);
obj
.push(2);
console
.log(obj
);
obj
={
2:1,
3:2,
length
:4,
push
:Array
.prototype
.push
}
</script
>
数据类型转换 //比较的时候,两边类型不一样,会默认转为一样的,然后再进行比较(隐式转换) //对象字符串:把对象转换为字符串 //null==undefined null/undefined和其他任何值都不相等 //剩下的情况都是转换为数字 //----------- //对象转换为数字,浏览器底层处理如下: // +首先调取对象中[Symbol.toPrimitive]的这个属性(属性值是函数):获取原始值,如果这个函数不存在 // +继续调用对象的valueOf方法,如果也不存在,或者获取的结果并不是原始值(基本类型值) // +则继续调用对象的toString方法,先转换为字符串,再把字符串转换为数字。 let obj={}; console.log(obj[Symbol.toPrimitive]); //undefined let n=10; //字面量方式创建值:基本类型值/原始类型/值类型 let n=new Number(10); //构造函数方式创建值:引用数据类型 console.log(n.valueof()); //10 //基本数据类型值所属类的原型上都有valueof方法,获取其原始值 //Object.prototype.valueOf:此方法获取的结果是引用类型值(不算原始值,原始值一般指的是基本类型值) //Object.prototype.valueOf.call(10) //得到的结果是new Number(10) //数组/正则/函数所属类的原型上都没有valueOf,调用的都是Object.prototype.valueOf //Date.prototype.valueOf:获取日期对象的原始值(距离1970-1-1 00:00:00之间的毫秒差) console.log(new Date()-10); //1599051256501 console.log(({})-10); //NaN console.log(new Number(10)+10); //20 例题:a的值为什么,才会 输出ok
var a
={
value
=0,
[Symbol
.toPrimitive
](hint
){
return ++this.value
;
}
}
if(a
==1&&a
==2&&a
==3){
console
.log('OK');
}
let a
=[1,2,3];
a
.toString
=a
.shift
;
if(a
==1&&a
==2&&a
==3){
console
.log('OK');
}
let i
=0;
Object
.defineProperty(window
,'a',{
get(){
return ++i
;
},
set(){
}
});
if(a
==1&&a
==2&&a
==3){
console
.log('OK');
}
写toArray函数实现数组的输出
<script
>
let utils
=(function (){
function toArray(){
let arr
=[];
for(let i
=0;i
<arguments
.length
;i
++){
arr
.push(arguments
[i
]);
}
return arr
;
return [].slice
.call(arguments
);
}
return {
toArray
};
})();
let ary
=utils
.toArray(10,20,30);
console
.log(ary
);
ary
=utils
.toArray('A',10,20,30);
console
.log(ary
);
</script
>
slice
<script
>
function slice(){
let arr
=[];
for(let i
=0;i
<this.length
;i
++){
arr
.push
[this[i
]];
}
return arr
;
}
let ary
=[10,20,30];
console
.log(ary
.slice());
</script
>
类数组(arguments/NodeList/HTMLCollection/JQ集合…)
<script
>
let obj
={
0:10,
1:20,
2:30,
length
:3
};
Array
.prototype
.forEach
.call(obj
,(item
,index
)=>{
console
.log(item
,index
);
});
console
.log(Array
.from(obj
));
</script
>