备战金三银四,前端面试知识点汇总,建议收藏(2),2024年最新腾讯、阿里Web前端高级面试真题汇总

上面的执行结果是:10 3 error;最后的error是因为a不是个function;

== 与 ===

隐式转换的步骤: 主要搞明白在强等和双等的时候做了什么事情,也就好理解了。

强等(=)会首先比较两边的类型是否相同,如果不同则直接返回false;如果类型相同的话,则是按照来判断的,我们来看下==所引起的隐式转换。

双等号引起的隐式转换

一、首先看双等号前后有没有NaN,如果存在NaN,一律返回false。

二、再看双等号前后有没有布尔,有布尔就将布尔转换为数字。(false是0,true是1)

三、接着看双等号前后有没有字符串, 有三种情况:

1、对方是对象,对象使用toString()或者valueOf()进行转换;

2、对方是数字,字符串转数字;(前面已经举例)

3、对方是字符串,直接比较;

4、其他返回false

四、如果是数字,对方是对象,对象取valueOf()或者toString()进行比较, 其他一律返回false

五、null, undefined不会进行类型转换, 但它们俩相等

.toString()方法和.valueOf()方法数值转换

通常情况下我们认为,将一个对象转换为字符串要调用toString()方法,转换为数字要调用valueOf()方法,但是真正应用的时候并没有这么简单,看如下代码实例:

let obj = {

name: “draven”,

age: 28

}

console.log(obj.toString()); //[object Object]

同理,我们再看valueOf()方法:

let arr = [1, 2, 3];

console.log(arr.valueOf());//[1, 2, 3]

从上面的代码可以看出,valueOf()方法并没有将对象转换为能够反映此对象的一个数字。相反,我们用toString()

let arr = [1, 2, 3];

console.log(arr.toString());//1,2,3

注:很多朋友认为,转换为字符串首先要调用toString()方法, 其实这是错误的认识,我们应该这么理解,调用toString()方法可以转换为字符串,但不一定转换字符串就是首先调用toString()方法。

我们看下下面代码:

let arr = {};

arr.valueOf = function () { return 1; }

arr.toString = function () { return 2; }

console.log(arr == 1);//true

let arr = {};

arr.valueOf = function () { return []; }

arr.toString = function () { return 1; }

console.log(arr == 1);//true

上面代码我们可以看出,转换首先调用的是valueOf(),假如valueOf()不是数值,那就会调用toString进行转换!

let arr = {};

arr.valueOf = function () { return “1”; }

arr.toString = function () { return “2”; }

console.log(arr == “1”);//true

假如"1"是字符串,那么它首先调用的还是valueOf()。

let arr = [2];

console.log(arr + “1”);//21

上面的例子,调用的是toString();因为arr.toString()之后是2。

转换过程是这样的,首先arr会首先调用valueOf()方法,但是数字的此方法是简单继承而来,并没有重写(当然这个重写不是我们实现),返回值是数组对象本身,并不是一个值类型,所以就转而调用toString()方法,于是就实现了转换为字符串的目的。

说明

大多数对象隐式转换为值类型都是首先尝试调用valueOf()方法。但是Date对象是个例外,此对象的valueOf()和toString()方法都经过精心重写,默认是调用toString()方法,比如使用+运算符,如果在其他算数运算环境中,则会转而调用valueOf()方法。

let date = new Date();

console.log(date + “1”); //Sun Apr 17 2014 17:54:48 GMT+0800 (CST)1

console.log(date + 1);//Sun Apr 17 2014 17:54:48 GMT+0800 (CST)1

console.log(date - 1);//1460886888556

console.log(date * 1);//1460886888557

举例巩固提高 下面我们一起来做做下面的题目吧!

let a;

console.dir(0 == false);//true

console.dir(1 == true);//true

console.dir(2 == {valueOf: function(){return 2}});//true

console.dir(a == NaN);//false

console.dir(NaN == NaN);//false

console.dir(8 == undefined);//false

console.dir(1 == undefined);//false

console.dir(2 == {toString: function(){return 2}});//true

console.dir(undefined == null);//true

console.dir(null == 1);//false

console.dir({ toString:function(){ return 1 } , valueOf:function(){ return [] }} == 1);//true

console.dir(1==“1”);//true

console.dir(1===“1”);//false

[] == 0 // true

上面的都可以理解了吗?最后一行代码结果是true的原因是什么?

es6

这部分考查对es6的掌握熟练度,新增的一些类型,语法,等等。推荐大家看一看阮一峰老师的es6的文章

手写实现

js实现bind

// 实现bind

  • 26
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值